Wydrukuj wszystkie niedziele w 2017 roku

27

Broszura daty wszystkie niedziele w roku 2017 w następującym formacie: dd.mm.yyyy.
Oczekiwany wynik:

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
źródło
1
Możliwy duplikat Zaplanuj swoje niedziele ? Ten rok jest jednak szczególny.
xnor
1
Sprawdziłem Zaplanuj swoje niedziele przed wysłaniem, ale prosi o wydrukowanie niedziel w danym miesiącu. @xnor
ShinMigami13 13.04.17
1
Czy jest jakiś konkretny powód tego konkretnego formatu wyjściowego? Możesz się trochę otworzyć.
Rɪᴋᴇʀ
4
Naprawdę podoba mi się to jako wyzwanie kolmogorov z tekstem. Poprawne formatowanie daty ma kilka interesujących optymalizacji.
xnor
5
W każdym razie uważam, że należy oddać bliskie głosy.
Erik the Outgolfer,

Odpowiedzi:

16

Python 2 , 81 bajtów

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

Wypróbuj online!

Brak bibliotek dat, bezpośrednio oblicza daty. Główną sztuczką jest traktowanie dd.mmwartości dziesiętnej. Na przykład 16.04.2017(16 kwietnia) odpowiada liczbie 16.04. Liczba jest drukowana w formacie zgodnym xx.xxz .2017dołączonym.

Dzień i miesiąc są obliczane arytmetycznie. Każdy tydzień dodaje 7 dni wykonanych jak x+=7. Biorąc xmodulo 30.99obsługuje rollover, odejmując, 30.99gdy liczba dni staje się zbyt duża. Łączy -31to resetowanie dni z +0.01przyrostem miesiąca.

Rolowanie zakłada, że ​​każdy miesiąc ma 31 dni. Miesiące z mniejszą liczbą dni są dostosowywane poprzez przesuwanie w xgórę niektórych numerów tygodni za pomocą +[8,8,8,17,25,38,47].count(x/7). Ta lista zawiera numery tygodni kończące się w tych krótkich miesiącach, 8potrojone, ponieważ w lutym brakuje 3 dni do 31.

Ta lista może zostać skompresowana do ciągu poprzez przyjęcie wartości ASCII plus 40. Przesunięcia +40można uniknąć, używając znaków niedrukowalnych, i można uzyskać do niej krótszy dostęp jako obiekt bajtów w Pythonie 3.

xnor
źródło
Co za fajna odpowiedź! '888z!}+'.count(chr(x%146))oszczędza jeden bajt.
Lynn
10

PHP, 48 bajtów

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

PHP, 46 bajtów (dla nieujemnych przesunięć UTC)

while($t<53)echo date("d.m.2017
",605e3*$t++);
użytkownik63956
źródło
1
Czy nie powinno to oznaczać gmdatebezpieczeństwa strefy czasowej? Nie działa na onlinephpfunctions.com. Świetna robota we wszystkich innych aspektach!
Tytus
9

Python 2 , 90 79 bajtów

-5 bajtów za pomocą xnor (unikaj liczenia samych tygodni)
-1 bajt dzięki xnor (dodaj ponownie e dla 605000 jako 605e3)

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

Wypróbuj online!

0sekund od epoki jest 00:00:00 1 stycznia 1970 r., co podobnie jak 2017 r. nie było rokiem przestępnym. 605000sekund to 1 tydzień, 3 minuty, 20 sekund. Dodanie 52 tych „tygodni” nie zajmie nam więcej niż północy.

Jonathan Allan
źródło
Oto krótszy sposób na wygenerowanie postępu arytmetycznego.
xnor
@xnor Dzięki, pracowałem nad tym samym rodzajem rzeczy i próbowałem zejść niżej, ale 81 wydaje się mieć wiele do wyboru z podejściem bibliotecznym.
Jonathan Allan
@xnor ... czy nie.
Jonathan Allan
1
Miły! Liczba może być 605e3. Mam jednak kilka pomysłów :)
xnor
7

Bash + coreutils, 44 bajty

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

