задача
Напишите программу или функцию, которая вычисляет название дня недели для даты, которую вводит пользователь.
Ввод, вывод
Ввод - это строка YYYYMMDD
.
Пример входных значений:
20110617: 17 июня 2011 19040229: 29 февраля 1904 г. 06661225: 25 декабря 666 00000101: 1 января, 0 99991231: 31 декабря 9999
Вы можете предположить, что все данные верны. Обратите внимание, что нулевой год действителен.
Выход - это целое число между 0
и 6
. Каждое целое число представляет название дня недели. Вы можете свободно выбирать, какое целое число представляет название дня недели, например, это
0: понедельник 1: вторник 2: среда ... 6: воскресенье
(по порядку) или этот
0: понедельник 1: среда 2: воскресенье ... 6: суббота
(не в порядке).
Тестовые случаи
Input Выходной день недели (в этом примере используется [0..6 -> Monday..Sunday].) 20110617 пятница 4 19500101, воскресенье 6 22220202 суббота 5 19000228 среда 2 19000301 четверг 3 19450815 среда 2 19040229 Понедельник 0 19040301 вторник 1 17760704 четверг 3 20000228 Понедельник 0 20000229 вторник 1 20000301 среда 2 20121223 воскресенье 6 00000401 суббота 5 66660606 среда 2 59161021 суббота 5
ограничение
Вы не должны использовать какую- либо функцию / класс / ..., связанную с отметкой времени или датой, например, Date
класс в Java
/ JavaScript
/ ActionScript
или getdate
функцию в PHP
.
Вы должны использовать григорианский календарь , который используется многими людьми сейчас.
Конечно, выигрывает самый короткий код. Если два кода имеют одинаковую длину, то выигрывает код с наибольшим количеством голосов.
(Должно быть: когда есть более 5 кодов, у которых больше (или равно) +1
голосов.)
echo 4
.Ответы:
Рубин,
9592 персонажаПростая прямая реализация ruby с 0: понедельник, ...
источник
PHP -
10197103125 символовКод
Заметка
К сожалению, из-за динамической слабой типизации PHP алгоритм Sakamoto не работает должным образом без явного указания каждой операции деления.
источник
y+y/4-y/100+y/400
.y=4
в этом случае возвращается 4 вместо правильных 5 отy+y/4+y/100+y/400
(где вступают в игру только первые два слагаемых). Это то, что мучает мой ответ JavaScript. Возможно ли, что двойники создаются вместо целых? (Мой PHP слишком слаб, чтобы знать.)С - 129
Это злоупотребляет тем, как деление округляется до нуля, по крайней мере, в моей системе (Linux x86).
Магическая константа
86400
, служит двум целям:Так же бывает и количество секунд в дне.
источник
y+=m>2;
вместоm>2?y++:0;
и сбрейте несколько байтов.Javascript,
126123 символовИспользуя алгоритм Сакамото с 0 = воскресенье:
Я подозреваю, что разделение может быть разрушено, но сейчас я этого не вижу.
Редактировать: Улучшено деление (нет необходимости,
~~
когда вы можете просто~
).источник
Python 2 ,
83116113109 байтРеализует алгоритм Сакамото . Предложения по игре в гольф приветствуются. Попробуйте онлайн!
Изменить:
я должен был исправить это давным-давно.-6 байт из предложений Джонатана Аллана +2 байта для фактического исправления кода.источник
int('032503514624'[m-1])
спасает 6Perl - 110 байт
Вот решение для запуска с помощью perl -p source.pl ИЛИ perl -pe 'here-is-code'.
Просто скопируйте и вставьте контрольные примеры в стандартный ввод.
Кажется, это единственный код без переменных, строковых констант и делений.
источник
JavaScript (ES6), 73 байта (не конкурирует)
Попытайся
источник