Распечатать все воскресенья в 2017 году

27

Печать даты всех воскресений в 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
ShinMigami13
источник
1
Возможен ли дурак по планированию воскресенья ? Это определенный год, хотя.
xnor
1
Я проверил Планирование воскресений перед публикацией, но он просит распечатать воскресенья в определенном месяце. @xnor
ShinMigami13
1
Любая конкретная причина для этого конкретного формата вывода? Вы можете открыть немного вверх.
Rɪᴋᴇʀ
4
Мне на самом деле нравится это как точный текст колмогоровского вызова. Правильное форматирование даты имеет некоторые интересные оптимизации.
xnor
5
В любом случае, я думаю, что близкие голоса должны быть отозваны.
Эрик Outgolfer

Ответы:

16

Python 2 , 81 байт

x=0
exec"print'%05.2f.2017'%(x%30.99+1.01);x+=7+'0009ANW'.count(chr(x/7+40));"*53

Попробуйте онлайн!

Нет библиотеки дат, вычисляет даты напрямую. Основная хитрость заключается в обработке 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.

XNOR
источник
Какой классный ответ! '888z!}+'.count(chr(x%146))сохраняет один байт.
Линн
10

PHP, 48 байт

while($t<53)echo gmdate("d.m.2017
",605e3*$t++);

PHP, 46 байт (для неотрицательных смещений UTC)

while($t<53)echo date("d.m.2017
",605e3*$t++);
user63956
источник
1
Разве это не должно быть gmdateдля безопасности часового пояса? Это терпит неудачу на onlinephpfunctions.com. Отличная работа во всех других аспектах!
Тит
9

Python 2 , 90 79 байт

-5 байт с помощью xnor (не
считайте сами недели) -1 байт благодаря xnor (добавьте обратно в e для 605000 как 605e3)

from time import*
i=0
exec"print strftime('%d.%m.2017',gmtime(i));i+=605e3;"*53

Попробуйте онлайн!

0секунд с начала 00:00:00 1 января 1970 года, который, как и 2017 год, не был високосным. 605000секунд составляет 1 неделю, 3 минуты, 20 секунд. Добавление 52 из этих «недель» не займет у нас больше полуночи.

Джонатан Аллан
источник
Вот более короткий способ генерации арифметической прогрессии.
xnor
@xnor Спасибо, я работал над такими же вещами и пытался пойти на понижение, но 81 кажется слишком многим для библиотечного подхода.
Джонатан Аллан
@xnor ... или нет.
Джонатан Аллан
1
Ницца! Номер может быть 605e3. У меня есть некоторые идеи, хотя :)
xnor
7

Bash + coreutils, 44 байта

seq -f@%f 0 605e3 32e6|date -uf- +%d.%m.2017

может сохранить 2 байта, -uесли предполагается GMT

  • Благодаря Digital Trauma указать -fпараметр, для dateкоторого экономится 10 байт;
  • А использование в 2017 форматной строке сохраняет больше байт, идея которого от ответа дается user63956

  • @0 это 1970-1-1
  • 605000одна неделя ( 604800) плюс 200 с
    • 200 сек должен просто работать, так как в году всего 52 недели
  • @32000000 чуть больше года
ТТГ
источник
seq -f@%1.f 14833e5 605e3 1515e6|date -uf- +%d.%m.%Yэкономит 10 байт Вы, вероятно, должны заявить это как Bash + coreutils , хотя.
Цифровая травма
7

PowerShell, 51 47

0..52|%{date((date 2017-1-1)+7.*$_)-u %d.%m.%Y}

Довольно просто. 2017-01-01 это воскресенье, поэтому каждые последующие семь дней. Мы можем сохранить два байта, если нам нужно, чтобы скрипт работал только при моей жизни:

0..52|%{date((date 17-1-1)+7.*$_)-u %d.%m.%Y}
детеныш
источник
1
Вы можете сохранить несколько байт , если вы, вместо строки, добавьте двойное представляющее количество дней, то есть (date 2017-1-1)+7.*$_. Смотрите этот ответ
Данко Дурбич
@ DankoDurbić: Ого, вау. intДо сих пор я знал только о добавлении клещей и ниточек. Приятно знать.
Джои
5

Excel VBA 106 91 79 байт

Sub p()
For i = #1/1/2017# To #12/31/2017#
If Weekday(i) = 1 Then MsgBox i
Next
End Sub

сэкономили 15 байт благодаря @Radhato

Если предположить, что 01.01.2017 - воскресенье, это сэкономит еще 12 байтов.

Sub p()
For i = #1/1/2017# To #12/31/2017#
MsgBox i
i = i + 6
Next
End Sub

Спасибо @ зубная щетка 66 байт

Sub p:For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next:End Sub

Изменить: (Sub и End Sub не требуется) 52 байта

For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next
Рохан
источник
Можно улучшить, изменив значение For i = 42736 до 43100 до For i = # 1/1/2017 # To #
12/31/2017
@Radhato, но не увеличит ли это размер байта?
Рохан
Я думаю, что это уменьшает его до 96 .. по крайней мере, это то, что я посчитал лол
Радхато
Да, это так. Спасибо
Рохан
1
@newguy Sub p:For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next:End Sub- это действительный код VBA, размер которого составляет всего 66 байтов. Тот факт, что редактор VBA добавляет лишние пробелы, не имеет значения.
Зубная щетка
4

PHP, 67 байт

Используя тот факт, что PHP автоматически присваивает значение 1 необъявленным переменным цикла, и используя время эпохи Linux,

<?php for(;54>$t+=1;)echo date("d.m.Y\n",604800*($t)+1482624000);?>
ShinMigami13
источник
Добро пожаловать в PPCG! Я считаю, что это можно считать 59 байтами (хотя я сам не играю в гольф в PHP).
Джонатан Аллан
4
<?for(;54>++$t;)echo date("d.m.Y\n",605e3*$t+148263e4);должно быть в порядке
tsh
2
Всегда приятно видеть новых игроков в PHP! Вы разрешено использовать , php -rтак что вам не нужно , <?phpи ?>поэтому может рассчитывать это как 59 bytesкак @JonathanAllan правильно сказал. Вам не нужны скобки вокруг $t. Несколько других гольфов, и вы в конечном итоге for(;++$t<54;)echo date("d.m.Y\n",605e3*$t+14827e5);для 51 bytes(в моем часовом поясе). Вы можете заменить "\ n" реальным разрывом строки, который составляет всего 1 байт, следовательно, это 51 байт.
Кристоф
1
Спасибо @Christoph, я пробую другой подход, скоро
обновлю
Помимо всех других советов, вы можете использовать gmdateвместо dateбезопасности часового пояса.
Тит
4

к6, 32 байта

`0:("."/|"."\)'$2017.01.01+7*!53

Краткое объяснение:

                2017.01.01+7*!53 /add 0, 7, 14, ..., 364 to January 1st
   ("."/|"."\)'$                 /convert to string, turn Y.m.d into d.m.Y
                                 /   split by ".", reverse, join by "."
`0:                              /output to stdout (or stderr), line by line

Увы, похоже, что это работает только в интерпретаторе с закрытым исходным кодом, только по запросу.

Выполнение команды в интерпретаторе с закрытым исходным кодом.

zgrep
источник
4

Пайк , 26 24 байта

53 Fy17y"RVs6)c"%d.%m.%Y

Попробуйте онлайн!

53 F                     - for i in range(53):, printing a newline between each
    y17y"                -  Create a time object with the year 2017. (Month and days are initialised to 1.)
         RV  )           -  Repeat i times:
           s6            -   Add 1 week
              c"%d.%m.%Y -  Format in "dd.mm.yyyy" time

