Друкуйте всі неділі 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

1
Можлива дупа планувати свої неділі ? Цей рік - це конкретний рік.
xnor

1
Я перевірив, як планувати свої неділі перед публікацією, але він просить надрукувати неділі на певний місяць. @xnor
ShinMigami13

1
Якась конкретна причина для цього конкретного вихідного формату? Ви могли трохи відкритись.
Rɪᴋᴇʀ

4
Мені це справді подобається як точний текст колгового виклику. Правильне форматування дати має деякі цікаві оптимізації.
xnor

5
У будь-якому випадку, я думаю, що закриті голоси повинні бути відкликані.
Ерік Аутгольфер

Відповіді:


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.


Яка класна відповідь! '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++);

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

при збереженні -uGMT можна зберегти 2 байти

  • Завдяки цифрової 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для кліщів і струн протягом днів. Добре знати.
Joey

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

Якщо припустити, що 1/1/2017 є неділею, це збереже ще 12 байт.

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

Дякуємо @Toothbrush 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

Можна покращити, змінивши для i = 42736 до 43100 до для i = # 1/1/2017 # до #
12/31/2017

@Radhato, але хіба це не збільшить розмір байтів?
Рохан

Я думаю , що це знижує його до 96 .. по крайней мере , ось що я підрахованих лол
Radhato

Так, це було. Спасибі
Рохан

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);?>

Ласкаво просимо до 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, я пробую інший підхід, незабаром оновлюсь
оновлюсь ShinMigami13

Окрім усіх інших підказок, ви можете використовувати gmdateзамість dateбезпеки часового поясу.
Тит

4

k6, 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

На жаль, це, здається, працює лише в інтерпретаторі, що працює лише із закритим джерелом.

Running the command in the closed-source interpreter.


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, відформатує їх у потрібний формат і роздрукує.


Це повинно знизити його до 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 з нижнього рядка та розділіть його на два. Це дає нам тривалість заданого місяця. Ex: 8 = 56 в ASCII => 56 / 2 = 28 => Місяць (лютий) має 28 днів
10g\%Отримайте раніше збережений день і модулюйте його за тривалістю місяця, що дозволяє нам перевести дату в наступний місяць
:d1pЗберегти копію нового оновленого дня
10g\`+Тест, якщо стара дата > нова дата => ми перейшли в наступний місяць => додати 1 до місяця лічильника
:b`випробуванню , якщо місяць лічильник> 11 , що означає , що ми досягли кінця року ( з використанням 0 індексації)
#@_на основі попереднього , якщо припинити програму
:1\0d1g Reorder стеки так це виглядає так:Month, 1, Month, 0, Day
#пропустити наступну інструкцію (duh)
1+:a/'0+,a%'0+,'.,Перетворити число на 1 індексацію, надрукувати, додати a .в кінці
j;Використовуйте 0 зі стека, щоб не стрибати, і знову використовуйте ;для переходу до розкладу друку, потім використовуйте 1 для переходу до ;наступного час
a"7102"4k,Друк 2017\n
d1gОтримати знову значення дня 7+Додайте тиждень перед повторенням


@JoKing Omc така очевидна оптимізація! Як я міг пропустити це? Дякую.
IQuick 143

1
Ще кілька байтів. Спробуйте в Інтернеті! Один із зміни на -17 перейти на коментар, один із використання 0-базованої індексації для місячного лічильника та одного від зміни її на однолінійний
Джо Кінг

@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}

1
Якщо ви додасте цілий тиждень (604800 секунд), вам не потрібно перевіряти на неділю, просто повторіть 53 рази.
GB

1
Якщо ви зробите фокус, запропонований @GB, і більше не перевіряєте на неділю, ви також можете ініціалізувати, t=Time.new 1а потім зробити t.strftime"%d.%m.2017"для -1 байт.
Значення чорнила

2

SAS, 52 50 байт

Збережено 2 байти завдяки @ user3490.

data;do i=20820to 21184 by 7;put i ddmmyyp10.;end;

Вам не потрібно вказувати набір даних - просто використовувати data;замість цього data c;і це економить 2 байти. Я думаю, що вам все-таки потрібно run;.
користувач3490

@ user3490 Спасибі, я про це не знав. Я думаю, що це еквівалент data _null_? Також runтвердження мається на увазі, якщо воно відсутнє.
J_Lard

Не зовсім рівнозначно - ви отримуєте набір даних, що слідує datanконвенції про іменування.
користувач3490

2

Математика 90 84 байт

Досить багатослівний. numbermaniac та Скотт Мілнер зберегли відповідно 5 та 1 байт.

Column[#~DateString~{"Day",".","Month",".","Year"}&/@DayRange["2017","2018",Sunday]]

Вам потрібна 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

Моє перше повідомлення. Спираючись на рішення newguy, знімаючи чек на будні та просто вказуючи кожні 7-й день. Видалення фініків економить 12 байт. 42736 - 1/1/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

Groovy, 81 77 63 60 56 байт

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

Вищезазначене може бути запущено як грубий сценарій.

Мій перший запис про гольф з кодом. На щастя, 1970 рік не був високосним, тому можна використовувати його як базу.

Завдяки Деннісу, ось ось: Спробуйте в Інтернеті!


Ласкаво просимо до головоломки програмування та коду для гольфу! Якщо вам це цікаво, ось постійна посилання: Спробуйте це в Інтернеті!
Денніс

Дякую @Dennis, я не знав, що це існує :)
Krystian

