Ваша функция или программа должны взять год в качестве ввода и вернуть (или распечатать) дату (в григорианском календаре) тех лет Пасхи (а не Восточной православной Пасхи). Возвращенная дата должна быть отформатирована в соответствии с ISO 8601, но с поддержкой для лет, превышающих 9999 (например, 312013-04-05 или 20010130 ), и она должна работать только с годами, большими или равными 1583 (год принятие григорианского календаря), а годы меньше или равны 5701583 (как, например, когда последовательность дат Пасхи начинает повторяться).
Примеры:
e(5701583) = 5701583-04-10
e(2013) = 2013-03-31
e(1583) = 1583-04-10
e(3029) = 30290322
e(1789) = 17890412
e(1725) = 17250401
Использование встроенных функций для возврата даты Пасхи скучно и поэтому запрещено. Самый короткий ответ (в символах) выигрывает.
Ресурсы:
Ответы:
GolfScript (85 символов)
Пример использования:
Обратите внимание, что он использует другой алгоритм для большинства текущих ответов. Чтобы быть точным, я адаптировал алгоритм, приписываемый Лихтенбергу в ресурсе, связанном Шоном Чеширом в комментарии к вопросу.
Исходный алгоритм, предполагающий разумные типы (т.е. не числа JavaScript) и с адаптацией, чтобы дать месяц * 31 + день (используя смещение дня 0)
Я извлек общее подвыражение и сделал некоторые другие оптимизации, чтобы уменьшить
У этого подхода немного больше арифметических операций, чем у другого (20-операционный алгоритм Ала Петрофски), но он имеет меньшие константы; GolfScript не нужно беспокоиться о лишних скобках, потому что он основан на стеке, и поскольку каждое промежуточное значение в моем оптимизированном макете используется точно дважды, это прекрасно согласуется с ограничением GolfScript легкого доступа к верхним трем элементам в стеке.
источник
Python 2 -
125120119 символовЭто ответ Форса, бесстыдно перенесенный на Python.
Изменить : Изменена последняя строка,
print"%d-0%d-%02d"%(y,b/31,b%31+1)
чтобы сохранить 5 символов. Я хотел бы представлять10000
как1e4
, но это привело бы к плавающей запятой, требующей вызоваint
.Edit2 : Спасибо Peter Taylor за то, что показали, как избавиться от этого
10000
и сохранить 1 персонаж.источник
10000
,100*100
вы можете поместить последнюю строку в форму Хорнера как(y*100+b/31)*100+b%31+1
. Начальная скобка позволяет вам удалить пробел послеprint
, и вы можете вытащить три экземпляра100
переменной в общую экономию 1 символа.e(y)
и сохранить несколько байтовPHP 154
150 символов, если я переключусь на ГГГГММДД вместо ГГГГ-ММ-ДД.
С переносами строк:
Использование:
php easter.php 1997
Выход:
1997-03-30
Использование:
php easter.php 2001
Выход:
2001-04-15
источник
<?=$y=$argv[1],"-0",3+$m=($d=56-($c=($y%19*351-~(($a=$y/100|0)*29.32+($b=$a>>2)+13.54)*31.9)/33%29)-~($a-$b+$c-24-$y/.8)%7)>>5,31*$m-$d;
1725-04-1
вместо1725-04-01
.DC: 106 символов
Использование:
Это должно быть в состоянии быть сокращено, используя 'd' и 'r' вместо всех загрузок и хранилищ.
источник
C:
151148 символовИ тот же код, но лучше отформатированный:
Существует ужасно много алгоритмов для вычисления даты Пасхи, но только некоторые из них хорошо подходят для игры в гольф кода.
источник
Javascript
162156145Вдохновленный решением PHP @ jdstankosky ... Предоставляет результат ГГГГММДД ...
Теперь сужается до:
Теперь запрашивает ввод ... уменьшил буквенную строку от "0" до 0 и позволил свободному вводу работать в мою пользу! :)
Снизить дальше, чтобы принять во внимание ES6 ...
e=y=>y+"0"+((d=56-(c=(y%19*351-31.9*~((b=(a=y/100|0)>>2)+29.32*a+13.54))/33%29|0)-~(a-b+c-24-y/.8)%7)>(f=31)?4:3)+(d-f>0&d-f<10?0:"")+(d>f?d-f:d)
источник
APL 132
Этот алгоритм вычисляет количество дней, в течение которых Пасха находится относительно начала марта. Дата возвращается в формате ГГГГММДД, как это разрешено в вопросе:
Взятие оригинальных тестовых случаев:
источник
Фортран (GFortran) , 179 байтов
Попробуйте онлайн!
Использует алгоритм «Исправленная григорианская пасха» (Аль Петрофски) из ссылки на второй ресурс. Как ни странно, он проваливается на 5701583 год (и, видимо, только на этот год), предсказывая Пасху на неделю раньше. Печатает дату в
YYYYYYYMMDD
формате с некоторыми начальными пробелами, если год содержит менее семи цифр.источник