Или 11 байт

Если разрешено игнорировать выходной формат

y17y"52VDs6

Попробуйте онлайн!

y17y"       - Create a time object with the year 2017. (Month and days are initialised to 1.)
     52V    - Repeat 52 times:
        D   -  Duplicate the old time
         s6 -  Add 1 week
синий
источник
3

R, 79 67 58 байт

cat(format(seq(as.Date("2017/01/01"),,7,53),"\n%d.%m.%Y"))

Первое воскресенье января, воскресенье, создает последовательность дней, каждые 7 дней, начиная с 01-01-2017 по 31-12-2017, форматирует их в желаемый формат и распечатывает.

plannapus
источник
Это должно уменьшить его до 41 байтаprint(as.Date("2017-01-01")+seq(7,365,7))
считать
@count Спасибо, но он не будет печатать требуемый вывод (т. е. «2017.01.01» вместо «2017/01/01»)
plannapus,
3

Befunge-98 (PyFunge) , 99 95 93 85 байт, Листья в конце новой строки

Все оптимизации были сделаны @JoKing благодаря им

s :1g2/10g\%:d1p10g\`+:b`#@_:1\0d1g#;1+:a/'0+,a%'0+,'.,j;a"7102"4k,d1g7+
>8><><>><><>

Попробуйте онлайн!