może zaoszczędzić 2 bajty, -ujeśli zakłada się GMT

  • Dzięki Digital Trauma wskazuje -fparametry, dla datektórych oszczędza 10 bajtów;
  • I użycie 2017 w formacie ciąg oszczędza więcej bajtów, który pomysł pochodzi z odpowiedzi udzielonej przez user63956

  • @0 jest 1970-1-1
  • 605000to jeden tydzień ( 604800) plus 200 sekund
    • 200 sekund powinien działać, ponieważ jest tylko 52 tygodnie w roku
  • @32000000 to tylko trochę ponad rok
tsh
źródło
seq -f@%1.f 14833e5 605e3 1515e6|date -uf- +%d.%m.%Yoszczędza ci 10 bajtów. Prawdopodobnie powinieneś jednak twierdzić, że jest to Bash + coreutils .
Digital Trauma
7

PowerShell, 51 47

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

Dość bezpośredni. 01.01.2017 jest niedziela, podobnie jak co następne siedem dni. Możemy zapisać dwa bajty, jeśli potrzebujemy tylko skryptu, aby działał w moim życiu:

0..52|%{date((date 17-1-1)+7.*$_)-u %d.%m.%Y}
Joey
źródło
1
Możesz zapisać kilka bajtów, jeśli zamiast ciągu dodasz podwójną liczbę dni, tj (date 2017-1-1)+7.*$_. Zobacz tę odpowiedź
Danko Durbić
@ DankoDurbić: Och, wow. Do inttej pory wiedziałem tylko o dodawaniu kleszczy i sznurków. Dobrze wiedzieć.
Joey,
5

Excel VBA 106 91 79 bajtów

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

zapisano 15 bajtów dzięki @Radhato

Zakładając, że 1/1/2017 jest niedziela, zaoszczędzi to 12 kolejnych bajtów.

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

Dzięki @Toothbrush 66 bajtów

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

Edycja: (Sub i End Sub nie są konieczne) 52 bajty

For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next
Rohan
źródło
Można to poprawić, zmieniając dla i = 42736 na 43100 na dla i = # 1/1/2017 # do #
12/31/2017
@Radhato, ale czy to nie zwiększy rozmiaru bajtu?
Rohan
Myślę, że redukuje to do 96 .. przynajmniej tak
liczyłem
Tak. Dzięki
Rohan
1
@newguy Sub p:For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next:End Subjest doskonale poprawnym kodem VBA i ma tylko 66 bajtów. Fakt, że Edytor VBA dodaje dodatkowe spacje, nie ma znaczenia.
Szczoteczka do zębów
4

PHP, 67 bajtów

Wykorzystując fakt, że PHP automatycznie przypisuje wartość 1 niezadeklarowanym zmiennym pętli i używając czasów epoki Linuksa,

<?php for(;54>$t+=1;)echo date("d.m.Y\n",604800*($t)+1482624000);?>
ShinMigami13
źródło
Witamy w PPCG! Wierzę, że można to policzyć jako 59 bajtów (chociaż sam nie gram w golfa w PHP).
Jonathan Allan,
4
<?for(;54>++$t;)echo date("d.m.Y\n",605e3*$t+148263e4);powinno być w porządku
tsh
2
Zawsze miło jest widzieć nowych golfistów PHP! Masz prawo do wykorzystania php -r, dzięki czemu nie trzeba <?phpi ?>, a zatem może liczyć to jako 59 bytesjak @JonathanAllan prawidłowo powiedział. Nie potrzebujesz nawiasów $t. Kilka innych golfów i skończysz for(;++$t<54;)echo date("d.m.Y\n",605e3*$t+14827e5);na 51 bytes(w mojej strefie czasowej). Możesz zastąpić „\ n” prawdziwym podziałem wiersza, który ma tylko 1 bajt, dlatego ma 51 bajtów.
Christoph
1
Dzięki @Christoph Próbuję innego podejścia, wkrótce zaktualizuję
ShinMigami13 13.04.17
Oprócz wszystkich innych wskazówek, możesz użyć gmdatezamiast ze datewzględów bezpieczeństwa strefy czasowej.
Tytus
4

k6, 32 bajty

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

Krótkie wyjaśnienie:

                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

