viernes supersticiones significado que mito memes martes letra historia hacer debe algorithm language-agnostic datetime

algorithm - supersticiones - Cálculo de ocurrencias futuras del viernes 13



viernes 13 significado (6)

Me gustaría poder comenzar con un año y calcular las ocurrencias del viernes 13. Una solución de fuerza bruta es fácil y obvia. Tengo algo un poco mejor, pero no tengo dudas de que alguien más puede proponer un algoritmo elegante para esto.

Tal vez un poco más complicado, me gustaría darle un mes al programa, y ​​que encuentre el próximo año en el que ese mes tenga un viernes 13.

Siéntase libre de usar un pseudo código, pero espero que las personas voten más por las muestras de código de trabajo en su idioma favorito.


Así es como lo haría:

  • Supongamos que el año es conocido y es un número entero.

  • Loop de 1 a 12

    • Crear fecha con índice de ciclo, año y 13 para el día

      • Determine el día de la semana según los algoritmos establecidos

      • Si el día de la semana calculado arriba es el viernes, haga su trabajo

Si desea comenzar con un mes y año (debe suponer algún tipo de año), su algoritmo se convierte en

  • Suponer que el año es conocido y un número entero

  • Suponer que el mes es conocido y es un número entero

  • Lazo

    • Crear fecha con índice de ciclo como año, variable de mes conocida y 13 para el día

    • Determine el día de la semana según los algoritmos establecidos

    • Si el día de la semana calcula arriba, es viernes, fecha de regreso, sino

    • Otro año de incremento por 1


Dado que su algoritmo de fuerza bruta es aparentemente la opción de iteración diaria intuitiva, tal vez no ha considerado el algoritmo del fin del mundo . Te permitiría simplemente verificar si ese día 13 es un viernes. Hasta donde yo sé, es la solución más eficiente para el problema.


Una cosa que noté es que el primer día del mes cae un domingo durante meses con un viernes 13. Probablemente pueda aprovechar esto para que sea más fácil de calcular.


Aquí hay un ejemplo de código PHP que atraviesa un bucle bastante directo de las fechas en un rango. Me gustaría modificar esto para verificar el día 13 de cada mes para el viernes, en lugar de revisar todos los viernes para saber si hay 13, como lo hacen en el ejemplo.


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;


Cualquier mes que comience con un domingo tiene un viernes a los trece. Solo hay 14 combinaciones posibles, sabiendo qué día está el primero del año (con o sin año bisiesto, y sun-sat). Deberías calcularlo una vez y terminarlo de nuevo. Solo verificaría 14 * 12 meses posibles para comenzar, bien con justificación.

elemento de tabla resultante (de 2009, 2010):

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

para llenar la tabla tiene un mes genérico Ene (31), Feb (28) .. y luego iterar con una semilla de cada día de la semana, señalando los meses que comienzan con el domingo y también con un año bisiesto y sin él. Muy sencillo, y una vez hecho, puedes compartirlo con nosotros :)