Я чувствовал, что мы упускаем некоторую эзостерию здесь, поэтому я нашел решение на своем любимом эзостерическом языке.

Объяснение :
>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+Добавьте неделю перед повторением

IQuick 143
источник
@JoKing Omc такая очевидная оптимизация! Как я мог пропустить это? Спасибо.
IQuick 143
1
Еще несколько байтов. Попробуйте онлайн! Один - от изменения перехода на -17 вместо комментария, один - от использования индексации на основе нуля для счетчика месяца, а другой - от перехода на однострочник
Джо Кинг,
@JoKing Вау, ты много играл в гольф. Позвольте мне добавить это к ответу.
IQuick 143
1
Черт, почему бы не сделать индексированные дни 0 также, и избавить от необходимости делать какую-либо инициализацию вообще! 85 байт
Джо Кинг,
3

JavaScript, 111 106 байт

for(i=14833e8;i<1515e9;i+=605e6)console.log(new Date(i).toJSON().replace(/(....).(..).(..).*/,'$3.$2.$1'))

Примечание. Консоль Stack Exchange недостаточно длинна, чтобы отобразить весь список, поэтому вот первая половина в виде отдельного фрагмента:

for(i=14833e8;i<15e11;i+=605e6)console.log(new Date(i).toJSON().replace(/(....).(..).(..).*/,'$3.$2.$1'))

Пользовательский формат стоит мне 40 байт ...

Нил
источник
2

Perl 5 , 64 байта

use POSIX;print strftime"%d.%m.%Y\n",0,0,0,7*$_+1,0,117for 0..52

Попробуйте онлайн!

Задание было на 2017 год, а не на любой год, поэтому я жестко прописал:

  • 117 (что за год 2017, 1900 + 117)
  • +1, потому что 1 января - воскресенье 2017 года
  • 0..52, потому что в 2017 году есть 53 воскресенья

POSIX является основным модулем и всегда устанавливается вместе с Perl5. Делаем то же самое без использования модулей в 101 байт, удаляя пробелы:

$$_[5]==117&&printf"%02d.%02d.%d\n",$$_[3],$$_[4]+1,$$_[5]+1900
  for map[gmtime(($_*7+3)*86400)],0..1e4
Кжетил С.
источник
2

Рубин, 75 байт

Простое решение, чтобы выяснить даты с Time.

t=Time.new 2017
365.times{puts t.strftime("%d.%m.%Y")if t.sunday?
t+=86400}
snail_
источник
1
Если вы добавляете целую неделю (604800 секунд), вам не нужно проверять воскресенье, просто повторите 53 раза.
GB
1
Если вы выполняете трюк, предложенный @GB, и больше не проверяете на воскресенье, вы также можете инициализировать с помощью, t=Time.new 1а затем выполнить t.strftime"%d.%m.2017"-1 байт.
Value Ink
2

САС, 52 50 байт

Сохранено 2 байта благодаря @ user3490.

data;do i=20820to 21184 by 7;put i ddmmyyp10.;end;
J_Lard
источник
Вам не нужно указывать набор данных - просто используйте data;вместо, data c;и это экономит 2 байта. Я думаю, что вам нужно run;хотя.
user3490
@ user3490 Спасибо, я не знал об этом. Я думаю, что это эквивалент data _null_? Также runподразумевается утверждение, если оно отсутствует.
J_Lard
Не совсем эквивалентно - вы получите выходной набор данных в соответствии с datanсоглашением об именах.
user3490
2

Mathematica 90 84 байта

Довольно многословно. Numbermaniac и Scott Milner сохранили 5 и 1 байт соответственно.