Niestety, wydaje się, że działa to tylko w zamkniętym źródle, tylko na żądanie tłumacza.

Uruchomienie polecenia w interpreterie z zamkniętym kodem źródłowym.

zgrep
źródło
4

Pyke , 26 24 bajtów

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

Wypróbuj online!

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

Lub 11 bajtów

Jeśli wolno zignorować format wyjściowy

y17y"52VDs6

Wypróbuj online!

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
niebieski
źródło
3

R, 79 67 58 bajtów

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

Pierwszy stycznia jest niedzielą, ten fragment tworzy sekwencję dni, co 7 dni, od 01-01-2017 do 31-12-2017, sformatuj je do żądanego formatu i wydrukuj.

plannapus
źródło
To powinno obniżyć go do 41 bajtówprint(as.Date("2017-01-01")+seq(7,365,7))
policz
@count Dzięki, ale nie wydrukuje wymaganego wyniku (tj. „2017.01.01” zamiast „2017/01/01”)
plannapus
3

Befunge-98 (PyFunge) , 99 95 93 85 bajtów, pozostawia końcowy znak nowej linii

Wszystkie optymalizacje zostały wykonane przez @JoKing wiele dzięki nim

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

Wypróbuj online!

Czułem, że brakuje nam tutaj esencji, więc opracowałem rozwiązanie w moim ulubionym języku esosterycznym.

Objaśnienie :
>8><><>><><>Koduje długość 12 miesięcy.
sPrzechowuj stary dzień w pustym miejscu.
:1g2/Uzyskaj wartość ASCII z dolnego rzędu i podziel ją przez dwa, co daje nam długość danego miesiąca. Przykład: 8 = 56 w ASCII => 56 / 2 = 28 => Miesiąc (luty) ma 28 dni
10g\%Pobierz poprzednio zapisany dzień i zmień go według długości miesiąca, co pozwala nam przenieść datę na następny miesiąc
:d1pZapisz kopię nowego zaktualizowanego dnia
10g\`+Sprawdź, czy stara data > nowa data => przeszliśmy do następnego miesiąca => dodaj 1 do licznika miesięcy
:b`Testuj, czy licznik miesięcy> 11 oznacza, że ​​osiągnęliśmy koniec roku (stosując indeksowanie 0)
#@_W oparciu o poprzednie, jeśli zakończysz program
:1\0d1gZmień kolejność stosu więc wygląda to tak:Month, 1, Month, 0, Day
#pomiń następną instalację (duh)
1+:a/'0+,a%'0+,'.,Konwertuj liczbę na 1 indeksowanie, drukuj, dodaj .na końcu
j;Użyj 0 ze stosu, aby nie przeskakiwać i użyj, ;aby przejść ponownie do harmonogramu drukowania, a następnie użyj 1, aby przeskoczyć ;następny czas
a"7102"4k,Drukuj 2017\n
d1gUzyskaj ponownie wartość dnia 7+Dodaj tydzień przed powtórzeniem

IQuick 143
źródło
@JoKing Omc taka oczywista optymalizacja! Jak mogłem tęsknić? Dziękuję Ci.
IQuick 143
1
Jeszcze kilka bajtów. Wypróbuj online! Jeden ze zmiany zamiast skoku -17 na komentarz, jeden ze stosowania indeksowania opartego na 0 dla licznika miesięcy, a drugi ze zmiany na jednowierszową
Jo King
@JoKing Wow, dużo grałeś w golfa. Dodajmy to do odpowiedzi.
IQuick 143
1
Do diabła, dlaczego nie zaindeksować również dni 0 i oszczędzić konieczności jakiejkolwiek inicjalizacji! 85 bajtów
Jo King
3

JavaScript, 111 106 bajtów

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

Uwaga: konsola Stack Exchange nie jest wystarczająco długa, aby wyświetlić całą listę, więc oto pierwsza połowa jako osobny fragment:

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

Niestandardowy format kosztuje mnie 40 bajtów ...

Neil
źródło
2

Perl 5 , 64 bajtów

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

Wypróbuj online!

Zadaniem było 2017, nie rok, więc zapisałem na stałe:

  • 117 (która wygasa w roku 2017, 1900 + 117)
  • +1, ponieważ 1 stycznia to niedziela w 2017 roku
  • 0..52, ponieważ w 2017 roku mamy 53 niedziele

