Расчет будущих событий пятницы 13-го - PullRequest
7 голосов
/ 13 февраля 2009

Я хотел бы иметь возможность начать с года и рассчитать события пятницы 13-го. Решение грубой силы простое и очевидное. У меня есть кое-что получше, но я не сомневаюсь, что кто-то другой может придумать элегантный алгоритм для этого.

Возможно, немного хитрее, мне было бы интересно дать программе месяц, и пусть она найдет следующий год, в котором у этого месяца пятница, 13-е.

Не стесняйтесь использовать псевдокод, но я ожидаю, что люди будут больше голосовать за образцы рабочего кода на вашем любимом языке.

Ответы [ 6 ]

10 голосов
/ 13 февраля 2009

Любой месяц, который начинается с воскресенья, имеет пятницу тринадцатого. Возможны только 14 комбинаций, зная, в какой день наступает первое число года (с високосным годом или без него, а также с солнцем). Вы должны просто рассчитать это один раз и покончить с этим. Вы можете проверить только 14 * 12 возможных месяцев, с разумом.

элемент таблицы результатов (с 2009, 2010):

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

чтобы заполнить таблицу, у вас есть общий месяц январь (31), февраль (28) ... и затем итерируйте с семенем каждого дня недели, отмечая месяцы, начинающиеся с воскресенья, а также високосный год без. Довольно прямо, и когда вы закончите, вы можете поделиться им с нами:)

10 голосов
/ 13 февраля 2009

Поскольку ваш алгоритм грубой силы, по-видимому, является интуитивно понятным вариантом ежедневной итерации, возможно, вы не рассматривали алгоритм Судного дня . Это позволит вам просто проверить, является ли 13-е число пятницей. Насколько я знаю, это наиболее эффективное решение проблемы.

3 голосов
/ 13 февраля 2009

Вот пример PHP-кода , который проходит через довольно простой цикл дат в диапазоне. Я бы изменил это, чтобы проверять 13-е число каждого месяца на пятничность, а не проверять каждую пятницу на 13-е, как это делается в примере.

2 голосов
/ 13 февраля 2009

Одна вещь, которую я заметил, состоит в том, что первое число приходится на воскресенье в месяцы с пятницы на 13-е. Вероятно, вы можете использовать это, чтобы упростить расчет.

1 голос
/ 13 февраля 2009

Вот как бы я это сделал:

  • Предположим, год известен и является целым числом.

  • Петля от 1 до 12

    • Создание даты с индексом цикла, годом и 13 для дня

Если вы хотите начать с месяца и года (вы должны предположить какой-то год), ваш алгоритм будет

  • Предположим, год известен и является целым числом

  • Предположим, что месяц известен и является целым числом

  • Loop

    • Создание даты с индексом цикла в виде года, известной переменной месяца и 13 для дня

    • Определите день недели согласно установленным алгоритмам

    • Если рассчитанный выше день недели - пятница, возвращаемая дата, иначе

    • Другой год приращения на 1

1 голос
/ 13 февраля 2009
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;
...