Column[#~DateString~{"Day",".","Month",".","Year"}&/@DayRange["2017","2018",Sunday]]
DavidC
источник
Вам нужен Most@? Вывод кажется одинаковым без него.
Numbermaniac
1
@numbermaniac, спасибо. Mostбыл там, чтобы избежать первого воскресенья 2018 года. Первоначально я тестировал код без Most, в течение 2011, 2012 годов, и в этом случае первое воскресенье 2012 года включается в выходные данные. (Вот почему я включил его в код.) Странно, Mostне нужен для 2017-18. Также не Mostимеет никакого видимого влияния на результат. Таинственный!
DavidC
1

VBA, 81 байт (возможно, 64)

Sub p()
For i = 0 To 52
MsgBox format(42736 + i * 7, "dd.mm.yyyy")
Next i
End Sub

Мой первый пост. Опираясь на решение новичка, убирая чек на будни и просто указывая каждый 7-й день. Удаление даты экономит 12 байтов за штуку. 42736 от 01.01.2017. Выходной формат даты зависит от настроек системы. Это разрешено? Если это так, то это 64 байта, потому что вам не нужен метод форматирования .

MsgBox #1/1/2017# + i * 7
Сломал папочка
источник
Вы также можете удалить много пустого пространства , которое автоматически отформатировано. Например, и For i=0To 52и Format(42736+i*7,"dd.mm.yyyy"). Кроме того, вы можете просто использовать Nextвместо Next i.
Тост инженера
1

AHK , 67 байт

d=20170101
Loop,52{
FormatTime,p,%d%,dd.MM.yyyy
Send,%p%`n
d+=7,d
}

Ничего волшебного здесь не происходит. Я пытался найти более короткое средство, FormatTime но я потерпел неудачу.

Инженер Тост
источник
1

Java 8+, 104 100 99 байт

()->{for(int t=0;t<53;)System.out.printf("%1$td.%1$tm.2017%n",new java.util.Date(t++*604800000L));}

Java 5+, 109 105 104 байта

void f(){for(int t=0;t<53;)System.out.printf("%1$td.%1$tm.2017%n",new java.util.Date(t++*604800000L));}

Использует дату-возможности printfформата.

Попробуйте сами!

экономия

  1. 104 -> 100: изменились значения цикла и мультипликатор.
  2. 100 -> 99: игра в гольф
Оливье Грегуар
источник
1

T-SQL, 94 байта

DECLARE @ INT=0,@_ DATETIME='2017'W:SET @+=1SET @_+=7PRINT FORMAT(@_,'dd.MM.yyy')IF @<52GOTO W

если вам не нравится SQL GOTO или WHILE, вот решение CTE размером 122 байта

WITH C AS(SELECT CAST('2017'AS DATETIME)x UNION ALL SELECT x+7FROM C WHERE X<'12-31-17')SELECT FORMAT(x,'dd.MM.yyy')FROM C
РАБОТАЙТЕ ВСЕМ
источник
Ваше первое решение начинается с 08.01.2017не01.01.2017
grabthefish
1
Очень хорошие трюки в вашем решении. Отличная работа. Я не мог удержаться, чтобы одолжить их. ;)
AXMIM
1

Рубин, 60 + 7 = 67 байт

Использует -rdateфлаг.

(d=Date.new 1).step(d+365,7){|d|puts d.strftime"%d.%m.2017"}
Значение чернил
источник
1

Groovy, 81 77 63 60 56 байт

d=new Date(0);53.times{printf('%td.%<tm.2017%n',d);d+=7}

Выше может быть запущен как Groovy скрипт.

Моя первая запись в гольф. К счастью, 1970 год не был високосным, поэтому можно использовать его в качестве основы.

Спасибо Деннису, вот: попробуй онлайн!

Кристиан
источник
Добро пожаловать в Программирование Пазлов и Code Golf! Если вам интересно, вот постоянная ссылка: попробуйте онлайн!
Деннис
Спасибо @Dennis, я не знал, что это существовало :)
Кристиан
Вы можете сохранить четыре байта, перемещая дату в блоке времен 53.times{printf('%td.%<tm.2017%n',new Date(0)+it*7)}, 52 байта. Защищая честь Groovy здесь ...
Матиас Бьярланд,
1

C #, 138 111 102 байта

Благодаря Johan du Toit удалось сэкономить еще 9 байтов !

Сохранено 27 байтов благодаря предложениям Кевина Круйссена !

()=>{for(int i=0;i<53;)Console.Write(new DateTime(2017,1,1).AddDays(7*i++).ToString("dd.MM.yyyy\n"));}

Анонимная функция, которая печатает все воскресенья в 2017 году.

Полная программа с негольфированным методом:

using System;

class P
{
    static void Main()
    {
        Action f =
        ()=>
        {
            for (int i = 0; i < 53; )
                Console.Write(new DateTime(2017, 1, 1).AddDays(7 * i++).ToString("dd.MM.yyyy\n"));
        };



        f();
    }
}
adrianmp
источник
1
Не проще ли просто использовать .AddDays(7*i++)? Тогда нет необходимости для .DayOfWeek<1проверки. Мы знаем, что 01-01-2017 - воскресенье, и оттуда мы можем просто добавить 7 дней.
Кевин Круйссен
2
Не уверен насчет этого - во всех играх с кодом, в которых я участвую, я всегда использовал полное пространство имен - но разве вы не пропускаете некоторые из 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"));};
Йохан дю Туа
@auhmaan: Да, следует использовать либо полные пространства имен, либо usingоператоры должны быть включены в число байтов.
Разнагул
3
@adrianmp: необходимые usingоператоры для запуска кода должны быть подсчитаны. См. Этот мета-вопрос: мне нужно использовать импорт или я могу назвать класс простотой?
Разнагул
1

C #, 110 109 байт

using System;()=>{for(int i=42729;i<43100;Console.Write(DateTime.FromOADate(i+=7).ToString("dd.MM.yyy\n")));}

Вы можете наслаждаться этой программой онлайн здесь

В этом решении мы:

  • Используйте OLE Automation Date (OADate), чтобы избежать «AddDay ()» от datetime.
    FromOADate()кажутся большими, но это равноnew DateTime(2017,1,1)

  • Запустите цикл в последнее воскресенье 2016 года, чтобы мы могли увеличиваться +=только с оператором . Этот оператор возвращает значение после завершения приращения.

  • Увеличьте на 7 дней, чтобы перейти с воскресенья на воскресенье перед печатью даты.

  • Мы останавливаемся, как только наступило последнее воскресенье 2017 года.

  • Используйте Debugвместо того, Consoleчтобы сохранить два символа

  • Избегайте явного объявления и назначения переменных

AXMIM
источник
Если не указано иное, наши значения по умолчанию говорят, что вы должны предоставить функцию или программу (т. Е. Не фрагмент), и вам нужно определить Debug и DateTime : я бы рекомендовал добавить using System;и переключиться Consoleиз Debug(что само по себе немного хитро, но я могу не найти никаких комментариев к мета относительно этого).
VisualMelon
1
@VisualMelon я выполнил «обеспечивают функцию» , и я также заменить Debugна Consoleтак Debugтребуется специфический включать. Однако я не соблюдаю «систему использования», потому что мой конкурент на этом языке этого не делает. Кроме того, вы не можете кодировать вне класса, который сам должен быть определен в пространстве имен. Я уверен, что большинство ответов C # на этом сайте не включают это. Так что теперь, мы бросаем все эти ответы на мусор? Мы понижаем их всех, чтобы заставить их подчиниться? Если это так, то сообщество также может полностью запретить использование c # для Codegolf.
AXMIM
Эти «правила» как раз то, что сообщество со временем установило (и задокументировало на мета). Мы не занижаем ответы, мы комментируем и тоже не голосуем. Когда они их исправят, тогда мы свободны в голосовании. Оба других ответа C # содержат комментарии, предлагающие добавить usingдирективу или полностью определить методы и типы, пожалуйста, не принимайте это на свой счет. Я долгое время играю в гольф на C # и ценю, как выглядят произвольные правила, поэтому я люблю подталкивать людей в правильном направлении, когда могу. Я специально «нацеливаюсь» на ответы C #, потому что я относительно хорошо осведомлен по этому вопросу
VisualMelon
1
@ VisualMelon Справедливо, я все равно здесь просто прохожий. Поэтому я приму ваши правила, пока я здесь. Поэтому на этот раз я попытался привести свой ответ в соответствие.
AXMIM
1
Выглядит хорошо для меня! +1 за оригинальный подход. И вам не нужно пространство после using System;(я полагаю, это не было преднамеренным), так что это 109 байтов.
VisualMelon
1

TSQL, 112 105 байт

SELECT CONVERT(VARCHAR,DATEADD(d,number*7,42734),104)FROM master..spt_values WHERE type='p' AND number<53

демонстрация

Синтаксис преобразования в T-SQL

Салман А
источник
Вы можете сохранить 2 байта, заменив DAYна d. Это делает то же самое.
AXMIM
+1 Вы можете сохранить еще 3 байта, заменив '20170101'на 42734. Даты номера. Время - это десятичная часть числа.
AXMIM
1

JavaScript (ES6), 123 байта

Это мой первый пост здесь, привет!

a=x=>`0${x}.`.slice(-3);[].map.call('155274263153',(x,i)=>{for(j=0;j<4+(2633>>i&1);j++)console.log(a(+x+j*7)+a(i+1)+2017)})

Это решение использует жестко закодированные данные и разработано специально для 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++).

Я предполагаю, что остальные части довольно очевидны.

носорог
источник
@SIGSEGV: Я не возражаю против перехода ECMAScript 2015на Javascript (ES6), но ... ты сломал мой код, и мне пришлось отменить его.
носорог
О, это консенсус сообщества, разрешается иметь только лямбда-часть.
Мэтью Ро
@SIGSEGV Это не тот случай, здесь. Эта лямбда содержит только небольшую часть кода, и мне нужен этот идентификатор, чтобы иметь возможность использовать его в другом месте. Без a=кода на самом деле не работает .
носорог
1

T-SQL, 79 77 байт

После помощи Салмана А улучшить свой ответ . Я решил написать свой, используя цикл и PRINT.

Я закончил с этим решением 90 байтов.

DECLARE @d DATETIME=42734 WHILE @d<43100BEGIN PRINT CONVERT(VARCHAR,@d,104)SET @d=@d+7 END

Затем я посмотрел на текущего лидера в T-SQL, который был 94 байта от WORNG ALL с этим ответом . Этот парень нашел очень хорошие трюки.

  1. Назовите только переменную @
  2. Цикл с GOTO вместо фактического цикла
  3. Сохранить один символ, используя FORMATвместо CONVERT. (Только SSMS2012 +)

Используя эти приемы, это решение было обрезано до решения ниже, что составляет 79 байтов.

DECLARE @ DATETIME=42734G:PRINT FORMAT(@,'dd.MM.yyy')SET @+=7IF @<43100GOTO G
AXMIM
источник
Вы можете сохранить 2 байта, изменив @ = @ + 7 на @ + = 7 и убрав пробел между 7 и IF.
РАБОТАЕМ ВСЕМ
В этом посте , где я получил все хитрости, может помочь вам тоже.
РАБОТАЕМ ВСЕМ
1
@ WORNGALL удивительно, я не знал, что мы можем сделать это. Большое спасибо.
AXMIM
1

октава , 37 байт

Гораздо короче, чем все другие языки, не относящиеся к гольфу, и это даже связано с желе! Путь в октаву! :)

disp(datestr(367:7:737,'DD.mm.2017'))

Попробуйте онлайн!

К счастью, год 2 ADвыглядит точно так же, как год 2017 AD. Оба начинаются и заканчиваются в воскресенье, и ни один из них не является високосным. Это экономит много байтов, так 367:7:737как немного короче736696:7:737060 .

Это преобразует количество прошедших дней 01.01.0001в строку в формате DD.mmс завершающим .2017.

Стьюи Гриффин
источник
1

Haskell , 133 130 байт

import Data.Time.Calendar
((\[f,g,h,i,j]->i:j:'.':f:g:".2017\n").drop 5.show)=<<take 53(iterate(addDays 7)$fromGregorian 2017 1 1)

Попробуйте онлайн!

Без календарной библиотеки, 148 144 140 байт

(\l->last l!l++length l!l++"2017\n").fst.span(>0).(<$>scanl((+).(+28))0[3,0,3,2,3,2,3,3,2,3,2]).(-)=<<[1,8..365]
a!_=['0'|a<=9]++show a++"."

Это забавно, поскольку использование оператора для функции заполнения экономит два байта, даже если второй аргумент не используется, так как требуется меньше скобок - p(last l)он длиннее last l!l. Работает путем расчета day/monthпар путем вычитания суммарных дат начала месяца из дня года. Даты начала месяца сжимаются как (scanl((+).(+28))0[3,0,3,2,3,2,3,3,2,3,2] ). Номер месяца - это число положительных элементов, а номер дня - последний положительный элемент.

Попробуйте онлайн!

Angs
источник
0

C #, 116 114 113 байтов

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 байтов: благодаря Кевину Круйссену.

rmrm
источник
1
Не могли бы вы добавить ссылку TryItNow ? Кроме того, вы можете немного поиграть в гольф, используя цикл for вместо цикла while:for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(new DateTime(i).ToString("dd.MM.yyyy\n"));
Кевин Круйссен,
@KevinCruijssen К сожалению, я не могу найти подходящий компилятор на данной странице. Вот ссылка на используемую технологию, если вы хотите с ней связаться: ссылка . В любом случае, спасибо за новый цикл. :)
17
1
Если не указано иное, наши значения по умолчанию говорят, что вы должны предоставить функцию или программу (т. using System;Console.WriteLine(string)
Е.