POSIX jest modułem podstawowym i jest zawsze instalowany z Perl5. Robi to samo bez użycia modułów w 101 bajtach, usuwając białe znaki:

$$_[5]==117&&printf"%02d.%02d.%d\n",$$_[3],$$_[4]+1,$$_[5]+1900
  for map[gmtime(($_*7+3)*86400)],0..1e4
Kjetil S.
źródło
2

Rubinowy, 75 bajtów

Proste rozwiązanie do ustalenia dat Time.

t=Time.new 2017
365.times{puts t.strftime("%d.%m.%Y")if t.sunday?
t+=86400}
ślimak_
źródło
1
Jeśli dodasz cały tydzień (604800 sekund), nie musisz sprawdzać niedzieli, po prostu powtórz 53 razy.
GB
1
Jeśli wykonasz sztuczkę sugerowaną przez @GB i nie będziesz już sprawdzać w niedzielę, możesz również zainicjować za pomocą, t=Time.new 1a następnie wykonać t.strftime"%d.%m.2017"dla bajtu -1.
Wartość tuszu
2

SAS, 52 50 bajtów

Zaoszczędzono 2 bajty dzięki @ user3490.

data;do i=20820to 21184 by 7;put i ddmmyyp10.;end;
J_Lard
źródło
Nie musisz określać zestawu danych - po prostu użyj data;zamiast, data c;aby zaoszczędzić 2 bajty. Myślę, że jednak potrzebujesz run;.
user3490
@ user3490 Dzięki, nie wiedziałem o tym. To chyba odpowiednik data _null_? Również runstwierdzenie implikuje, jeśli brakuje.
J_Lard
Niezupełnie równoważne - otrzymujesz wyjściowy zestaw danych zgodnie z datankonwencją nazewnictwa.
user3490 18.04.17
2

Mathematica 90 84 bajtów

W porządku. numbermaniac i Scott Milner zapisali odpowiednio 5 i 1 bajt.

Column[#~DateString~{"Day",".","Month",".","Year"}&/@DayRange["2017","2018",Sunday]]
DavidC
źródło
Potrzebujesz Most@? Wyjście wydaje się bez niego identyczne.
numbermaniac
1
@numbermaniac, Thanks. Mostbył tam, aby uniknąć pierwszej niedzieli w 2018 roku. Pierwotnie testowałem kod, bez Mostlat 2011, 2012, w którym to przypadku pierwsza niedziela w 2012 roku jest uwzględniona w wynikach. (Dlatego zawarłem go w kodzie). O dziwo, Mostnie jest potrzebny na lata 2017–2018. Nie ma Mostteż żadnego widocznego wpływu na wynik. Tajemniczy!
DavidC
1

VBA, 81 bajtów (może 64)

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

Mój pierwszy post Opierając się na rozwiązaniu newguy, usuwając czek na dni powszednie i określając co 7 dni. Usunięcie dat pozwala zaoszczędzić 12 bajtów. 42736 to 1/1/2017. Format daty wyjściowej zależy od ustawienia systemu. Czy to jest dozwolone? Jeśli tak, to 64 bajty, ponieważ nie potrzebujesz metody formatowania .

MsgBox #1/1/2017# + i * 7
Złamał tato
źródło
Możesz także usunąć wiele białych znaków, które są automatycznie formatowane. Na przykład For i=0To 52i Format(42736+i*7,"dd.mm.yyyy"). Możesz także użyć Nextzamiast Next i.
Inżynier Toast
1

AHK , 67 bajtów

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

Nie dzieje się tu nic magicznego. Próbowałem znaleźć krótsze środki, FormatTime ale nie udało mi się.

Inżynier Toast
źródło
1

Java 8+, 104 100 99 bajtów

()->{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 bajtów

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

Używa funkcji daty tego printfformatu.

Sprawdź to sam!

Oszczędności

  1. 104 -> 100: zmieniono wartości pętli i wielokrotności.
  2. 100 -> 99: grał w golfa w pętli
Olivier Grégoire
źródło
1

T-SQL, 94 bajty

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

jeśli nie lubisz SQL GOTO lub WHILE, oto 122-bajtowe rozwiązanie CTE

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
NOSIĆ WSZYSTKO
źródło
twoje pierwsze rozwiązanie zaczyna się od 08.01.2017nie01.01.2017
złap ryby
1
Bardzo dobre sztuczki w twoim rozwiązaniu. Dobra robota. Nie mogłem się oprzeć ich pożyczeniu. ;)
AXMIM
1

Rubin, 60 + 7 = 67 bajtów

Używa -rdateflagi.

(d=Date.new 1).step(d+365,7){|d|puts d.strftime"%d.%m.2017"}
Wartość tuszu
źródło
1

Groovy, 81 77 63 60 56 bajtów

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

Powyższe można uruchomić jako groovy skrypt.

Mój pierwszy wpis do golfa. Na szczęście rok 1970 nie był rokiem przestępnym, dlatego można go wykorzystać jako bazę.

Dzięki Dennis, oto: Wypróbuj online!

Krystian
źródło
Witamy w Programowaniu Puzzle i Code Golf! Jeśli jesteś zainteresowany, oto link bezpośredni: wypróbuj online!
Dennis
Dziękuję @Dennis Nie wiedziałem, że to istnieje :)
Krystian
Możesz zapisać cztery bajty, przesuwając datę w bloku czasu 53.times{printf('%td.%<tm.2017%n',new Date(0)+it*7)}, 52 bajty. Broniąc honoru
Groovy
1

