Ваша задача состоит в том, чтобы написать программу, в которой, учитывая год, выводится число «Пятница 13-е».
Правила и детали:
- Вы можете получить ввод через
STDIN
или в качестве аргумента, передаваемого вашей программе. - Вы должны вывести результат в
STDOUT
. - Вы можете предположить, что ввод будет действительным годом и не будет предшествовать григорианскому календарю (в этих случаях допускается неопределенное поведение).
- Календарь / Дата библиотеки разрешены.
Это код-гольф , поэтому выигрывает самый короткий код (в байтах).
Ответы:
APL (Dyalog АПЗ) с калом от dfns , 29 байт
Попробуйте онлайн!
⍳ 12
целые числа от одного до двенадцати⎕ ,¨
взять числовой ввод и предварять каждое из двенадцати чисел{
...}¨
на каждую из пар примените функцию ...cal⍵
получить календарь на этот год-месяц2 ↓
отбросить два ряда (заголовок и дни)⍉
транспонировать (чтобы мы могли обращаться к столбцам вместо строк)¯5 ↑
возьмите последние пять (две цифры для каждой пятницы и субботы плюс один пробел)3 ↑
возьмите первые две (две цифры для пятницы плюс пробел)⍉
транспонировать (так мы получаем порядок чтения),
запутывать⍎
выполнить как выражение APL (дает список дат пятницы)13 ∊
тринадцать является членом этого списка?+/
сумма 12 булевыхИспользуя алгоритм @ Wrzlprmft , мы можем сделать это без библиотек на 53 байта:
-∘0 1
вычесть ноль и один400 100 4 ∘.|
таблица остатков деления за два года (поперек), деленная на эти числа (вниз)0 ≠.=
внутренний «продукт» с 0, но с использованием ≠ и = вместо +. ×⊢ ,
добавить неизмененный аргумент год2 3 ¯1 +.×
внутренний продукт с этими числами14 |
остаток от деления на четырнадцать'21232211321211' ⌷⍨
индекс в эту строкуисточник
Mathematica
49 46 45 4442В чистом виде : 42 символа
пример
В качестве именованной функции : 44 символа
Примеры
источник
f=DayName@{#,m,6}~Table~{m,12}~Count~Friday&
Руби,
49 48 4746Изменить: побрил персонажа, вернувшись на неделю назад, благодаря Яну, и еще одного, переключившись с Time.new на Time.gm
Изменить: за счет запутывания его немного больше, я могу получить до 46 с
источник
Time.gm(m,i).wday<1
. Кроме того, я не знаю, почему вы называете эту функцию.Powershell,
6863585250Спасибо Иззи за отзыв.
Используя тот факт, что если 1-й день в месяце - воскресенье, 13-й будет пятница.
Я также попробовал:
но это не то же самое
$args
внутри блока скрипта.источник
$n
с$args
в цикле, и вы можете обойтись без$n=read-host;
полностью. Сохраняет 8. Удалите @, как упомянуто выше, и вы опуститесь до 54.$args
для$input
, таким образом , подавая год в из трубопровода, и скрипт будет работать , но он всегда выводит 3.R
767257источник
"%a %d")=="Fri 13"
с"%w%d)=="513")
помощью dow в качестве числа и удалив пробелы.seq
единственное в месяц здесь на самом деле короче!sum(format(as.Date(paste(scan(),1:12,13,sep="-")),"%w%d")=="513")
всего 65 символов!<
приведёт символ к целому числу. Хороший трюк!Python2.7
9086Понедельник 9-го может быть не совсем похож на звонок, но работает так же хорошо.
Изменить: полтора года, чтобы заметить, что
date
короче, чемdatetime
:)источник
from datetime import*
f=lambda y:sum([date(y,m,13).weekday()==4 for m in range(1,13)])
.... Решение того же размера с импортом (86 байт).Не используя никаких библиотек или встроенных функций даты:
Golfscript - 51
Питон -
8279По сути тот же алгоритм.
Используя эту уловку , это может быть улучшено до:
источник
С
301+287Не самый короткий ответ, но не использует библиотеки.
источник
static char GetNumberOfFriday13s(int year) { const string perpetualCalendar = "1221212213113213122221122131122121221311321312222112213112212122131132131222211221311221212213113213112213113213122221122131122121221311321312222112213112212122131132131222211221311221212213113213122213113213122221122131122121221311321312222112213112212122131132131222211221311221212213113213122221122213122221122131122121221311321312222112213112212122131132131222211221311221212213113213122221122131"; return perpetualCalendar[year % 400];
. Не будет работать в отрицательные годы.v[0]
должно бытьv[1]
. Вы также можете немного поиграть в гольф; рассмотрите возможность использованияstrcat
, хранения символов для прямой печатиa[]
и вычитания числовых констант вместо символьных констант. :)main(int x,char**v){char p[400],*a[]={"1221212213113213","2131222","21122131","1222","112213113","122223113","122221122"},*b="adcadcadcaebcadcadcafbcadcadcagbcadcadcadc";*p=0;for(;*b;b++)strcat(p,a[*b-97]);putchar(p[atoi(v[1])%400]);}
(215 символов)C (
151145137131130 символов)Я удивлен, увидев, что есть только одно решение, которое не использует встроенные инструменты календаря. Вот (очень запутанный) математический подход, также в C:
(Выше компилируется в GCC без ошибок)
Альтернативное решение: C (287-> 215 символов)
Мне скорее понравилось решение Виллихема Тотланда и его использование сжатия. Я исправил две небольшие ошибки и подправил код, чтобы сократить его длину:
источник
PHP, 82
<?for($i=1,$c=0;$i<13;$i++)$c+=(date("N",mktime(0,0,0,$i,1,$argv[1]))==7);echo $c;
На основе
«Любой месяц, который начинается в воскресенье, содержит пятницу 13-го числа, и в каждом календарном году есть как минимум одна пятница 13-го».
С http://en.wikipedia.org/wiki/Friday_the_13th
источник
Баш
4736Спасибо @DigitalTrauma за сохранение 10 символов с использованием
seq
начала по умолчанию1
.(Предыдущая версия , использующая
echo
настоящий баг из - за пустую строку , когда<(echo $1-{1..12}-6$'\n')
. Таким образом , эта функция работала нормально до сегодняшнего дня не в пятницу.Посмотрим:
Это зависит от локали, например , если это не сработает, возможно, вам придется
или
В функцию; +7 -> 43
Бонус: +78 -> 121
Оттуда, если моя функция станет:
или
источник
C
. Но есть ошибка ...%s\\n
seq
чтобы сбросить 8 символов:date -f<(seq -f$1-%g-6 1 12)|grep -c ^F
seq -f$1-%g-6 12|date -f-|grep -c ^F
JavaScript, 70
источник
,b,c
из объявления функции (! Это нормально течь вары для игры в гольф), а также , какb
отливают какNumber
вы можете+=
результат теста вместо&&b++
:b+=/^F/.test(new Date(a,c,6))
. Тем не менее, вы можете сохранить другой байт, используя!new Date(a,c,1).getDay()
(это работает, потому чтоgetDay
возвращает 0 для воскресенья, а если 13-е - пятница, 1-е - воскресенье) вместо того,test
который в целом должен сэкономить вам 7 байт!К
64 персонажа
Читает со стандартного ввода
источник
Common Lisp (CLISP), 149
источник
C #
1101019392C # Linq 88
Спасибо Jeppe Stig Nielsen за linq и предложение проверить воскресенье 8-го.
Спасибо Данко Дурбичу за предложение
>
вместо==
.источник
c+=(int)new DateTime(y,i,13).DayOfWeek==5?1:0;
, чтобы использовать эквивалентc+=new DateTime(y,i,8).DayOfWeek==0?1:0;
. Хитрость заключается в том, чтобы вычесть5
, потому что тогда вы можете избавиться от приведения кint
, а также число на8
одну цифру меньше, чем число13
. Воскресенье восьмое!int g(int y){return Enumerable.Range(1,12).Count(m=>new DateTime(y,m,8).DayOfWeek==0);}
. Конечно, как лямбда этоy=>Enumerable.Range(1,12).Count(m=>new DateTime(y,m,8).DayOfWeek==0)
..DayOfWeek<1
.c#
ответу, но не уверен, как его применитьlinq
.DayOfWeek
с любым другим целым числом, кроме0
-error CS0019: Operator '<' cannot be applied to operands of type 'System.DayOfWeek' and 'int'
.PHP, 55 байт
Беги с
echo <year> | php -nR '<code>'
.По сути, то же самое, что и Олег, и Дамир Касипович сделали, только с лучшим игрой в гольф:
каждый месяц, который начинается с воскресенья, имеет пятницу 13-е.
Поэтому я перебираю месяцы и считаю первые дни воскресенья.
сломать
источник
К, 42
,
источник
Баш (
5247 символов)источник
Реболь, 63
Пример использования в консоли Rebol:
Альтернативное решение, которое собирает всю пятницу 13 числа в данном году:
источник
Баш и Сед, 39
ncal
печатает календарь на данный год с днями недели внизу слева.sed
с/g
флагом подает все 13 с новыми строкамиgrep -c
считает строки, начинающиеся с «2» (20 всегда следует за 13)Спасибо @DigitalTrauma за то, что нашли ошибку в моей старой версии и предложили решение!
источник
ncal $1|sed /F/s/13/\\n/g|grep -c ^\ 2
Скала,
7668 персонажейВ 78 символов:
def f(y:Int)=0 to 11 count(new java.util.GregorianCalendar(y,_,6).get(7)==6)
Ничего необычного, кроме использования магических чисел для
DAY_OF_WEEK = 7
иFRIDAY = 6
.Версия для 68 персонажей:
def f(y:Int)=0 to 11 count(new java.util.Date(y-1900,_,6).getDay==5)
Да, Java изменила значения констант дня недели между API.
источник
new java.util.GregorianCalendar
должно быть так долго :(Python 195/204
Работает только за предыдущие годы, потому что
monthdatescalendar
возвращает календарь на данный год до сих пор . Я думаю, что остается много оптимизационного потенциала :).Другое решение, работает на каждую дату, но оно не меньше:
источник
Perl 6,
5553Старый ответ:
источник
Python (v2) 120
источник
Perl + lib POSIX 55
С идеей не ищет ,
13th
но первый, и , какsunday
это0
это пусть экономия 3 символов! Спасибо @ Iszi и Данко Дурбич!Можно рассчитать 2010 по 2017 год (для образца) следующим образом:
(Хорошо, новой строки нет , но об этом не спрашивали;)
Старый пост: 63
В бою:
источник
В Smalltalk (вкус Squeak / Pharo), реализовать этот метод в Integer ( 86 символов)
Затем использовать его как это:
2014countFriday13
.Конечно, мы можем использовать более короткое имя, но тогда это не будет Smalltalk
источник
C ++ - слишком много байтов :(
Я попробовал решение, которое не использует какие-либо библиотеки дат.
Я нашел довольно классное (если можно так выразиться) решение. К сожалению, я не могу получить это короче, чем это, что действительно меня беспокоит, потому что такое чувство, что должен быть лучший способ.
Решение зависит от этого алгоритма, который сам по себе составляет всего 44 байта. К сожалению, мне нужно еще 100 байтов, чтобы красиво обернуть его ...
Вывод через код возврата (в C ++, для использования
cout
илиprintf
чего-то подобного требуется другой#include
, что взорвет решение еще больше).Водитель / тестовая программа:
Вывод программы драйвера:
источник
($m<3?$y--:$y-2)+3
вместоd=13,
,d+=m<3?y--:y-2,
иd+4
должен работать так же, и много экономит.+5
вместо того, чтобы+3
и-5
должно работать тоже и экономит 2 байта.for(m=0;++m<13;)
сохраняет один байт. Переходm=0
к функции головы сохраняет другой байт; и перемещение()%7||++f
к головке петли спасает другую. По сравнению с 149 до 136 байтов.Clojure,
207187 байт-20 байт, избавившись от
import
, и некоторые пробелы, которые я пропустил.Начиная с 1 января данного года, он проходит каждый день. Если день пятница 13-е, это увеличивает счет. Он продолжает цикл до следующего года.
источник
PHP, без встроенных функций, 81 байт
Беги с
echo <year> | php -nR '<code>'
.сломать
Будни повторяются каждые 400 лет.
В результатах за 1600–1999 гг. (Например) есть период продолжительностью 28 с тремя пробелами:
После корректировки года для этих пробелов мы можем получить результат с помощью простого хеша:
Не короткая (95 байт), но красивая. И мы можем играть в гольф
источник
for(;++$m<13;23*$m/9+($m<3?$y--:$y-2)+5+$y/4-$y/100+$y/400)%7?:$f++)$y=$argn;echo$f;
Japt
-x
, 10 байтПопытайся
источник