Печать даты всех воскресений в 2017 году в следующем формате: dd.mm.yyyy
.
Ожидаемый результат:
01.01.2017
08.01.2017
15.01.2017
22.01.2017
29.01.2017
05.02.2017
12.02.2017
19.02.2017
26.02.2017
05.03.2017
12.03.2017
19.03.2017
26.03.2017
02.04.2017
09.04.2017
16.04.2017
23.04.2017
30.04.2017
07.05.2017
14.05.2017
21.05.2017
28.05.2017
04.06.2017
11.06.2017
18.06.2017
25.06.2017
02.07.2017
09.07.2017
16.07.2017
23.07.2017
30.07.2017
06.08.2017
13.08.2017
20.08.2017
27.08.2017
03.09.2017
10.09.2017
17.09.2017
24.09.2017
01.10.2017
08.10.2017
15.10.2017
22.10.2017
29.10.2017
05.11.2017
12.11.2017
19.11.2017
26.11.2017
03.12.2017
10.12.2017
17.12.2017
24.12.2017
31.12.2017
code-golf
kolmogorov-complexity
date
ShinMigami13
источник
источник
Ответы:
Python 2 , 81 байт
Попробуйте онлайн!
Нет библиотеки дат, вычисляет даты напрямую. Основная хитрость заключается в обработке
dd.mm
десятичного значения. Например,16.04.2017
(16 апреля) соответствует номеру16.04
. Номер печатается в форматеxx.xx
с.2017
добавлением.День и месяц вычисляются арифметически. Каждая неделя добавляет 7 дней сделано как
x+=7
. Взятиеx
по модулю30.99
обрабатывает опрокидывание, вычитая30.99
всякий раз, когда число дня становится слишком большим. Это объединяет-31
для сброса дней с+0.01
увеличением месяца.Ролловер предполагает, что каждый месяц имеет 31 день. Месяцы с меньшим числом дней корректируются путем смещения
x
вверх на определенные номера недели с помощью+[8,8,8,17,25,38,47].count(x/7)
. В этом списке указаны номера недель, оканчивающиеся на эти короткие месяцы, с8
утроенным значением, поскольку в феврале на 3 дня не хватает 31 дня.Этот список может быть сжат в строку, принимая значения ASCII плюс 40. Смещения
+40
можно избежать, используя непечатаемые символы, и его можно получить короче как байтовый объект в Python 3.источник
'888z!}+'.count(chr(x%146))
сохраняет один байт.PHP, 48 байт
PHP, 46 байт (для неотрицательных смещений UTC)
источник
gmdate
для безопасности часового пояса? Это терпит неудачу на onlinephpfunctions.com. Отличная работа во всех других аспектах!Python 2 ,
9079 байт-5 байт с помощью xnor (не
считайте сами недели) -1 байт благодаря xnor (добавьте обратно в e для 605000 как 605e3)
Попробуйте онлайн!
0
секунд с начала 00:00:00 1 января 1970 года, который, как и 2017 год, не был високосным.605000
секунд составляет 1 неделю, 3 минуты, 20 секунд. Добавление 52 из этих «недель» не займет у нас больше полуночи.источник
605e3
. У меня есть некоторые идеи, хотя :)Bash + coreutils, 44 байта
может сохранить 2 байта,
-u
если предполагается GMT-f
параметр, дляdate
которого экономится 10 байт;@0
это 1970-1-1605000
одна неделя (604800
) плюс 200 с@32000000
чуть больше годаисточник
seq -f@%1.f 14833e5 605e3 1515e6|date -uf- +%d.%m.%Y
экономит 10 байт Вы, вероятно, должны заявить это как Bash + coreutils , хотя.PowerShell,
5147Довольно просто. 2017-01-01 это воскресенье, поэтому каждые последующие семь дней. Мы можем сохранить два байта, если нам нужно, чтобы скрипт работал только при моей жизни:
источник
(date 2017-1-1)+7.*$_
. Смотрите этот ответint
До сих пор я знал только о добавлении клещей и ниточек. Приятно знать.Excel VBA
1069179 байтсэкономили 15 байт благодаря @Radhato
Если предположить, что 01.01.2017 - воскресенье, это сэкономит еще 12 байтов.
Спасибо @ зубная щетка 66 байт
Изменить: (Sub и End Sub не требуется) 52 байта
источник
Sub p:For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next:End Sub
- это действительный код VBA, размер которого составляет всего 66 байтов. Тот факт, что редактор VBA добавляет лишние пробелы, не имеет значения.PHP, 67 байт
Используя тот факт, что PHP автоматически присваивает значение 1 необъявленным переменным цикла, и используя время эпохи Linux,
источник
<?for(;54>++$t;)echo date("d.m.Y\n",605e3*$t+148263e4);
должно быть в порядкеphp -r
так что вам не нужно ,<?php
и?>
поэтому может рассчитывать это как59 bytes
как @JonathanAllan правильно сказал. Вам не нужны скобки вокруг$t
. Несколько других гольфов, и вы в конечном итогеfor(;++$t<54;)echo date("d.m.Y\n",605e3*$t+14827e5);
для51 bytes
(в моем часовом поясе). Вы можете заменить "\ n" реальным разрывом строки, который составляет всего 1 байт, следовательно, это 51 байт.gmdate
вместоdate
безопасности часового пояса.к6, 32 байта
Краткое объяснение:
Увы, похоже, что это работает только в интерпретаторе с закрытым исходным кодом, только по запросу.
источник
Пайк ,
2624 байтаПопробуйте онлайн!
Или 11 байт
Если разрешено игнорировать выходной формат
Попробуйте онлайн!
источник
R,
796758 байтПервое воскресенье января, воскресенье, создает последовательность дней, каждые 7 дней, начиная с 01-01-2017 по 31-12-2017, форматирует их в желаемый формат и распечатывает.
источник
print(as.Date("2017-01-01")+seq(7,365,7))
Befunge-98 (PyFunge) ,
99959385 байт, Листья в конце новой строкиВсе оптимизации были сделаны @JoKing благодаря им
Попробуйте онлайн!
Я чувствовал, что мы упускаем некоторую эзостерию здесь, поэтому я нашел решение на своем любимом эзостерическом языке.
Объяснение :
>8><><>><><>
Кодирует продолжительность 12 месяцев.s
Сохраните старый день в пустом пространстве.:1g2/
Получите значение ASCII из нижней строки и разделите его на два, что даст нам длину данного месяца. Пример: 8 = 56 в ASCII => 56 / 2 = 28 => Месяц (февраль) имеет 28 дней10g\%
Получите ранее сохраненный день и по модулю его на длину месяца, что позволяет нам перенести дату в следующий месяц.:d1p
Сохраните копию нового обновленного дня.10g\`+
Проверьте, если старая дата > новая дата => мы перешли в следующий месяц => добавить 1 к счетчику месяца:b`
Проверить, если счетчик месяца> 11, что означает, что мы достигли конца года (с использованием индексации 0)#@_
На основе предыдущего, если программа завершится,:1\0d1g
переупорядочить стек так это выглядит так:Month, 1, Month, 0, Day
#
пропустить следующую инструкцию (duh)1+:a/'0+,a%'0+,'.,
Преобразовать число в 1, индексировать, распечатать, добавить.
в конце.j;
Используйте 0 из стека, чтобы не прыгать, и используйте;
клавишу, чтобы снова перейти к расписанию печати, затем используйте 1, чтобы перескочить через;
следующее времяa"7102"4k,
Печать2017\n
d1g
Получите значение дня снова7+
Добавьте неделю перед повторениемисточник
JavaScript,
111106 байтПримечание. Консоль Stack Exchange недостаточно длинна, чтобы отобразить весь список, поэтому вот первая половина в виде отдельного фрагмента:
Пользовательский формат стоит мне 40 байт ...
источник
Perl 5 , 64 байта
Попробуйте онлайн!
Задание было на 2017 год, а не на любой год, поэтому я жестко прописал:
POSIX является основным модулем и всегда устанавливается вместе с Perl5. Делаем то же самое без использования модулей в 101 байт, удаляя пробелы:
источник
Рубин, 75 байт
Простое решение, чтобы выяснить даты с
Time
.источник
t=Time.new 1
а затем выполнитьt.strftime"%d.%m.2017"
-1 байт.САС,
5250 байтСохранено 2 байта благодаря @ user3490.
источник
data;
вместо,data c;
и это экономит 2 байта. Я думаю, что вам нужноrun;
хотя.data _null_
? Такжеrun
подразумевается утверждение, если оно отсутствует.datan
соглашением об именах.Mathematica
9084 байтаДовольно многословно. Numbermaniac и Scott Milner сохранили 5 и 1 байт соответственно.
источник
Most@
? Вывод кажется одинаковым без него.Most
был там, чтобы избежать первого воскресенья 2018 года. Первоначально я тестировал код безMost
, в течение 2011, 2012 годов, и в этом случае первое воскресенье 2012 года включается в выходные данные. (Вот почему я включил его в код.) Странно,Most
не нужен для 2017-18. Также неMost
имеет никакого видимого влияния на результат. Таинственный!VBA, 81 байт (возможно, 64)
Мой первый пост. Опираясь на решение новичка, убирая чек на будни и просто указывая каждый 7-й день. Удаление даты экономит 12 байтов за штуку. 42736 от 01.01.2017. Выходной формат даты зависит от настроек системы. Это разрешено? Если это так, то это 64 байта, потому что вам не нужен метод форматирования .
источник
For i=0To 52
иFormat(42736+i*7,"dd.mm.yyyy")
. Кроме того, вы можете просто использоватьNext
вместоNext i
.AHK , 67 байт
Ничего волшебного здесь не происходит. Я пытался найти более короткое средство,
FormatTime
но я потерпел неудачу.источник
Java 8+,
10410099 байтJava 5+,
109105104 байтаИспользует дату-возможности
printf
формата.Попробуйте сами!
экономия
источник
T-SQL, 94 байта
если вам не нравится SQL GOTO или WHILE, вот решение CTE размером 122 байта
источник
08.01.2017
не01.01.2017
Рубин, 60 + 7 = 67 байт
Использует
-rdate
флаг.источник
Groovy,
8177636056 байтВыше может быть запущен как Groovy скрипт.
Моя первая запись в гольф. К счастью, 1970 год не был високосным, поэтому можно использовать его в качестве основы.
Спасибо Деннису, вот: попробуй онлайн!
источник
53.times{printf('%td.%<tm.2017%n',new Date(0)+it*7)}
, 52 байта. Защищая честь Groovy здесь ...C #,
138111102 байтаБлагодаря Johan du Toit удалось сэкономить еще 9 байтов !
Сохранено 27 байтов благодаря предложениям Кевина Круйссена !
Анонимная функция, которая печатает все воскресенья в 2017 году.
Полная программа с негольфированным методом:
источник
.AddDays(7*i++)
? Тогда нет необходимости для.DayOfWeek<1
проверки. Мы знаем, что 01-01-2017 - воскресенье, и оттуда мы можем просто добавить 7 дней.System
них -System.DateTime
иSystem.Console.Write
?()=>{for(int i=0;i<53;)Console.Write(new DateTime(2017,1,1).AddDays(7*i++).ToString("dd.MM.yyyy\n"));};
using
операторы должны быть включены в число байтов.using
операторы для запуска кода должны быть подсчитаны. См. Этот мета-вопрос: мне нужно использовать импорт или я могу назвать класс простотой?C #,
110109 байтВы можете наслаждаться этой программой онлайн здесь
В этом решении мы:
Используйте OLE Automation Date (OADate), чтобы избежать «AddDay ()» от datetime.
FromOADate()
кажутся большими, но это равноnew DateTime(2017,1,1)
Запустите цикл в последнее воскресенье 2016 года, чтобы мы могли увеличиваться
+=
только с оператором . Этот оператор возвращает значение после завершения приращения.Увеличьте на 7 дней, чтобы перейти с воскресенья на воскресенье перед печатью даты.
Мы останавливаемся, как только наступило последнее воскресенье 2017 года.
ИспользуйтеDebug
вместо того,Console
чтобы сохранить два символаИзбегайте явного объявления и назначения переменных
источник
using System;
и переключитьсяConsole
изDebug
(что само по себе немного хитро, но я могу не найти никаких комментариев к мета относительно этого).Debug
наConsole
такDebug
требуется специфический включать. Однако я не соблюдаю «систему использования», потому что мой конкурент на этом языке этого не делает. Кроме того, вы не можете кодировать вне класса, который сам должен быть определен в пространстве имен. Я уверен, что большинство ответов C # на этом сайте не включают это. Так что теперь, мы бросаем все эти ответы на мусор? Мы понижаем их всех, чтобы заставить их подчиниться? Если это так, то сообщество также может полностью запретить использование c # для Codegolf.using
директиву или полностью определить методы и типы, пожалуйста, не принимайте это на свой счет. Я долгое время играю в гольф на C # и ценю, как выглядят произвольные правила, поэтому я люблю подталкивать людей в правильном направлении, когда могу. Я специально «нацеливаюсь» на ответы C #, потому что я относительно хорошо осведомлен по этому вопросуusing System;
(я полагаю, это не было преднамеренным), так что это 109 байтов.TSQL,
112105 байтдемонстрация
Синтаксис преобразования в T-SQL
источник
DAY
наd
. Это делает то же самое.'20170101'
на42734
. Даты номера. Время - это десятичная часть числа.JavaScript (ES6), 123 байта
Это мой первый пост здесь, привет!
Это решение использует жестко закодированные данные и разработано специально для 2017 года. Оно не использует API даты / времени.
Что касается цифр в строке
155274263153
, каждая цифра является собственным числом и обозначает первое воскресенье каждого месяца подряд. Выходные данные за весь год могут быть получены путем последовательного добавления 7 к ним.Как насчет магического числа
2633
, используемого в цикле?Ну ...
2633
(десятичный)101001001001
в двоичном виде. Что же это может1
значить? Начиная справа, устанавливаются 1-й, 4-й, 7-й, 10-й и 12-й биты. Это соответствует месяцам с пятью воскресеньями, а не четырем. Golfed вниз к этому меткому выражению, он изначально выглядел следующим образом :for(j=0;j<4+ +[0,3,6,9,11].includes(i);j++)
.Я предполагаю, что остальные части довольно очевидны.
источник
ECMAScript 2015
наJavascript (ES6)
, но ... ты сломал мой код, и мне пришлось отменить его.a=
кода на самом деле не работает .T-SQL,
7977 байтПосле помощи Салмана А улучшить свой ответ . Я решил написать свой, используя цикл и
PRINT
.Я закончил с этим решением 90 байтов.
Затем я посмотрел на текущего лидера в T-SQL, который был 94 байта от WORNG ALL с этим ответом . Этот парень нашел очень хорошие трюки.
@
GOTO
вместо фактического циклаFORMAT
вместоCONVERT
. (Только SSMS2012 +)Используя эти приемы, это решение было обрезано до решения ниже, что составляет 79 байтов.
источник
октава , 37 байт
Гораздо короче, чем все другие языки, не относящиеся к гольфу, и это даже связано с желе! Путь в октаву! :)
Попробуйте онлайн!
К счастью, год
2 AD
выглядит точно так же, как год2017 AD
. Оба начинаются и заканчиваются в воскресенье, и ни один из них не является високосным. Это экономит много байтов, так367:7:737
как немного короче736696:7:737060
.Это преобразует количество прошедших дней
01.01.0001
в строку в форматеDD.mm
с завершающим.2017
.источник
Haskell ,
133130 байтПопробуйте онлайн!
Без календарной библиотеки,
148144140 байтЭто забавно, поскольку использование оператора для функции заполнения экономит два байта, даже если второй аргумент не используется, так как требуется меньше скобок -
p(last l)
он длиннееlast l!l
. Работает путем расчетаday/month
пар путем вычитания суммарных дат начала месяца из дня года. Даты начала месяца сжимаются как (scanl((+).(+28))0[3,0,3,2,3,2,3,3,2,3,2]
). Номер месяца - это число положительных элементов, а номер дня - последний положительный элемент.Попробуйте онлайн!
источник
C #,
116114113 байтовfor(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(new DateTime(i).ToString("dd.MM.yyyy\n"));
Может быть запущен в интерактивных окнах Visual Studio (или любой другой C # REPL на основе Roslyn)
До 113 байтов: благодаря Кевину Круйссену.
источник
for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(new DateTime(i).ToString("dd.MM.yyyy\n"));
using System;
Console.WriteLine(string)