C #, 138 111 102 bajtów

Oszczędność jeszcze 9 bajtów dzięki Johan du Toit !

Zaoszczędzono 27 bajtów dzięki sugestiom Kevina Cruijssena !

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

Anonimowa funkcja, która drukuje wszystkie niedziele w 2017 roku.

Pełny program z metodą bez golfa:

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
źródło
1
Czy to nie jest łatwiejsze w użyciu .AddDays(7*i++)? Wtedy nie ma potrzeby .DayOfWeek<1czeku. Wiemy, że 01-01-2017 jest niedzielą i stamtąd możemy dodawać kolejne 7 dni.
Kevin Cruijssen
2
Nie jestem tego pewien - we wszystkich golfach, w których biorę udział, zawsze korzystałem z pełnej przestrzeni nazw - ale czy nie brakuje ci tam niektórych System- System.DateTimei System.Console.Write?
auhmaan
Fajnie, ale możesz zaoszczędzić kilka bajtów:()=>{for(int i=0;i<53;)Console.Write(new DateTime(2017,1,1).AddDays(7*i++).ToString("dd.MM.yyyy\n"));};
Johan du Toit
@auhmaan: Tak, należy użyć pełnych przestrzeni nazw lub usinginstrukcji należy uwzględnić w liczbie bajtów.
raznagul 14.04.17
3
@adrianmp: Należy policzyć niezbędne usinginstrukcje do uruchomienia kodu. Zobacz to pytanie Meta: Czy muszę używać importu, czy mogę nazwać klasę jawnością?
raznagul 14.04.17
1

C #, 110 109 bajtów

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

Możesz cieszyć się tym programem online tutaj

W tym rozwiązaniu:

  • Użyj daty automatyzacji OLE (OADate), aby uniknąć „AddDay ()” od daty i godziny.
    FromOADate()wydają się duże, ale są równenew DateTime(2017,1,1)

  • Rozpocznij pętlę w ostatnią niedzielę 2016 r., Aby umożliwić nam wzrost +=tylko z operatorem . Ten operator zwraca wartość po zakończeniu przyrostu.

  • Przyrost o 7 dni, aby przejść od niedzieli do niedzieli przed wydrukowaniem daty.

  • Zatrzymujemy się, gdy minie ostatnia niedziela 2017 roku.

  • Użyj Debugzamiast, Consoleaby zapisać dwa znaki

  • Unikaj wyraźnej deklaracji zmiennej i przypisania

