Какая самая короткая программа, которую можно предсказать в следующий раз, когда пятница выпадает на 13 число месяца?
- Должна быть полноценной функционирующей программой (а не просто функцией / подпрограммой)
- Необходимо распечатать дату в следующем формате:
YYYY-MM-DD
- Разрешить пользователю указывать дату начала либо в качестве аргумента командной строки, либо через
STDIN
- Если пользователь не указывает дату начала, используйте сегодня как дату начала.
- Если датой начала является пятница 13-го, программа должна найти следующую пятницу 13-го.
Если бы я должен был запустить программу сегодня (16 февраля 2011 года), я бы получил следующий вывод.
$ ./fr13th 2013-05-09
2013-09-13
$ ./fr13th 2007-06-29
2007-07-13
$ ./fr13th 2007-07-13
2008-06-13
$ ./fr13th
2011-05-13
2013-9-13
вывод в порядке для первого примера?Ответы:
Windows PowerShell, 74
Довольно просто. Один, возможно, сбивающий с толку бит - это использование
"Get-Date $args" | Invoke-Expression
для получения либо текущей даты (если$args
она пуста), либо даты, указанной в,$args
без появления ошибки.72-байтовый вариант:
Хотя это занимает много времени ... это не увеличивает дату и время на целый день в каждой итерации, а только 900 наносекунд. Но на два байта короче.
67-байтовый вариант:
Это немного зависит от локали; Если это не помогло, попробуйте заранее установить формат даты ISO-8601. :-)
О, и это может быть сделано в 65 байтов точно так же как 72-байтовая версия.
История:
for
. Сравнение так же, как вычитание, а не-eq
сохранение еще двух байтов.date
Строка формата Unix немного короче.yyy-MM-d
достаточно (поскольку год всегда длиннее трех символов, а день всегда 13. Спасибо Ти Аувилу за это.источник
iex
? Попробуйте просто (date $ args).$null
наGet-Date
вы получите сообщение об ошибке, а не текущую дату."date $args"|iex
тем не менее, разрешается либо дата, указанная в,$args
либо текущая дата, а это именно то, что мы хотим здесь.Баш, 75
Это немного зависит от локали; если он не будет работать на вашем компьютере, попробуйте
export
INGLC_ALL=C
заранее.источник
Рубин,
9675 знаковПринимает дату от стандартного ввода. Чтобы не указывать дату, нажмите Ctrl-D.
Большое спасибо за помощь Ventero.
Ungolfed:
Образец ввода-вывода:
источник
d.wday*d.day==65
На 4 символа короче. И вы должны быть в состоянии заменитьDate.today.to_s
на"thu"
require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d
. И вы можете прочитать дату из stdingets
вместо того,$*[0]
чтобы сохранить другой символ (введите EOF, чтобы получить поведение по умолчанию).C #, 185
Основано на решении C # Эндрю Кёстера , но сильно изменено. В итоге я пришел к решению, аналогичному моему решению PowerShell:
источник
Perl (и другие), 114
Perl 5.10 или более поздней версии, запустить с
-E 'code here'
или-M5.010 file
. Потребностиdate
(из coreutils для Linux) иcal
(из util-linux)Образец прогона:
Я не уверен, когда ведущий ноль за месяцы до октября сохраняется. Это очевидно потеряно, когда год переходит; кажется, что это будет сохранено, когда ответ только в следующем месяце. Давайте назовем это неопределенное поведение - эй, это игра в гольф!
источник
BASH
ИСПОЛЬЗОВАННАЯ КОНЦЕПЦИЯ:
ОБРАЗЕЦ I / O
источник
C #
240 символов. C # нужен режим "только внутри функции"!
Un-golfed:
Тестовый вывод
источник
D: 227 символов
Более разборчиво:
Самое интересное в том, что хотя std.datetime D делает этот код очень простым для написания, он также невероятно многословен - в первую очередь благодаря точным (и, следовательно, длинным) именам функций. Итак, юзабилити и ремонтопригодность кода очень высоки, но играбельность кода довольно низкая.
источник
Питон - 166 символов
Читает из стандартного ввода, поэтому вам нужно ввести пустую строку, если вы хотите сегодняшнюю дату
источник
SQLite, 374 символа
(Разрывы строк добавлены здесь для удобства чтения; не включены в счет.)
Требование «Разрешить пользователю указывать дату начала в качестве аргумента командной строки или через STDIN» пропущено из-за технических ограничений.
Первые 4 оператора создают таблицу (R) с одним столбцом, содержащим все целые числа от 0 до 4095.
5-е утверждение строит таблицу (F) всей пятницы 13-го числа между 2000-10-13 и 2340-12-13.
6-й оператор просто возвращает первую пятницу 13-го числа после текущей (UTC) даты.
источник
PHP - 103
(грубая сила)
Ungolfed:
Тестовое задание:
источник
!=
на-
. Также вы можете сохранить до 2 символов, перемещаясь вверх$d->modify('next fri')
в разделе приращения цикла.-r
и вам не нужен тег. Используйте конфигурацию по умолчанию с-n
и вам не нужно@
.\n
не нужноecho
вместо того, чтобыdie
сохранить еще один байт.strtotime
вместоDate
класса можно сохранить еще одну или две.C #,
206194 символовОбновить
Это немного другой подход к проблеме, поэтому я оставил свою вторую попытку здесь полностью.
Здесь я нахожу пятницу «текущей» недели, а затем увеличиваю ее на 7, пока не найду ту, которая будет 13. Я также использовал Joey's для цикла и форматирования вывода, чтобы сбрить несколько символов.
Ungolfed:
Оригинал:
Это похоже на вышеприведенное описание Эндрю, но было достаточно различий, и я решил опубликовать отдельный ответ, а не комментировать и предложить изменения.
Ungolfed:
источник
R, 113 символов
Пример работы:
источник
Perl 6 , 69 байт
Попробуйте онлайн!
Спасибо @ ASCII-только за -5
источник
day-of-week==5
Javascript
PS: да, я знаю, я нарушил первое правило (не может быть просто функцией)
Тесты на оболочке javascript
источник
T-SQL
359285253 символаЯ просто хотел наложить решение SQLite на мою неумную многословную функцию даты с использованием процедуры T-SQL.
Обновление: мой первоначальный страх, что увеличение дня займет больше места, чем увеличение за месяц, было очень неверным.
Результаты теста (SSMS):
источник
Другой Javascript, 153
Я публикую еще один ответ javascript, потому что не могу прокомментировать первый ...
Выполнить с помощью nodeJS:
источник
Python 3.3, 166 символов
Ввод в формате
2013 1 1
,или просто нажмите Enter, чтобы использовать сегодняшнюю дату (для этого вывода будет 2013/12/11)
(на самом деле есть смесь моего решения и @gnibbler's, который насчитывает 144 символа)
Очень хорошая линия
while t.day*t.weekday()-65:
от решения @ gnibbler.источник
Japt, 35 байт
-8 байт благодаря @ASCIIOnly!
Попытайся!
источник
toISOString
новообращенного UTC который меняет датуK
время как местное время?Swift 4 , 310 байт
Попробуйте онлайн!
-4 спасибо TagTaco.
Увы...:
Int
s какBool
.??
.!=
также требуется интервал, чтобы он не интерпретировался как распаковка.источник
VB.net (96c *)
запись
Таким образом, моя оценка разбита как так
источник
Реболь, 136
Ungolfed:
Пример использования:
источник
Java 8,
200197 байтОбъяснение:
Попробуйте это здесь (удалите аргумент, чтобы использовать текущую дату).
ПРИМЕЧАНИЕ. Формат Java по умолчанию уже используется для печати
yyyy-MM-dd
.источник
05AB1E , 141 байт
05AB1E не имеет встроенных функций для объектов Date или вычислений. Единственная встроенная функция, касающаяся дат, это текущий год / месяц / день / часы / минуты / секунды / микросекунды.
Поэтому почти весь код, который вы видите, - это ручные вычисления для перехода к следующему дню и вычисления дня недели.
В основном происходит от моего 05AB1E ответа в тот день , работа Countdown вызов (именно поэтому я редактировал , что один час назад , когда я наткнулся на ошибку ..)
Ввод - это строка в формате
dd-MM-yyyy
(но вывод в форматеyyyy-MM-dd
, так как это одно из правил испытания).Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник