(Вдохновленный Riddler на прошлой неделе на FiveThirtyEight.com. Песочница сообщение .)
Учитывая год между 2001 и 2099 годами, вычислите и верните число дней в этом календарном году, где mm * dd = yy
(где yy
это год из двух цифр ).
2018, например, имеет 5:
- 18 января (1 * 18 = 18)
- 9 февраля (2 * 9 = 18)
- 6 марта (3 * 6 = 18)
- 3 июня (6 * 3 = 18)
- 2 сентября (9 * 2 = 18)
Ввод может быть 2 или 4-значным числовым годом.
Вывод должен быть целым числом. Дополнительное место в конце или возврат в порядке.
Полный список ввода / вывода:
Input = Output
2001 = 1 2021 = 3 2041 = 0 2061 = 0 2081 = 2
2002 = 2 2022 = 3 2042 = 4 2062 = 0 2082 = 0
2003 = 2 2023 = 1 2043 = 0 2063 = 3 2083 = 0
2004 = 3 2024 = 7 2044 = 3 2064 = 2 2084 = 5
2005 = 2 2025 = 2 2045 = 3 2065 = 1 2085 = 1
2006 = 4 2026 = 2 2046 = 1 2066 = 3 2086 = 0
2007 = 2 2027 = 3 2047 = 0 2067 = 0 2087 = 1
2008 = 4 2028 = 4 2048 = 6 2068 = 1 2088 = 3
2009 = 3 2029 = 1 2049 = 1 2069 = 1 2089 = 0
2010 = 4 2030 = 6 2050 = 3 2070 = 3 2090 = 5
2011 = 2 2031 = 1 2051 = 1 2071 = 0 2091 = 1
2012 = 6 2032 = 3 2052 = 2 2072 = 6 2092 = 1
2013 = 1 2033 = 2 2053 = 0 2073 = 0 2093 = 1
2014 = 3 2034 = 1 2054 = 4 2074 = 0 2094 = 0
2015 = 3 2035 = 2 2055 = 2 2075 = 2 2095 = 1
2016 = 4 2036 = 6 2056 = 4 2076 = 1 2096 = 4
2017 = 1 2037 = 0 2057 = 1 2077 = 2 2097 = 0
2018 = 5 2038 = 1 2058 = 0 2078 = 2 2098 = 1
2019 = 1 2039 = 1 2059 = 0 2079 = 0 2099 = 2
2020 = 5 2040 = 5 2060 = 6 2080 = 4
Это испытание для игры в гольф , выигрывает наименьшее количество байтов на каждом языке.
Предварительный расчет и простой поиск ответов обычно исключаются в соответствии с нашими правилами лазейки , но я явно разрешаю это для этой задачи. Это позволяет для некоторых интересных альтернативных стратегий, хотя его не вероятно, 98 99-элемента списка поиска будет коротким.
Ответы:
Excel, 48 байт
Ура! Наконец-то Excel действительно хорош.
Принимает входные данные от A1 в виде целого числа 1-99, представляющего год, и выводит туда, где вы вводите эту формулу. Это формула массива, поэтому используйте Ctrl-Shift-Enter вместо Enter, чтобы ввести ее.
При этом используется тот факт, что
COUNT
ошибки игнорируются, поэтому любые ошибки, вызванные либо месяцем, не делящим год (приводят к тому, что Excel анализирует что-то вроде2/12.5/25
либо датой, которая недействительна, например2/29/58
, просто игнорируются.источник
A1
. Ввод 4-значного года просто возвращает0
.Python 2 , 44 байта
Попробуйте онлайн!
Анонимная функция, заданная как объект метода. Производит все продукты
(month, day)
пара ,(m, d)
как кодируютсяk=32*m+d
с0≤m≤12
,0≤d≤31
и упаковкой вокруг. Исключает 29-31 февраля, исключая их из диапазона.источник
Ява (JDK 10) , 65 байт
Попробуйте онлайн!
кредиты
источник
29*n
, поэтому не нужно проверять(m==2?29:32)
на29+m%2*3
все еще, кажется, дает всеOK
результаты. Кредит @AsoneTuhid рубинового ответ «s .PowerShell , 94 байта
Попробуйте онлайн!
Принимает ввод в виде двузначного года, затем строит
for
цикл из1/1/year
в12/9/year
(потому что 12/10 и далее никогда не будут учитываться, и это сохранит байт). Каждую итерацию мы увеличиваем,$z
если.Month
время.Day
равно нашему входному году. Вне петли,$z
остается на конвейере и вывод неявный.Редактировать - это зависит от культуры. Приведенный выше код работает для
en-us
. Формат даты может потребоваться изменить для других культур.источник
Рубин ,
4642 байтаПопробуйте онлайн!
источник
JavaScript (Node.js) ,
484443 байтаПопробуйте онлайн!
JavaScript (Node.js) ,
5958 байтПопробуйте онлайн!
источник
Желе , 15 байт
Попробуйте онлайн!
Возьмите число в диапазоне в
[0,100[
качестве ввода.источник
JavaScript (ES6), 91 байт
Мне было любопытно узнать, как жесткое кодирование можно сравнить с итеративным вычислением. Это определенно дольше (см . Ответ @ Shaggy ), но не намного дольше.
Редактировать : Однако, это намного длиннее, чем более прямая формула (см. Ответ @ l4m2 ).
Принимает ввод как целое число в [1..99] .
Попробуйте онлайн!
Как?
Нечетные годы имеют значительно меньше шансов на мм * дд = гг, чем четные годы. Конкретнее, нечетные годы имеют от 0 до 3 совпадений, а четные годы - от 0 до 7 совпадений. Это позволяет нам кодировать каждую пару лет всего 5 битами, которые удобно представлять в виде одного символа в базе 36.
источник
Perl 6 , 40 байт
Попробуйте онлайн!
источник
Python 2 и 3 ,
5552 байтаПопробуйте онлайн!
источник
Утилиты Bash + GNU , 57
Обратите внимание, что
seq
команда всегда создает список из 366 дат - для не високосных лет будет включен 1 января следующего года. Однако в диапазоне дат 2001..2099 MM * DD никогда не будет YY на 1 января следующего года для любого из этих лет, поэтому этот дополнительный день не повлияет на результат.Попробуйте онлайн!
источник
date
будет ли на этом математике встречаться при разборе.seq
после него не требуется пробел-f
, поэтому вы можете сохранить байт там.T-SQL,
123121 байтСогласно нашим правилам ввода- вывода , ввод осуществляется через существующую таблицу t с целочисленным полем y , которое содержит год из двух цифр.
Разрыв строки предназначен только для удобства чтения. В значительной степени вдохновлено решением Sophia's Excel .
CONCAT()
, что делает неявныеvarchar
преобразования типов данных. В противном случае я должен был бы сделать кучуCAST
илиCONVERT
заявлений.ISDATE()
, которая возвращает 1 для действительных дат и 0 для недействительных дат.y%m=0
) вWHERE
переместил предложение, чтобы сохранить 2 байта, спасибо @RazvanSocol.К сожалению, он не намного короче версии таблицы поиска (используя строку из версии osdavison ):
Поиск T-SQL, 129 байт
РЕДАКТИРОВАТЬ : Оставляя мой оригинал выше, но мы можем сохранить несколько байтов, используя несколько новых функций:
STRING_SPLIT
доступно в MS SQL 2016 и выше.CONCAT_WS
доступно в MS SQL 2017 и выше.IIF
наWHERE
MS-SQL 2017,
121118 байтMS-SQL 2017, дополнительная читерская версия: 109 байт
Требует, чтобы вы были в
master
базе данных, которая содержит системную таблицу,spt_values
которая (при фильтрацииTYPE='P'
) дает вам счетные числа от 0 до 2048.источник
m/d/y
), зависит от настроек локальности экземпляра SQL. В других местах может потребоваться другой порядок или другой разделитель, но я не думаю, что это повлияет на длину кода.SPLIT_STRING
вместо CTE сокращает его до 120 байтов. ИспользованиеCONCAT_WS
вместоCONCAT
сохранения другого символа, получая его до 119 байт.IIF
наWHERE
.Юлия 0,6 ,
494442 байтаПопробуйте онлайн!
-5 байт, вдохновленный ответом Руби Асоне Тухида.
-2 байта, заменяющих счет суммой
Объяснение:
Для каждого месяца
i
от 1 до 12 рассчитайтеy/i
и проверьте, не является ли это одним из дней этого месяца. Месяцы с 31 днем составляют 1, 3, 5, 7, 8, 10, 12 - поэтому они нечетные ниже 8 и даже на и выше 8. Так что либоi%2
илиi÷8
(что равно 0 для i <8 и 1 для i> = 8 здесь) должно быть 1, но не оба - поэтому мы их XOR. Если результат xor равен true, мы проверяем даты,1:28+3
т.1:31
Е. В противном случае мы проверяем только даты1:28
.1:28
достаточно для остальных месяцев (это улучшение, вдохновленное ответом Асоне Тухида на Ruby ), потому что:на февраль единственная возможность была бы
2*29 = 58
, но2058
это не високосный год, поэтому мы можем предположить, что в феврале всегда 28 дней.другие месяцы с 30 днями - это месяц 4 и выше, для которого
i*29
(иi*30
) будет больше 100, что можно игнорировать.Наконец, мы подсчитываем, сколько раз
y/i
принадлежит этому списку дней (используяsum
здесь логическое значение ), и возвращаем это.источник
JavaScript
9185828177 байтПринимает ввод в виде двухзначной строки (или целого числа из 1 или 2 цифр).
Использует тот факт, что
new Date
будет перенесен на следующий месяц, и продолжит делать это, если вы передадите ему значение дня, которое превышает число дней в месяце, которое вы ему передаете, так что на первой итерации он пытается построить Датаyyyy-01-345
которая становитсяyyyy-12-11
, илиyyyy-12-10
високосные годы. Нам не нужно проверять даты после этого, в12*11+
результате получается трехзначное число.3 байта сохранены благодаря Арно .
Проверь это
источник
Python 2 ,
89846858 байтПопробуйте онлайн!
источник
Excel, 83 байта
Вход в ячейку
A1
в форматеyyyy
. Это формула массива, которая вводится с помощью Ctrl+ Shift+, Enterчтобы получить фигурные скобки{}
. Это довольно просто и без какой-либо хитрости.Когда в формуле массива,
DATE(A1,1,0)+ROW(1:366)
дает нам массив из 366 значений даты. В не високосные годы это будет включать 1 января следующего года, но это не является проблемой, поскольку1*1=1
будет считаться ложноположительным, если следующий год,2001
но, поскольку требуемый диапазон2001 - 2099
, он никогда не возникнет как вопрос.Если вы укоренили этот бит в просто
~
, формулу, потому что гораздо проще следовать:Я попытался использовать
COUNTIF()
вместо,SUM(IF())
но Excel даже не позволил бы мне ввести его в качестве формулы массива, а тем более дать мне результат. Я сделал найти Google Sheets решения , используя ,CountIf()
но один и тот же метод , в противном случае , что оказалось 91 байт, в основном потому , что он используетArrayFormula()
вместо того , чтобы просто{ }
.источник
Сетчатка 0.8.2 , 55 байт
Попробуйте онлайн! Занимает год с двумя цифрами; добавить 1 байт для поддержки 4-значных лет. Пояснение: Первый этап просто превращается в унарный. Второй этап начинается с сопоставления от 1 до 12 символов перед позицией совпадения, представляющих месяц, а затем попытается просмотреть целое число повторений этого месяца. Тем не менее, просмотр содержит условное условие, которое выбирает до 27 или 30 повторений в зависимости от месяца. Подсчет совпадений позиций является желаемым результатом.
источник
R ,
22122 байтаПопробуйте онлайн!
Решил пойти с подходом таблицы поиска. Год ввода должен состоять из 2 цифр.
источник
if
, так как ввод может быть либо 2-значным, либо 4-значным по вашему выбору (так что вы можете принять только 2-значный ввод). Но похоже, что код считает, что каждый месяц содержит 31 день, поэтому, например, 62 (для 2062) возвращает 1, где он должен возвращать 0.C (gcc),
656059 байтПорт Java- ответа пользователя 202729 . Попробуйте это онлайн здесь . Спасибо Джонатану Фречу за игру в гольф 1 байт.
источник
a=0,m=13;for(;
~>for(a=0,m=13;
.J , 29 байт
Попробуйте онлайн!
Как это устроено
Пытался изо всех сил получить под 2 раза раствор желе :)
Примечание
Если кто-то действительно хочет жестко закодировать 99-значные данные, вот немного информации:
Разделите 99-значный на куски по 2 цифры. Тогда первая цифра
<4
и вторая<8
, что означает, что пять битов могут кодировать два числа. Затем все данные могут быть закодированы в 250 бит или 32 байта.источник
Питон 3 , 158
162215241байтУдалено 4 Спасибо Стивену за игру в гольф.
Удалено 53 спасибо Стивену за указание на пустое пространство
Удалено 26 благодаря ссылке, предоставленной caird
Я довольно новичок в этом. Не мог придумать, как это сделать, не описывая дни месяца.
Попробуйте онлайн!
источник
(28if Y%4else 29)
можно сократить до[29,28][Y%4>0]
. Кроме того, длинный список может быть сокращен до[a,...]+2*[a,b,a,b,a]
.a,b,c
можно добавить в список параметров, чтобы сохранить строку.int(str(Y)[2:])
можно сократить доY%100
. Наконец, переменные счетчика в большинстве случаев можно сократить доlen
s списков, это также позволяетn
сделать alambda
. Это составляет 118 .Forth (gforth) ,
6059 байтовПопробуйте онлайн!
Эта версия использует тот факт, что не может быть более одного совпадающего дня в месяц и что год должен делиться на месяц, чтобы соответствовать.
объяснение
Повторяется по месяцам, проверяет, делится ли год на месяц, и если частное составляет <31 (28 на февраль). Месяцы после марта не могут совпадать для дней больше 25, поэтому мы можем просто предположить, что все месяцы (кроме февраля) есть 31 день для цели головоломки.
Код Объяснение
[1] - Forth имеет концепцию чисел двойной длины, которые хранятся в стеке как два числа одинарной длины (в форме xy, где значение double =
y * 2^(l) + x
где l - размер в битах одиночного числа в четвертая реализация, с которой вы работаете).В этом случае я сравнил частное и остаток с 32 (или 29) 0. Если остаток был больше 0 (год не делится на месяц), первый дубль будет автоматически больше 32 (или 29) 0 и результат было бы ложным. Если остаток равен 0, то он эффективно разрешает регулярную проверку фактора <= 32 (или 29)
Forth (gforth) , 61 байт
Попробуйте онлайн!
Сэкономили несколько байтов, поняв, что только февраль имеет значение с точки зрения правильного количества дней в месяце
объяснение
Сравнение Forth (по крайней мере, Gforth) возвращает -1 для true и 0 для false
источник
Java (JDK 10) ,
797270 байтПопробуйте онлайн!
источник
d
айсы)&&
к&
нему тот же ответ , как Java ответ OlivierGrégoire, хотя он ответил 19 минут раньше.JavaScript (Node.js) , 108 байт
источник
Perl 5 , 68 байт
Попробуйте онлайн!
источник
Python 3, 132 байта
Это действительно довольно длинная программа, но я подумал, что она может быть интересной.
Все значения находятся в диапазоне 0-7, поэтому я кодирую каждое число 3 битами в длинной двоичной строке. Я попытался вставить необработанную двоичную строку в мою программу на Python, но не смог заставить ее работать, поэтому я остановился на base64 в файле.
Я использовал следующую строку в качестве таблицы поиска (окончание 7 используется для заполнения):
01223242434261334151533172234161321260115040331061312042410060032130113060021220420051013051110140127
Программа берет эту строку и декодирует ее как число, а затем использует битовое смещение для извлечения результата.
66 байт + файл 37 байт = 103 байта
Это читает двоичный файл с именем
e
и избегает использования base64.Вот hexdump прочитанного файла (без заполнения):
источник
Haskell ,
6151 байтПопробуйте онлайн!
Вдохновленный ответом xnor's Python 2 и Laikoni.
источник
f y=sum[1|i<-[1..12],mod y i<1,div y i<29+mod i 2*3]
попробуйте онлайн!Oracle SQL, 115 байт
Мы можем отметить, что на самом деле не имеет значения, сколько дней в апреле (и более поздних месяцах), так как 100/4 <28. Также нет необходимости проверять, является ли год високосным или нет. Мы просто должны указать, что в феврале 28 дней (а не 29, потому что эта проверка будет выполняться только для 2058 года, что не является скачком), в противном случае это может быть всего 31 за любой месяц.
Другие подходы
Oracle SQL (12c Release 2 и более поздние версии), 151 байт
Oracle SQL (12c Release 2 и более поздние версии), 137 байт
Оба решения могли бы быть 8 байт короче , если мы заменим
(select level l from dual connect by level<=12)
с ,xmltable('1to 12'columns l int path'.')
но Oracle бросает исключение из-за ошибки (проверено на версии 12.2.0.1.0, 18.3.0.0.0).Единственный случай в обоих решениях, когда год имеет значение, это 2058, который не является високосным, поэтому для указания не високосного года использовалось буквальное значение «-1».
Oracle SQL, 128 байт
Oracle SQL, 126 байт
Обновить
Oracle SQL, 110 байт
Oracle SQL, 108 байт
Spark SQL, 137 байт
Spark 2.3+ SQL, 126 байт
(
replace
функция становится доступной)источник
PHP , 73 байта
Используя вход трубы и
php -nR
:Попробуйте онлайн!
PHP , 76 байт
Использование командной строки arg input
php dm.php 18
:Попробуйте онлайн!
Итерационный подход. Поскольку единственный високосный год - 2 * 29 = 58, а 2058 год не високосный, нет необходимости рассматривать високосный год в февральских днях. И так как перенос не является проблемой - с апреля любой день, превышающий 25, будет превышать 100, мы просто говорим, что в остальные месяцы есть только 25 дней.
Ввод двухзначного года через командную строку (-10 байт как программа, спасибо предложению @Titus).
ИЛИ:
PHP , 101 байт
Попробуйте онлайн!
Все еще итеративный, но с использованием функций отметки времени PHP. Принимает год как четырехзначное число. Спасибо @Titus за предложение использовать
strtotime()
вместоmktime()
.источник
$m<5?$m-2?31:28:25
для первого и$d=strtotime("$y-1")
для второгоy
в Eval в кавычках?strtotime()
вместоmktime()
и повторно реализованная как программа, -7 байт. Кроме того, я рассмотрел большинство представлений, в том числе самых популярных, в которых год будет приниматься только в виде 2 или 4 цифр, поэтому я буду считать, что это зависит от заявителя. Спасибо еще раз за предложения!PHP,
7470 байтпринимает только двузначные годы.
Я принял соображения Гво и играл в гольф; мой первый подход был длиннее его (92 байта):
%100
позволяет использовать 4-х значные годы.Запустите как трубу с
-nR
или попробуйте их онлайн .источник