Эта задача довольно проста. Вы берете ввод, который будет годом с 1801 по 2400, и выводите, если это високосный год или нет.
Ваш ввод не будет содержать ни новой строки, ни пробелов:
1954
Вы будете выводить любым способом, который вам нравится, который четко говорит пользователю, является ли он високосным годом или нет (я приму y или n для да / нет)
Вы можете получить список високосных лет здесь: http://kalender-365.de/leap-years.php Я хотел бы отметить, что високосные годы не всегда четыре года. 1896 год високосный, а 1900 - нет. Годы, следующие за этим «пропуском»:
1900
2100
2200
2300
Тестовые случаи:
1936 -> y
1805 -> n
1900 -> n
2272 -> y
2400 -> y
РЕДАКТИРОВАТЬ: Это основано на стандартном григорианском календаре: http://www.epochconverter.com/date-and-time/daynumbers-by-year.php
code-golf
date
decision-problem
Кевин Круйссен
источник
источник
(divisible by 4)∧((divisible by 100)→(divisible by 400))
.Ответы:
APL,
161412 символовВозвращает
0
для високосного года,1
для не високосного года.Попробуйте это решение на tryapl.org . Обратите внимание, что я изменил решение на dfn, так
{≥/⌽×4 25 4⊤⍵}
как tryapl.com не поддерживает⎕
(принять пользовательский ввод). Обратите внимание, что⎕
это пустое поле, а не пропущенный символ.То же решение в J:
объяснение
Dyadic
⊤
(encode) представляет свой правый аргумент в базе, указанной его левым аргументом. Я использую базу4 25 4
в этом решении. Это представляет год у как полиномПусть предложения α, β и γ представляют собой, если a, b и c отличны от нуля: предложение γ неверно, если y делится на 4, β ∧ γ ложно, если у является делимым на 100 и & alpha ; ∧ & beta ; ∧ & gamma вне ложь, если у делится на 400.
Таблица истинности (
*
представляющая «все равно») была бы предложением Δ, если y представляет собой високосный год:Следующее утверждение выражает Δ в α , β и γ :
Из-за структуры этого утверждения можно выразить ¬Δ как сокращение,
≥/⌽α β γ
где ≥ реализует ←. Это приводит к ответу, который я сейчас объясняю.источник
Pyth, 11 байт
Эта полная программа читает из STDIN и печатает True для високосных лет и False противном случае.
Спасибо @Jakube за предложение Pyth и в основном перенос моего кода CJam.
Проверьте сами тестовые примеры в Pyth Compiler / Executor .
Как это работает
источник
CJam, 12 байт
Эта полная программа читает из STDIN и печатает 1 для високосных лет и 0 в противном случае.
Проверьте сами тестовые случаи в интерпретаторе CJam .
Как это работает
источник
r2/~~\e|i4%!
,r2/~~\~e|4%!
,r2/:~~\e|4%!
,r2/S*~\e|4%!
И 13 байтr2/:~W%:e|4%!
r2/:i:\e|4%!
(12) иr2/:i(fe|~4%!
(13). Я даже пробовал GolfScript (который не требуетr
), ноor4
интерпретируется как один токен. Если бы только вход имел завершающий перевод строки ...Javascript (ES6), 21 знак
Стандартным правилом
y
является високосный год, если 4 делитсяy
и если 100 не делитy
или 400 делитy
. В кодеНет необходимости в этих 100 и 400. Вместо этого достаточно проверить, делит ли 16 или 4 y, а 16 выбирается, если 25 делит y, 4 в противном случае. Гольф, это становится
Функция javascript, которая реализует это длиной 21 символ:
Perl,
2826 символовТа же идея, но в Perl.
Запустите, используя
-lp
параметры. Например,С тестом, установленным в качестве входа, это производит
источник
y=>...
) - это функция ES6.зернышко , 13 байт
Этот был более интересным, чем сначала показался. Потребовалось finagling, но я, наконец , смог заменить эти длинные ссылки
400
с4
иh
переменной (= 100).Выходы
1
для високосного года,0
для не високосного года. Объяснение:источник
Pyth,
191514 байтовСлишком просто. Попробуйте онлайн: демонстрация или тестовая привязь
edit: Пропущено, что вы можете печатать значения Truthy / Falsy вместо
n/y
. -4 байтаредактировать 2: Использовал идею квадратного корня Мартина. -1 байт
объяснение
источник
Регекс,
836238Спасибо Тоби за советы по объединению обеих половин регулярного выражения.
Если мы сосредоточимся только на диапазоне 1801..2400 и предположим, что входные данные являются целыми числами:
Проверьте в Ruby (
^
=\A
и$
=\Z
потому что Ruby) для желаемого диапазона:(Бонус) за то, что должно работать не только на 1801..2400, но и на любой неотрицательный год:
Тест на Ruby (
^
=\A
и$
=\Z
потому что Ruby) за первые 100000 лет:источник
(?!)
вы можете объединить две половины:(?!00)([02468][048]|[13579][26])(00)?$
- для 38. Это не будет работать в течение однозначных лет, хотя.JavaScript ( ES6 ) 27
Правило:
(y%4==0) && (y%100!=0 || y%400==0)
Гольф:
!(y%100<1&&y%400||y%4)
(в основном по закону Де Моргана )Функция, реализующая правило:
Тест (запустить в Firefox) просто чтобы быть уверенным:
источник
!(y%(y%25?4:16))
вместо!(y%100<1&&y%400||y%4)
. Для тех, кого беспокоит троичный оператор, вы можете использовать!(y%(4<<2*!(y%25)))
и при этом сохранить еще три символа!(y%100<1&&y%400||y%4)
.TI-BASIC,
20 17 1613Поскольку TI-BASIC является токенизированным, он часто конкурирует с простыми математическими задачами, но не с этим, поскольку нет «делимой» команды.Может быть, это все-таки, но это все же дольше, чем CJam и Pyth.Это использует метод Дэвида Хаммонда.
Старый код в 16 байтов:
Ungolfed:
fPart(
является «дробной частью»; Возведение в степень имеет более высокий приоритет, чем деление. В TI-BASIC закрытые скобки являются необязательными.Я использую недокументированное поведение
sub(
команды, обычно используемое для получения подстроки: когда ее аргумент является числом, а не строкой, он делит число на 100. Он будет работать на калькуляторе серии TI-83 или 84.20 -> 17 путем перестановки кода, чтобы разрешить удаление близких паренсов; 17 -> 16 путем замены 400 на 16; 16 -> 13, используя идею Дэвида Хаммонда.
источник
Stackylogic, 226 байт (не конкурирует)
Да, именно так. Я сделал программу на Stackylogic (не-TC), которая была изобретена Хелкой Хомбой, для задачи, найденной здесь . Это сделано после вызова, поэтому не конкурирует.
Stackylogic имеет только двоичный вход, поэтому необходимо использовать 10 (или более, любые другие цифры будут игнорироваться) двоичный бит (сначала вводится младший значащий бит). Любые даты за пределами указанного диапазона могут потерпеть неудачу, так как он просто проверяет, что является введенным числом: он не покрывает ненужные даты
Это не только мой первый вызов со стайлогикой, но и первый вызов со стайлогикой вообще.
Будьте готовы к этому беспорядку:
Это заняло у меня так много времени, потому что Stackylogic - самый запутанный язык, с которым я когда-либо сталкивался, и чрезвычайно нечитаемый: вы должны знать, как выполнялась остальная часть программы, прежде чем читать текущий редактируемый раздел. Мне даже пришлось добавить пробелы для удобства чтения при его создании.
Скудное объяснение
Это простое объяснение того, что он делает.
Stackylogic не имеет никаких математических функций, так что это усложнило. Мне пришлось жестко кодировать большую часть этого, чтобы проверить, было ли это конкретное число.
Во-первых, эта программа выполнит NOR младших разрядов, отбрасывая их в процессе. это означает, что если он делится на 4, он перейдет к основной части программы, в противном случае выведите 0.
Во-вторых, указатель переносится в лабиринт стейлогии, отсюда, если следующие два бита равны нулю, он мгновенно выдаст 1 (как тогда он делится на 16, и, следовательно, високосный год, несмотря на любые другие условия), другое мудро, что он проверит, не является ли это любое из чисел, которые делятся на 4, но не високосный год, между 1801 и 2400.
Чтобы объяснить подробно, потребуется сделать этот пост во много раз дольше, чем это уже есть
источник
Ассемблер IBM System Z - 56 байт.
(96 байтов источника. Ранее
712384202 байта источника, 168 байт исполняемого файла).Меньшая версия все еще. Больше не сохраняет регистры вызывающего абонента, изменяет литеральное хранилище, изменяет режим адресации.
Новая версия. Это изменится с S0C1, если это високосный год, и зациклится, если это не так. Надеемся, что это соответствует требованию указания результата.
Хорошо, так что не самое короткое (хотя это может быть, как только мы посмотрим на фактический исполняемый код плюс размер интерпретатора ...)
Выход:
ABEND S0C1 для високосного года, S222 (когда время CPU истекло), если нет.
1936 Y 1805 N 1900 N 2272 Y 2400 Y(при запуске несколько раз)источник
CJam,
1816 байтовДает
1
(правда) за високосные годы и0
(ложно) в противном случае.Запустите все тесты здесь.
объяснение
источник
Mathematica,
4027 байтов, 17 символовИспользует 17 символов, но 27 байтов. Спасибо @alephalpha за подсказку. Обратите внимание, что вертикальные полосы на самом деле U + 2223 для делений.
<U+F523>
Следует заменить соответствующий символ.источник
∣
для представленияDivisible
:,#∣4&&(!#∣100||#∣400)&
21 символа, 27 байтов UTF-8.U+F523
(\[Implies]
), чтобы сделать это#∣4&&(#∣100<U+F523>#∣400)&
для 19 символов (но все еще 27 байтов).Р, 29
Тестовый забег
источник
С, 81
Я могу сделать короче, но этот аккуратно придерживается типов 'char', без разбора аргумента (например, с
atoi
):Он должен вызываться с именем длиной 4 символа, поскольку он предполагает стандартное предположение, что аргументы следуют сразу за именем программы, разделенные NUL. Кроме того, предполагается, что один аргумент закодирован в ASCII и не имеет начального пробела.
Объяснение:
*v+9
позиция цифры «десятки» вv[1]+2
.Если символы «десятки» и «единицы» добавляют к 96, мы заканчиваем
00
, поэтому сделаем резервную копию двух символов, чтобы «десятки» и «единицы» указывали на номер столетия.Теперь xor «единиц» с удвоенными «десятками», мод 4. Это работает, потому что
10==±2 mod 4
, так что младший бит «десятков» может просто переключать бит 1 «единиц». Мы используем результат в качестве индекса в нашей таблице остатков, печатаяy
только в том случае, если модульный результат равен нулю.источник
Befunge -98, (41 байт)
Простота потрясающая.
источник
Сед, 55
Обратите внимание, что не високосные годы могут быть напечатаны как
n
или вN
зависимости от того, являются ли они четными или нечетными. Я считаю это творческим толкованием правила, которое допускает альтернативы «да» и «нет», не указывая, что они должны быть последовательными.источник
Python2 - 37
g=lambda x:(x%4or x%400and x%100<1)<1
Обратите внимание, что если
a
целое неотрицательное число, тоa<1
это короткий способ записиnot bool(a)
. Последний<1
таким образом, эффективно преобразует выражение в скобках в логическое значение и сводит на нет результат.Применение функции
g
к целому числуn
от 1801 до 2400 вернет,True
еслиn
это високосный год, иFalse
иначе.источник
KDB (Q), 27 байтов
объяснение
Тест
источник
Юлия,
3028 байтЭто создает безымянную функцию, которая принимает целочисленный аргумент и возвращает логическое значение. Чтобы назвать его, дайте ему имя, например
f=y->...
.Ungolfed:
Пример:
источник
PHP - 45 байт
Ничего особенного, просто злоупотребление жонглированием шрифтами.
источник
C #, 23 байта
Попробуйте онлайн!
Полный исходный код, включая контрольные примеры:
источник
C
373430 байтWandbox
источник
T-SQL
3722 байтаСохранено 15 байт благодаря комментарию BradC.
Обычная жестко закодированная переменная из-за отсутствия
stdin
.например
Тогда решение:
источник
1
или0
прямо:PRINT ISDATE(@+'0229')
Java 8,
49452220 байт-2 байта благодаря @ OlivierGrégoire .
Попробуйте онлайн.
Некоторые 22-байтовые решения:
Попробуйте онлайн.
Попробуйте онлайн.
Попробуйте онлайн.
Объяснение:
источник
java.time.Year::isLeap
.n->n%(n%25<1?16:4)<1
Haskell, 19 байтов
Попробуйте онлайн!
источник
Javascript ES6, 32, 29, 26
Работает любая из следующих строк:
источник
C 57 байт
Принимает ввод из стандартного ввода, с или без завершающих пробелов / новой строки. Работает только на машинах с прямым порядком байтов (да, как все в настоящее время на BE). Выходы Y или N.
объяснение
Ungolfed:
Во-первых,
scanf
читается год как целое число в y. Затем, y модулируется с 4 или 400 в зависимости от того, делится ли год на 100. Если остаток равен нулю, ASCII-код для Y присваивается y, в противном случае он получает ASCII-код для N. Значение y сейчас0x000000??
, где0x??
находится назначенный символ. Находясь на машине с прямым порядком байтов, в памяти это сохраняется как?? 00 00 00
. Это строка C с нулевым символом в конце, содержащая только назначенные символы. Адрес y передается в put, и печатается символ (с завершающим символом новой строки).источник
main(y){scanf("%d",&y);y=!(y%(y%100?4:400))+48;puts(&y);}
. Я могу уменьшить размер до 48 байт, если могу вывести пустую строку для високосных лет и любой символ (ASCII 1-99) в противном случае, но я чувствую, что это немного нарушает правила. Что вы думаете?PowerShell, 31 байт
Я взволнован, чтобы сказать, что я играл в гольф ниже, чем встроенный!
Выводы true для високосных лет и false в противном случае.
Builtin:
Хотя, если бы я хотел расширить выражение «четко говорит пользователю, если это високосный год или нет» и сделать что-то нестандартное, я мог бы сэкономить 3 байта и использовать:
Это приводит
0
к високосным годам и 1 или выше для не високосных лет, что мне не нравится, так как я предпочел бы возвращать более стандартное истинное значение для високосных лет.источник
LOLCODE,
228202159 байтUngolfed:
В Python ungolfed, потому что LOLCODE сбивает с толку:
источник
WIN
..