Можна зберегти чотири байти, перемістивши дату всередині блоку разів,, 53.times{printf('%td.%<tm.2017%n',new Date(0)+it*7)}52 байти. Захищаючи тут шанобливу честь ...
Matias Bjarland

1

C #, 138 111 102 байт

Збережено ще 9 байт завдяки Йохану дю Тойте !

Збережено 27 байт завдяки пропозиціям Кевіна Круїссена !

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

Анонімна функція, яка друкує всі неділі 2017 року.

Повна програма за допомогою методу unolfolf:

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();
    }
}

1
Чи не простіше просто використовувати .AddDays(7*i++)? Тоді .DayOfWeek<1чека немає необхідності . Ми знаємо, що 01-01-2017 - це неділя, і звідти ми можемо просто продовжувати додавати 7 днів.
Кевін Кройсейсен

2
Не впевнений у цьому - у всіх кодах гольфів, в яких я беру участь, я завжди використовував повний простір імен, - але ви не пропускаєте там щось System- System.DateTimeі System.Console.Write?
auhmaan

Класно, але ви можете зберегти пару байтів:()=>{for(int i=0;i<53;)Console.Write(new DateTime(2017,1,1).AddDays(7*i++).ToString("dd.MM.yyyy\n"));};
Йохан дю Тойт

@auhmaan: Так, або повинні використовуватися повні простори імен, або usingоператори повинні бути включені до числа байтів.
raznagul

3
@adrianmp: Необхідні usingоператори для запуску коду повинні бути враховані. Дивіться це мета-питання: чи потрібно використовувати імпорт чи можу я назвати експліцитність класу?
raznagul

1

C #, 110 109 байт

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

Ви можете насолоджуватися цією програмою онлайн тут

У цьому розчині ми:

  • Використовуйте дату автоматизації OLE (OADate), щоб уникнути "AddDay ()" від дати.
    FromOADate()здаються великими, але це дорівнюєnew DateTime(2017,1,1)

  • Почніть цикл в останню неділю 2016 року, щоб дозволити нам збільшити +=лише оператор . Цей оператор повертає значення після приросту.

  • Збільшення на 7 днів, щоб перейти з неділі на неділю до друку дати.

  • Ми зупиняємось, як потрапила остання неділя 2017 року.

  • Використовуйте Debugзамість, Consoleщоб зберегти два символи

  • Уникайте явного оголошення змінної та призначення


Якщо не вказано інше, наші значення по замовчуванням , що ви повинні надати функції або програми (тобто не сниппета), і ви повинні кваліфікуватися 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фактичного LOOP
  3. Збережіть один символ, використовуючи FORMATзамість CONVERT. (Лише SSMS2012 +)

Використовуючи ці хитрощі, це рішення було приведено до розв'язку, нижче якого - 79 байт.

DECLARE @ DATETIME=42734G:PRINT FORMAT(@,'dd.MM.yyy')SET @+=7IF @<43100GOTO G

Ви можете зберегти 2 байти, змінивши @ = @ + 7 на @ + = 7 та видаливши пробіл між 7 та IF.
РОБОТАЙТЕ ВСЕ

У цій публікації я знайшов усі хитрощі, можливо, і вам допоможуть.
РОБОТАЙТЕ ВСІ

1
@WORNGALL дивовижно, я не знав, що ми можемо це зробити. Дуже дякую.
AXMIM

1

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

Набагато коротше, ніж усі інші мови для гольфу, і він навіть пов'язаний з Jelly! Шлях до Октави! :)

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++"."

Це смішно, оскільки використання оператора для функції padding зберігає два байти, навіть якщо другий аргумент не використовується, оскільки потрібно менше дужок - p(last l)довше, ніж last l!l. Працює, обчислюючи day/monthпари, віднімаючи сукупні дати початку місяця від дня року. Дати початку місяця стискаються як ( scanl((+).(+28))0[3,0,3,2,3,2,3,3,2,3,2]). Число місяця - це кількість позитивних елементів, а число дня - останній позитивний елемент.

Спробуйте в Інтернеті!


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


1
Чи можете ви додати посилання TryItNow ? Крім того, ви можете трохи for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(new DateTime(i).ToString("dd.MM.yyyy\n"));
пограти в

@KevinCruijssen На жаль, я не в змозі знайти відповідний компілятор на даній сторінці. Ось посилання на використану технологію, якщо ви хочете зв’язатися з нею: посилання . Все одно дякую за новий цикл. :)
rmrm

1
Якщо не вказано інше, наші параметри за замовчуванням говорять, що ви повинні надати функцію або програму (тобто не фрагмент), і вам потрібно кваліфікувати Debug and DateTime : рекомендую додати using System;та використовуватиConsole.WriteLine(string)
VisualMelon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.