Решения F # известны внутри 140 символов , и это проблема кода Розетты .
Требуемый результат в stdout или в строковой переменной для года ввода 2014
:
2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28
Как было запрошено, на 1900 год:
1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30
И 2000:
2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31
Из-за того, что на большинстве языков даты кажутся неловкими. Надеюсь увидеть их больше, чем разрешить библиотеки дат! Но если он не относится к базовому языку, объявите его в названии поста (например, C # + Joda Skeet's NodaTime).
Разъяснения:
- Годовой диапазон от 1900 до 3015
- Григорианский календарь
- Если это имеет значение, то, что является обычным для Великобритании / Лондона.
- Программа, использующая переключатель командной строки или стандартный ввод, работает нормально, выдает результат в стандартный вывод
- Функция, принимающая значение года и возвращающая строку, тоже подойдет.
Стандартные лазейки исключены . Ждем решений APL, J, K и увидим несколько новых библиотек дат.
Ответы:
Dyalog APL с cal от dfns , 19 байтов
Лучше поздно, чем никогда!
Запрашивает год, возвращает список дат в формате гггг мд .
⎕
запросить числовой ввод и пусть это будет левый аргумент{
...}¨
анонимная функция (см. ниже) применяется к каждому из⍳12
цифры от 1 до 12 (месяцы)Вышеуказанная анонимная функция выглядит следующим образом:
⍺⍵,
добавить левый и правый аргументы (например, год и месяц), чтобы2↑
первые два символа⊢⌿
самый нижний рядcal
календарь для⍺⍵
левый аргумент и правый аргумент (год и месяц)TryAPL онлайн:
Вернитесь на эту страницу после нажатия здесь для импорта
cal
и его зависимостей.Нажмите здесь, чтобы запустить тестовые случаи.
источник
+
-
<
≤
=
≥
≠
⌈
и⌊
работа с объектами даты .Net .Рубин, 91 + 6 = 97
Работает довольно хорошо.
select(&:sunday?)
довольно, и удивительно,*' '
делает все форматирование само по себе.источник
chunk
вместоgroup_by
.Баш 4.х + нкал, 57
Если разделители новой строки в порядке вместо пробелов, то мы можем удалить
-n
переключатель и завершающий пробел изecho
оператора. И я думаю, что это все еще будет работать без шебанга, поэтому я тоже это убрал:Оригинальный скрипт (73 байта):
Использование:
Примечание. Версии Bash до 4.0 не будут содержать начальные нули месяцев. Это можно исправить с добавлением 5 символов, изменив
{01..12}
на`seq -w 1 12)`
. Кроме того, этоtail -c-3
может вызвать проблемы в некоторых системах, где выводncal
включает в себя конечные пробелы, но я не знаю ни одного, что делает.источник
`…`
вместо хорошей привычки$(…)
.#!/bin/bash
в целях игры в гольф.IBM DFSORT,
113 строки по 71, 72 или 80 символовДва ответа с колоночным форматом вывода выдержали испытание временем. Это дает мне "цикл", вроде того, что в OUTFIL REPEAT = копирует текущую запись много раз.
Другой способ получить значение, которое кажется длиннее, но короче, так как я не могу выработать какой-либо безусловный способ справиться с 12-й записью следующего года и сделать ее условной, включая
IFTHEN=(WHEN=
, дважды и некоторые другие вещи. Прибыль на колебаниях (первый месяц - самый простой способ сделать это) сильно проигрывает на перекрестках (особые требования к синтаксису).При этом используется встроенная функция (все функции в DFSORT встроены), чтобы найти последний день месяца. Затем добавляет один день (функцию), чтобы перейти к первому из следующего месяца, и использует функцию PREVDSUN, чтобы получить предыдущее воскресенье (которое всегда будет последним воскресеньем в предыдущем месяце, как и раньше).
При преобразовании года (ввода) в действительную дату для месяца используется двузначный порядковый номер, и это значение копируется также и для дня, поскольку начальная точка не имеет значения, если она действительна, как мы после последнего дня месяца изначально:
5,2
корочеC'01'
.Вот деталь:
OPTION COPY - копировать входной файл в выходной
OUTFIL - позволяет нескольким выходным файлам с различным выбором и форматированием создавать отформатированные отчеты. Используется предпочтительнее, чем короче
INREC
из-за использованияREPEAT=
.REPEAT = 12 - произвести 12 копий каждой записи. В этом примере из-за SEQNUM может быть только одна входная запись (в отличие от предыдущей версии).
5: - начать с колонки 5 записи.
SEQNUM, 2, ZD - порядковый номер, по умолчанию начинается с одной, двух цифр, «десятичного зонного» (для беззнаковых, какими они будут, так же, как и символ).
1,8 - скопировать байты 1 на длину 8 в текущее местоположение (9). Это потому, что Y4T должен видеть это 8, иначе будет использоваться другой формат даты.
Y4T - дата в формате ccyymmdd (из-за 8 перед ним).
LASTDAYM - последний день месяца (также возможны неделя, квартал и год).
TOJUL = - выводить преобразование даты для функций даты (TOJUL на один символ меньше, чем TOGREG)
9,7 - теперь, когда это 7 длинных, Y4T будет CCYYDDD.
ADDDAYS - добавляет количество дней, корректируется автоматически, если переходит в следующий месяц / год (также могут быть ADDMONS и ADDYEARS)
PREVDSUN - наступает юлианская дата, расположено предыдущее воскресенье, TOGREG, чтобы получить правильный формат вывода, с разделителем "-" (может быть любым, что вам нравится в качестве разделителя)
12X - пробелы, чтобы убрать беспорядок, который позволил нам сделать это таким коротким способом
Выход из вышеперечисленного за 2014 год:
Что-то требуется, чтобы сказать СОРТУ, что делать. Там нет по умолчанию.
OPTION COPY
самый короткий,SORT FIELDS=COPY
эквивалентный, но более длинный.Саму работу он проделал на этот раз
OUTFIL
(чтобы разрешить использование REPEAT). Рабочий код может быть любым из 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) или 138 (70 + 68) (исключая начальные пробелы, принудительное продолжение и конечные пробелы).Учитывая, что получатель должен знать, что он делает, я думаю, что могу сказать, что код DFSORT для перечисления последнего воскресенья каждого месяца для любого года с 1900 года (будет выполняться с года 0001, но я избегаю исследования, так как хорошо) до 9999 (хотя DFSORT поддерживает годы до 9999, предыдущее решение не будет работать в 9999, так как 12-е число переходит в следующий год) можно твитнуть.
Почему код такой длинный, если есть особенно подходящие встроенные функции?
Определения полей эфемерны. Поле определяется только как конкретное местоположение в данных (которое является записью) для его немедленного использования. Иными словами, поля не определены как таковые, но определены для каждого использования и только для использования. Функции даты должны знать, какой (из многих) форматов даты используется для источника, и выходные данные должны быть в формате даты, так что это должно быть указано.
Теперь, когда у нас свидание в юлианском стиле ... TBC?
Нуждается в некоторых
JCL
И входной файл (еще одна строка JCL и три элемента данных instream):
Производит:
Будет действительно работать до 9999 года.
DFSORT - это продукт IBM для сортировки мэйнфреймов. Данными можно манипулировать, но поскольку сортировка является ключевой, а сортировки часто бывают большими и длительными, у контрольных карт DFSORT нет циклических конструкций, поэтому мы не можем поместить SORT в цикл. Делает вещи немного скучными для таких задач, как гольф.
Зачем размещать ответ, потому что DFSORT имеет
PREVDday
функцию. Так что в последнее воскресенье месяца это просто. Это предыдущее воскресенье (PREVDSUN) первого дня следующего месяца.Было также забавно делать это в пределах одного «операнда» (OVERLAY), немного похоже на то, чтобы делать все это внутри
sprintf
или аналогично.Вот это не разгромлено:
Хотя это и не совсем оскорбление, не принято пытаться втиснуть все это в один ОВЕРЛАЙ, и есть некоторые, казалось бы, ненужные вещи, которые необходимы, чтобы все это могло войти в один ОВЕРХЛЕЙ. Есть кое-что для игры в гольф, но так как он удалит только одну строчку, я не испытываю соблазна.
INREC обрабатывается для каждой записи.
OVERLAY позволяет изменять содержимое существующей записи. Если в процессе запись выходит за пределы его длины, это не проблема.
1,4 наступает год. К нему добавляется литерал 0201, а затем последовательные 1,8 повторяют это 11 раз, чтобы получить один длинный патрон из 96 байт,
К 12-му году расширенной текущей записи добавляется 1, а месяц - 1 (январь).
Оставшиеся 10 месяцев заменены на 3-11.
Тогда есть 12, в обратном порядке (из-за OVERLAY) этого типа вещи:
N: номер столбца в записи. X вставляет пробел. 89,8 берет данные из этого столбца / длины, Y4T обрабатывает их как дату CCYYMMDD, PREVDSUM определяет предыдущее воскресенье, TOGREG = Y4T (-) выводит их как григорианскую дату CCYY-MM-DD.
Поскольку вы получаете мусор, если источник и цель определенной части OVERLAY деструктивно перекрываются, финал
11:X,18,120,6X)
переставляет и маскирует немного беспорядка.Руководства и документы можно найти по адресу: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 , и включает руководство по программированию приложений DFSORT на 900+ страниц.
Как и для всех продуктов IBM, все руководства доступны бесплатно (за исключением мучительно небольшого количества очень дорогих книг, которые даже очень небольшое количество людей в мире даже притворятся, что поймут).
Все контрольные карты DFSORT должны начинаться с пробела. Столбец 72 используется только для продолжения (подойдет любой непустой, но * обычный). За столбцом 72 следует область порядкового номера, которая игнорируется, делая каждую запись 80 байтов.
Может быть, еще пара решений.
источник
Баш, 63 байта
Выход:
источник
for i in {1..12};{ date -v30d -v${i}m -v$1y -v0w +%Y-%m-%d;}
- 60 байт-v
Параметр кdate
является специфическим для даты BSD. Так что это работает на OSX, но не на большинстве Linux - возможно, это должно быть указано в ответе.Python 2 - 189 байт
Введите дату через STDIN.
Еще можно поиграть в гольф. Программа идет немного за борт, просто для удовольствия:
Примечания
zfill
необходимости в течение многих лет из-за диапазона ввода или дней, поскольку они всегда будут превышать 20Python 2 - 106 байт
Решение не так весело:
calendar.monthrange
возвращает два числа: день недели, с которого начинается месяц (w
), и количество дней в месяце (n
). Решение немного нелогично из-за уловки - возвращаемый день недели начинается с 0 для понедельника , а не воскресенья! Однако это компенсируется тем фактом, чтоn
он основан на 1.источник
$from calendar import monthrange as gt$V12AGH>QhN%"%d-%02d-%d"(QhN-H%+GH7
JavaScript (ES6) 155
145Редактировать Исправлены проблемы с часовым поясом. Может быть короче, если сделать рекурсивным. Может быть.
источник
new Date(y,0,++i,9)
. Кроме того, это терпит неудачу в течение 2100 и более високосных лет, поскольку у JS нет информации об этих високосных годах и, таким образом, вообще нетFeb 29
в високосных годах для 2100 года и выше.new Date(2014,0,26,9)
был воскресеньем давая правильнуюISO
строку, а также вgetDay()
качестве0
.JavaScript, ES6,
222 219199 байтЯ не видел никакого ответа JavaScript в розетке вики.
Вот так:
Это создает функцию,
S
которая возвращает строку с желаемым выводом. функция также заботится о високосных годах.Благодаря ES6, это работает только в последней версии Firefox.
Спасибо апсиллерам за полученный совет, уменьшенный до 200 байт
Найдите приведенную ниже версию в виде фрагмента стека, которую вы можете запустить здесь:
источник
2100
вывод2100-01-31 2100-02-28 2100-03-28 2100-04-25 2100-05-30 2100-06-27 2100-07-25 2100-08-29 2100-09-26 2100-10-31 2100-11-28 2100-12-26 2101-01-02
неверный.Реболь -
120 116 80 7976Ungolfed + некоторые аннотации:
Пример расчета воскресенья в консоли Rebol:
источник
CJam,
122102 байтаЭто не использует какую-либо форму библиотеки дат. Я думаю, что это все еще может быть много в гольфе.
Проверьте это здесь.
источник
R, 128 символов
С переносами строк:
источник
C # 255
Ungolfed
Изменить: изменено для печати только в последнее воскресенье :)
источник
д, 67
источник
"О, нет, он снова!"
Ява -
259246 байтБезголовая версия:
Использование:
Выход:
Еще один ответ «давайте поместим ответ Java только для ударов». Ну что ж. Но, по крайней мере, так как вы потрудились достичь этой точки моего ответа, я постараюсь утомить вас еще немного и объяснить мои рассуждения.
Метод
g
получает нужный год и для каждого месяца создаетGregorianCalendar
объект (месяцы идут от 0 до 11). Затем первыйc.set
устанавливает день недели как воскресенье, а второй объявляет, что мы хотим последнюю неделю месяца - как видно из официальной документации . ВSystem.out.println
распечатывает дату этого воскресенья (если мы делаем это правильно, год будет напечатан какc.get(c.YEAR)
, но с использованиемy
снова сбривает 13 символов), месяц должен быть отформатирован для добавления ведущего нуля с января по сентябрю (и значение увеличивается, потому что, ну, месяцы здесь представлены 0-11) и печатается день последнего воскресенья. И эта процедура повторяется в течение остальных одиннадцати месяцев.источник
C #,
212, 237С переносами строк
Выход за 2014 год
источник
C # 171
Функция, возвращающая строку.
Ungolfed
источник
C # 194
используя Linq:
Ungolfed
Выход
источник
Mathematica - 171
Обернутый в анонимную функцию, возвращает строку
Первая математика гольфа. Я чувствую, что это может быть существенно уменьшено.
источник
VB-192
Могло быть и хуже ^^
Моя вторая и последняя запись (не думаю, что я могу получить ее меньше)
142
источник
Ruby 76
Использует параметр командной строки
ruby sundays.rb 1900
. Использует библиотеку дат.источник