2009-02-13 7 views
6

Je voudrais pouvoir commencer avec une année et calculer les occurrences du vendredi 13. Une solution de force brute est facile et évidente. J'ai quelque chose de légèrement mieux, mais je n'ai aucun doute que quelqu'un d'autre peut trouver un algorithme élégant pour cela. Peut-être un peu plus compliqué, je serais intéressé à donner le programme un mois, et qu'il trouve l'année suivante dans laquelle ce mois a un vendredi 13. N'hésitez pas à utiliser le pseudo code, mais je m'attends à ce que les gens votent plus pour les échantillons de code de travail dans votre langue préférée.Calcul des occurrences futures du vendredi 13e

+1

Happy 1234567890 unix jour de l'heure! –

+0

Peut-être que ça peut être un beau défi de golf ... – Eineki

+1

Les films sortent assez régulièrement maintenant, une estimation d'environ 3 ans sonne à peu près juste :) – cjk

Répondre

10

Tout mois qui commence par un dimanche a un vendredi le treizième. Il n'y a que 14 combinaisons possibles sachant quel jour est le premier de l'année (avec ou sans année bissextile, et sun-sam). Vous devriez juste le calculer une fois et en finir avec. Vous ne vérifiez que 14 * 12 mois possibles pour commencer, bien avec avec raison.

élément de table résultant (à partir de 2009, 2010):

[Thursday,false] => Feb, March, Nov 
[Friday,false] => Aug 

pour remplir le tableau que vous avez un mois générique Jan (31), février (28) .. puis itérer avec une graine de chaque jour de la semaine, en notant les mois qui commencent avec dimanche, et aussi avec une année bissextile et sans. Assez simple, et une fois fait, vous pouvez le partager avec nous :)

+2

C'est la méthode de table la plus rapide, afaict. Il y a quatorze types de jours de semaine - 7 pour les années non bissextiles, 7 pour les années bissextiles et 12 mois. Un tableau 2D ou 3D fournit une réponse très rapide une fois que vous savez quel jour de la semaine le 1er janvier tombe, et si c'est une année bissextile - les deux sont faciles à calculer. –

1
initialize startDate to 13th of the month given in the current year 
while (true) { 
    if (startDate.dayOfWeek == Date.FRIDAY) 
     break; 
    else 
     startDate.year ++; 
} 
return startDate.year; 
10

Depuis votre algorithme de force brute est apparemment intuitive option de jour par jour itération, peut-être vous n'avez pas considéré comme le Doomsday Algorithm. Cela vous permettrait de vérifier simplement si le 13 est un vendredi. Pour autant que je sache, c'est la solution la plus efficace au problème.

2

Une chose que j'ai remarquée est que le premier du mois tombe un dimanche pendant les mois avec un vendredi 13ème. Vous pouvez probablement tirer parti de cela pour le rendre plus facile à calculer.

1

Voilà comment je le ferais:

  • On suppose l'année est connue et est un entier.

  • boucle de 1 à 12

    • Créer jour avec l'index de la boucle, l'année et 13 pour la journée

      • Déterminer jour de la semaine comme par established algorithms

      • Si le jour de la semaine calculée ci-dessus est le vendredi, faites votre travail

Si vous voulez commencer par un mois et l'année (vous devez assumer une sorte de l'année), votre algorithme devient

  • On suppose l'année est connu et un entier

  • on suppose mois est connu et est un entier

  • boucle

    • Créer une date avec l'index de la boucle en année, variable mois connu, et 13 pour la journée

    • Déterminer jour de la semaine selon established algorithms

    • Si le jour de calculate la semaine ci-dessus est le vendredi, date de retour, sinon

    • Année incrément Else 1

3

Here's some example PHP code qui passe par une boucle assez directe des dates dans une plage. Je voudrais modifier cela pour vérifier le 13 de chaque mois pour le vendredi, plutôt que de vérifier tous les vendredis pour 13thness, comme ils le font dans l'exemple.

+1

Vérification le 13 de chaque mois est certainement le meilleur moyen d'y aller. –

+2

Ouais, semblait 4X plus efficace pour moi. :) –