AXMIM
źródło
O ile nie określono inaczej, nasze domyślne powiedzieć należy dostarczyć funkcji lub programu (czyli nie fragment), i trzeba zakwalifikować Debug i DateTime : Polecam dodawanie using System;i przełączania Consolez Debug(co jest odrobinę podejrzanie sobie, ale mogę nie ma na ten temat komentarza do meta).
VisualMelon
1
@VisualMelon Przestrzegałem „zapewnienia funkcji”, a także wymieniłem Debugna, Consoleponieważ wymagałem Debugkonkretnego włączenia. Nie przestrzegałem jednak „systemu użytkowania”, ponieważ mój konkurent w tym języku tego nie robi. Nie można także kodować poza klasą, która sama musiała zostać zdefiniowana w przestrzeni nazw. Jestem prawie pewien, że większość odpowiedzi na tej stronie nie zawiera tego. Więc co teraz, rzucamy te wszystkie odpowiedzi na śmieci? Czy głosujemy za nimi wszystkimi, aby zmusić ich do przestrzegania? Jeśli tak, to społeczność może równie dobrze całkowicie zakazać c # kodegolfowi.
AXMIM
Te „reguły” są właśnie tym, na czym społeczność z czasem się zdecydowała (i udokumentowało na meta). Nie głosujemy odpowiedzi, komentujemy i nie głosujemy ich również. Kiedy je naprawią, będziemy mogli głosować. Obie inne odpowiedzi w języku C # zawierają komentarze sugerujące, że należy dodać usingdyrektywę lub w pełni zakwalifikować metody i typy, nie bierz żadnej z nich osobiście. Jestem od dawna golfistą C # i doceniam, jak arbitralne wydają się reguły, więc lubię popychać ludzi we właściwym kierunku, kiedy tylko mogę. W szczególności „celuję” w odpowiedzi w języku C #, ponieważ jestem stosunkowo dobrze poinformowany w tej sprawie.
VisualMelon
1
@VisualMelon W porządku, i tak jestem tu tylko przechodniem. Zaakceptuję twoje zasady, kiedy tu będę. Dlatego tym razem starałem się, aby moja odpowiedź była zgodna.
AXMIM
1
Dla mnie wygląda dobrze! +1 za oryginalne podejście. I nie potrzebujesz po tym miejsca using System;(zakładam, że to nie było zamierzone), więc to 109 bajtów.
VisualMelon
1

TSQL, 112 105 bajtów

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

Próbny

Składnia konwertująca T-SQL

Salman A.
źródło
Możesz zapisać 2 bajty, zastępując DAYje d. Robi to samo.
AXMIM
+1 Możesz zapisać kolejne 3 bajty, zastępując '20170101'je 42734. Daty są liczbą. Czas jest częścią dziesiętną liczby.
AXMIM
1

JavaScript (ES6), 123 bajty

To mój pierwszy post tutaj, cześć!

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

To rozwiązanie wykorzystuje zakodowane dane i zostało zaprojektowane specjalnie do pracy w roku 2017. Nie wykorzystuje interfejsów API daty / godziny.

Jeśli chodzi o cyfry w ciągu 155274263153, każda cyfra jest liczbą własną i oznacza pierwszą niedzielę każdego kolejnego miesiąca. Wynik za cały rok można wygenerować, dodając kolejno 7.

Co z magiczną liczbą 2633używaną w pętli?
Cóż ... 2633(dziesiętny) jest 101001001001w formacie binarnym. Co to może 1znaczyć? Zaczynając od prawej, ustawiany jest 1., 4., 7., 10. i 12. bit. Odpowiada to miesiącom, które mają pięć niedziel, w przeciwieństwie do tych, które mają tylko cztery. Golfed do tego czystej ekspresji, to początkowo wyglądało tak: for(j=0;j<4+ +[0,3,6,9,11].includes(i);j++).

Sądzę, że pozostałe części są dość oczywiste.

nosorożec
źródło
@SIGSEGV: Nie mam nic przeciwko zmianie ECMAScript 2015do Javascript (ES6), ale ... złamałem kod i musiałem go przywrócić.
nosorożec
Och, to konsensus wspólnoty, dopuszczenie tylko części lambda jest dozwolone.
Matthew Roh
@SIGSEGV W tym przypadku tak nie jest. Ta lambda zawiera tylko niewielką część kodu i potrzebuję tego identyfikatora, aby móc go użyć w innym miejscu. Bez a=kodu kod jest faktycznie zepsuty .
nosorożec
1

