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
code-golf
kolmogorov-complexity
date
ShinMigami13
źródło
źródło
Odpowiedzi:
Python 2 , 81 bajtów
Wypróbuj online!
Brak bibliotek dat, bezpośrednio oblicza daty. Główną sztuczką jest traktowanie
dd.mm
wartości dziesiętnej. Na przykład16.04.2017
(16 kwietnia) odpowiada liczbie16.04
. Liczba jest drukowana w formacie zgodnymxx.xx
z.2017
dołączonym.Dzień i miesiąc są obliczane arytmetycznie. Każdy tydzień dodaje 7 dni wykonanych jak
x+=7
. Biorącx
modulo30.99
obsługuje rollover, odejmując,30.99
gdy liczba dni staje się zbyt duża. Łączy-31
to resetowanie dni z+0.01
przyrostem miesiąca.Rolowanie zakłada, że każdy miesiąc ma 31 dni. Miesiące z mniejszą liczbą dni są dostosowywane poprzez przesuwanie w
x
gó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,8
potrojone, 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
+40
moż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.źródło
'888z!}+'.count(chr(x%146))
oszczędza jeden bajt.PHP, 48 bajtów
PHP, 46 bajtów (dla nieujemnych przesunięć UTC)
źródło
gmdate
bezpieczeństwa strefy czasowej? Nie działa na onlinephpfunctions.com. Świetna robota we wszystkich innych aspektach!Python 2 ,
9079 bajtów-5 bajtów za pomocą xnor (unikaj liczenia samych tygodni)
-1 bajt dzięki xnor (dodaj ponownie e dla 605000 jako 605e3)
Wypróbuj online!
0
sekund od epoki jest 00:00:00 1 stycznia 1970 r., co podobnie jak 2017 r. nie było rokiem przestępnym.605000
sekund to 1 tydzień, 3 minuty, 20 sekund. Dodanie 52 tych „tygodni” nie zajmie nam więcej niż północy.źródło
605e3
. Mam jednak kilka pomysłów :)Bash + coreutils, 44 bajty
może zaoszczędzić 2 bajty,
-u
jeśli zakłada się GMT-f
parametry, dladate
których oszczędza 10 bajtów;@0
jest 1970-1-1605000
to jeden tydzień (604800
) plus 200 sekund@32000000
to tylko trochę ponad rokźródło
seq -f@%1.f 14833e5 605e3 1515e6|date -uf- +%d.%m.%Y
oszczędza ci 10 bajtów. Prawdopodobnie powinieneś jednak twierdzić, że jest to Bash + coreutils .PowerShell,
5147Dość 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:
źródło
(date 2017-1-1)+7.*$_
. Zobacz tę odpowiedźint
tej pory wiedziałem tylko o dodawaniu kleszczy i sznurków. Dobrze wiedzieć.Excel VBA
1069179 bajtówzapisano 15 bajtów dzięki @Radhato
Zakładając, że 1/1/2017 jest niedziela, zaoszczędzi to 12 kolejnych bajtów.
Dzięki @Toothbrush 66 bajtów
Edycja: (Sub i End Sub nie są konieczne) 52 bajty
źródło
Sub p:For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next:End Sub
jest doskonale poprawnym kodem VBA i ma tylko 66 bajtów. Fakt, że Edytor VBA dodaje dodatkowe spacje, nie ma znaczenia.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,
źródło
<?for(;54>++$t;)echo date("d.m.Y\n",605e3*$t+148263e4);
powinno być w porządkuphp -r
, dzięki czemu nie trzeba<?php
i?>
, a zatem może liczyć to jako59 bytes
jak @JonathanAllan prawidłowo powiedział. Nie potrzebujesz nawiasów$t
. Kilka innych golfów i skończyszfor(;++$t<54;)echo date("d.m.Y\n",605e3*$t+14827e5);
na51 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.gmdate
zamiast zedate
względów bezpieczeństwa strefy czasowej.k6, 32 bajty
Krótkie wyjaśnienie:
Niestety, wydaje się, że działa to tylko w zamkniętym źródle, tylko na żądanie tłumacza.
źródło
Pyke ,
2624 bajtówWypróbuj online!
Lub 11 bajtów
Jeśli wolno zignorować format wyjściowy
Wypróbuj online!
źródło
R,
796758 bajtówPierwszy 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.
źródło
print(as.Date("2017-01-01")+seq(7,365,7))
Befunge-98 (PyFunge) ,
99959385 bajtów, pozostawia końcowy znak nowej liniiWszystkie optymalizacje zostały wykonane przez @JoKing wiele dzięki nim
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.s
Przechowuj 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 dni10g\%
Pobierz poprzednio zapisany dzień i zmień go według długości miesiąca, co pozwala nam przenieść datę na następny miesiąc:d1p
Zapisz kopię nowego zaktualizowanego dnia10g\`+
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\0d1g
Zmień 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ńcuj;
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 czasa"7102"4k,
Drukuj2017\n
d1g
Uzyskaj ponownie wartość dnia7+
Dodaj tydzień przed powtórzeniemźródło
JavaScript,
111106 bajtówUwaga: konsola Stack Exchange nie jest wystarczająco długa, aby wyświetlić całą listę, więc oto pierwsza połowa jako osobny fragment:
Niestandardowy format kosztuje mnie 40 bajtów ...
źródło
Perl 5 , 64 bajtów
Wypróbuj online!
Zadaniem było 2017, nie rok, więc zapisałem na stałe:
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:
źródło
Rubinowy, 75 bajtów
Proste rozwiązanie do ustalenia dat
Time
.źródło
t=Time.new 1
a następnie wykonaćt.strftime"%d.%m.2017"
dla bajtu -1.SAS,
5250 bajtówZaoszczędzono 2 bajty dzięki @ user3490.
źródło
data;
zamiast,data c;
aby zaoszczędzić 2 bajty. Myślę, że jednak potrzebujeszrun;
.data _null_
? Równieżrun
stwierdzenie implikuje, jeśli brakuje.datan
konwencją nazewnictwa.Mathematica
9084 bajtówW porządku. numbermaniac i Scott Milner zapisali odpowiednio 5 i 1 bajt.
źródło
Most@
? Wyjście wydaje się bez niego identyczne.Most
był tam, aby uniknąć pierwszej niedzieli w 2018 roku. Pierwotnie testowałem kod, bezMost
lat 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,Most
nie jest potrzebny na lata 2017–2018. Nie maMost
też żadnego widocznego wpływu na wynik. Tajemniczy!VBA, 81 bajtów (może 64)
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 .
źródło
For i=0To 52
iFormat(42736+i*7,"dd.mm.yyyy")
. Możesz także użyćNext
zamiastNext i
.AHK , 67 bajtów
Nie dzieje się tu nic magicznego. Próbowałem znaleźć krótsze środki,
FormatTime
ale nie udało mi się.źródło
Java 8+,
10410099 bajtówJava 5+,
109105104 bajtówUżywa funkcji daty tego
printf
formatu.Sprawdź to sam!
Oszczędności
źródło
T-SQL, 94 bajty
jeśli nie lubisz SQL GOTO lub WHILE, oto 122-bajtowe rozwiązanie CTE
źródło
08.01.2017
nie01.01.2017
Rubin, 60 + 7 = 67 bajtów
Używa
-rdate
flagi.źródło
Groovy,
8177636056 bajtówPowyż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!
źródło
53.times{printf('%td.%<tm.2017%n',new Date(0)+it*7)}
, 52 bajty. Broniąc honoruC #,
138111102 bajtówOszczędność jeszcze 9 bajtów dzięki Johan du Toit !
Zaoszczędzono 27 bajtów dzięki sugestiom Kevina Cruijssena !
Anonimowa funkcja, która drukuje wszystkie niedziele w 2017 roku.
Pełny program z metodą bez golfa:
źródło
.AddDays(7*i++)
? Wtedy nie ma potrzeby.DayOfWeek<1
czeku. Wiemy, że 01-01-2017 jest niedzielą i stamtąd możemy dodawać kolejne 7 dni.System
-System.DateTime
iSystem.Console.Write
?()=>{for(int i=0;i<53;)Console.Write(new DateTime(2017,1,1).AddDays(7*i++).ToString("dd.MM.yyyy\n"));};
using
instrukcji należy uwzględnić w liczbie bajtów.using
instrukcje do uruchomienia kodu. Zobacz to pytanie Meta: Czy muszę używać importu, czy mogę nazwać klasę jawnością?C #,
110109 bajtówMoż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żyjDebug
zamiast,Console
aby zapisać dwa znakiUnikaj wyraźnej deklaracji zmiennej i przypisania
źródło
using System;
i przełączaniaConsole
zDebug
(co jest odrobinę podejrzanie sobie, ale mogę nie ma na ten temat komentarza do meta).Debug
na,Console
ponieważ wymagałemDebug
konkretnego 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.using
dyrektywę 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.using System;
(zakładam, że to nie było zamierzone), więc to 109 bajtów.TSQL,
112105 bajtówPróbny
Składnia konwertująca T-SQL
źródło
DAY
jed
. Robi to samo.'20170101'
je42734
. Daty są liczbą. Czas jest częścią dziesiętną liczby.JavaScript (ES6), 123 bajty
To mój pierwszy post tutaj, cześć!
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ą
2633
używaną w pętli?Cóż ...
2633
(dziesiętny) jest101001001001
w formacie binarnym. Co to może1
znaczyć? 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.
źródło
ECMAScript 2015
doJavascript (ES6)
, ale ... złamałem kod i musiałem go przywrócić.a=
kodu kod jest faktycznie zepsuty .T-SQL,
7977 bajtówPo 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.
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.
@
GOTO
zamiast rzeczywistej PĘTLIFORMAT
zamiastCONVERT
. (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.
źródło
Oktawa , 37 bajtów
Znacznie krótszy niż wszystkie inne języki nie-golfowe, a nawet związany z Jelly! Dobra droga, Octave! :)
Wypróbuj online!
Na szczęście rok
2 AD
wygląda dokładnie tak samo jak rok2017 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:737
jest nieco krótszy niż736696:7:737060
.Konwertuje liczbę dni od
01.01.0001
, na ciąg znaków w formacieDD.mm
, z końcowym.2017
.źródło
Haskell ,
133130 bajtówWypróbuj online!
Bez biblioteki kalendarza
148144140 bajtówTo 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 obliczanieday/month
par 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!
źródło
C #,
116114113 bajtówfor(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.
źródło
for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(new DateTime(i).ToString("dd.MM.yyyy\n"));
using System;
i użycieConsole.WriteLine(string)