T-SQL, 79 77 bajtów

Po pomocy Salmanowi A w poprawie odpowiedzi . Postanowiłem napisać własny za pomocą pętli i PRINT.

Skończyłem z tym 90 bajtowym rozwiązaniem.

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

Następnie spojrzałem na obecnego lidera w języku T-SQL, który miał 94 bajty z WORNG ALL z tą odpowiedzią . Ten facet znalazł bardzo dobre sztuczki.

  1. Nazwij tylko zmienną @
  2. Pętla z GOTOzamiast rzeczywistej PĘTLI
  3. Zapisz jedną postać, używając FORMATzamiast CONVERT. (Tylko SSMS2012 +)

Korzystając z tych sztuczek, to rozwiązanie zostało przycięte do rozwiązania, poniżej którego jest 79 bajtów.

DECLARE @ DATETIME=42734G:PRINT FORMAT(@,'dd.MM.yyy')SET @+=7IF @<43100GOTO G
AXMIM
źródło
Możesz zapisać 2 bajty, zmieniając @ = @ + 7 na @ + = 7 i usuwając spację między 7 a IF.
NOSIĆ WSZYSTKO
W tym poście mam wszystkie sztuczki, które mogą ci pomóc.
NOSIĆ WSZYSTKO
1
@WORNGALL wonderfull, nie byłem świadomy, że możemy to zrobić. Wielkie dzięki.
AXMIM,
1

Oktawa , 37 bajtów

Znacznie krótszy niż wszystkie inne języki nie-golfowe, a nawet związany z Jelly! Dobra droga, Octave! :)

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

Wypróbuj online!

Na szczęście rok 2 ADwygląda dokładnie tak samo jak rok 2017 AD. Zarówno zaczyna się, jak i kończy w niedzielę, i żaden nie jest rokiem przestępnym. Oszczędza to wiele bajtów, ponieważ 367:7:737jest nieco krótszy niż 736696:7:737060.

Konwertuje liczbę dni od 01.01.0001, na ciąg znaków w formacie DD.mm, z końcowym .2017.

Stewie Griffin
źródło
1

Haskell , 133 130 bajtów

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)

Wypróbuj online!

Bez biblioteki kalendarza 148 144 140 bajtów

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

To zabawne, ponieważ użycie operatora do funkcji wypełniania pozwala zaoszczędzić dwa bajty, mimo że drugi argument nie jest używany, ponieważ potrzeba mniejszej liczby nawiasów - p(last l)jest on dłuższy niż last l!l. Działa poprzez obliczanie day/monthpar przez odjęcie skumulowanych dat rozpoczęcia miesiąca od dnia roku. Daty rozpoczęcia miesiąca są kompresowane jako ( scanl((+).(+28))0[3,0,3,2,3,2,3,3,2,3,2]). Liczba miesięcy jest liczbą dodatnich elementów, a liczba dni jest ostatnim dodatnim elementem.

Wypróbuj online!

Angs
źródło
0

C #, 116 114 113 bajtów

for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(‌​new DateTime(i).ToString("dd.MM.yyyy\n"));

Może być uruchamiany w interaktywnych oknach Visual Studio (lub dowolnym innym C # REPL opartym na Roslyn)

Do 113 bajtów: dzięki Kevin Cruijssen.

rmrm
źródło
1
Czy możesz dodać link TryItNow ? Możesz też for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(new DateTime(i).ToString("dd.MM.yyyy\n"));
zagrać w
@KevinCruijssen Niefortunnie Nie mogę znaleźć odpowiedniego kompilatora na podanej stronie. Oto link do używanej technologii, jeśli chcesz się z nią skontaktować: link . W każdym razie dzięki za nową pętlę. :)
rmrm
1
O ile nie określono inaczej, nasze wartości domyślne mówią, że powinieneś dostarczyć funkcję lub program (tj. Nie fragment kodu) i musisz zakwalifikować Debug i DateTime : Zalecam dodanie using System;i użycieConsole.WriteLine(string)
VisualMelon 14.04.17