Alle Sonntage im Jahr 2017 drucken

27

Drucken Sie die Daten aller Sonntage im Jahr 2017 in folgendem Format: dd.mm.yyyy.
Erwartete Ausgabe:

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
quelle
1
Mögliche Betrug Planen Sie Ihre Sonntage ? Dies ist jedoch ein bestimmtes Jahr.
Xnor
1
Ich habe Ihre Sonntage vor dem Posten ausgecheckt. Sie werden jedoch aufgefordert, die Sonntage in einem bestimmten Monat auszudrucken. @xnor
ShinMigami13
1
Gibt es einen bestimmten Grund für dieses spezielle Ausgabeformat? Sie könnten sich ein bisschen öffnen.
Freitag,
4
Eigentlich mag ich das als textgenaue Kolmogorov-Herausforderung. Die richtige Datumsformatierung weist einige interessante Optimierungen auf.
xnor
5
Sowieso denke ich, dass die nahen Abstimmungen zurückgezogen werden sollten.
Erik der Outgolfer

Antworten:

16

Python 2 , 81 Bytes

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

Probieren Sie es online!

Keine Datumsbibliotheken, berechnet die Daten direkt. Der Haupttrick besteht darin, den dd.mmals Dezimalwert zu behandeln . Beispiel: 16.04.2017(16. April) entspricht der Nummer 16.04. Die Nummer wird wie xx.xxim .2017Anhang gedruckt .

Tag und Monat werden rechnerisch berechnet. Jede Woche kommen 7 Tage hinzu x+=7. Unter xModulo 30.99Griffe Roll durch Subtraktion , 30.99wenn die Tageszahl zu groß wird. Dies kombiniert -31, um die Tage zurückzusetzen +0.01und den Monat zu erhöhen.

Der Rollover setzt voraus, dass jeder Monat 31 Tage hat. Monate mit weniger Tagen werden angepasst, indem xbei bestimmten Wochenzahlen mit nach oben gestoßen wird +[8,8,8,17,25,38,47].count(x/7). Diese Liste enthält die Wochenzahlen, die diese kurzen Monate enden, wobei sie sich 8verdreifacht haben, da der Februar 3 Tage vor dem 31. Februar liegt.

Diese Liste könnte durch die Verwendung von ASCII-Werten plus 40 zu einer Zeichenfolge komprimiert werden. Die Verschiebung von +40könnte durch die Verwendung nicht druckbarer Zeichen vermieden und als Byte-Objekt in Python 3 kürzer zugegriffen werden.

xnor
quelle
Was für eine coole Antwort! '888z!}+'.count(chr(x%146))spart ein Byte.
Lynn
10

PHP, 48 Bytes

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

PHP, 46 Bytes (für nicht negative UTC-Offsets)

while($t<53)echo date("d.m.2017
",605e3*$t++);
user63956
quelle
1
Sollte das nicht der gmdateZeitzonensicherheit dienen? Es schlägt auf onlinephpfunctions.com fehl. Gute Arbeit in allen anderen Aspekten!
Titus
9

Python 2 , 90 79 Bytes

-5 Bytes mit Hilfe von xnor (vermeide es, die Wochen selbst zu zählen)
-1 Bytes dank xnor (addiere in e für 605000 als 605e3 zurück)

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

Probieren Sie es online!

0Sekunden, da die Epoche am 1. Januar 1970 00:00:00 ist, was wie 2017 kein Schaltjahr war. 605000Sekunden ist 1 Woche, 3 Minuten, 20 Sekunden. Das Hinzufügen von 52 dieser "Wochen" dauert nicht länger als Mitternacht.

Jonathan Allan
quelle
Hier ist ein kürzerer Weg , um die arithmetische Folge zu erzeugen.
Xnor
@xnor Danke, ich habe an der gleichen Sache gearbeitet und versucht, tiefer zu gehen, aber 81 scheint zu viel für den Bibliotheksansatz zu sein.
Jonathan Allan
@xnor ... oder nicht.
Jonathan Allan
1
Nett! Die Nummer kann sein 605e3. Ich habe aber ein paar Ideen :)
xnor
7

Bash + Coreutils, 44 Bytes

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

kann 2 Bytes sparen, -uwenn GMT angenommen wird

  • Dank Digital Trauma weisen Sie auf -fParameter hin, für datedie 10 Bytes gespart werden;
  • Und die Verwendung von 2017 im Zeichenfolgeformat spart mehr Bytes. Diese Idee stammt aus der Antwort von Diese user63956

  • @0 ist 1970-1-1
  • 605000beträgt eine Woche ( 604800) plus 200 Sek
    • 200 sek. sollte einfach funktionieren da es nur 52 wochen im jahr gibt
  • @32000000 ist nur etwas mehr als ein Jahr
tsh
quelle
seq -f@%1.f 14833e5 605e3 1515e6|date -uf- +%d.%m.%YSpart Ihnen 10 Bytes. Sie sollten dies jedoch wahrscheinlich als Bash + coreutils bezeichnen.
Digital Trauma
7

PowerShell, 51 47

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

Ziemliech direkt. Der 01.01.2017 ist ein Sonntag, ebenso alle folgenden sieben Tage. Wir können zwei Bytes sparen, wenn wir nur das Skript brauchen, um in meinem Leben zu arbeiten:

0..52|%{date((date 17-1-1)+7.*$_)-u %d.%m.%Y}
Joey
quelle
1
Sie können einige Bytes sparen, wenn Sie anstelle einer Zeichenfolge eine doppelte Anzahl von Tagen hinzufügen, d (date 2017-1-1)+7.*$_. H. Siehe diese Antwort
Danko Durbić
@ DankoDurbić: Oh, wow. intBisher wusste ich nur, dass ich tagelang Zecken und Streicher hinzufügen musste . Gut zu wissen.
Joey
5

Excel VBA 106 91 79 Bytes

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

15 Bytes gespart dank @Radhato

Vorausgesetzt, der 1.1.2017 ist Sonntag, werden 12 weitere Bytes eingespart.

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

Danke @Toothbrush 66 Bytes

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

Bearbeiten: (Sub und End Sub ist nicht erforderlich) 52 Bytes

For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next
Rohan
quelle
Kann durch Chanchieren von For i = 42736 To 43100 to For i = # 1/1/2017 # To #
12/31/2017
@ Radhato, aber würde das nicht die Bytegröße erhöhen?
Rohan
Ich denke, es reduziert es auf 96 .. zumindest das ist, was ich gezählt habe lol
Radhato
Ja, tat es. Vielen Dank
Rohan
1
@newguy Sub p:For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next:End Subist ein vollkommen gültiger VBA-Code und hat nur 66 Bytes. Die Tatsache, dass der VBA-Editor zusätzliche Leerzeichen hinzufügt, spielt keine Rolle.
Zahnbürste
4

PHP, 67 Bytes

Unter Verwendung der Tatsache, dass PHP nicht deklarierten Schleifenvariablen automatisch den Wert 1 zuweist, und unter Verwendung der Linux-Epochenzeiten,

<?php for(;54>$t+=1;)echo date("d.m.Y\n",604800*($t)+1482624000);?>
ShinMigami13
quelle
Willkommen bei PPCG! Ich glaube, dass dies als 59 Bytes gezählt werden kann (obwohl ich selbst nicht in PHP Golf spiele).
Jonathan Allan
4
<?for(;54>++$t;)echo date("d.m.Y\n",605e3*$t+148263e4);sollte nur in
Ordnung
2
Immer wieder schön, neue PHP-Golfer zu sehen! Sie dürfen also verwenden php -r, was Sie nicht brauchen <?phpund ?>können dies daher als 59 bytes@JonathanAllan richtig bezeichnet zählen. Die Klammern brauchen Sie nicht $t. Ein paar andere Golfplätze und Sie haben am Ende for(;++$t<54;)echo date("d.m.Y\n",605e3*$t+14827e5);für51 bytes (in meiner Zeitzone). Sie können "\ n" durch einen echten Zeilenumbruch ersetzen, der nur 1 Byte beträgt, also 51 Byte.
Christoph
1
Danke @Christoph Ich probiere einen anderen Ansatz aus, wird bald aktualisiert
ShinMigami13
Abgesehen von all den anderen Hinweisen möchten Sie diese möglicherweise gmdateanstelle der dateZeitzonensicherheit verwenden.
Titus
4

k6, 32 Bytes

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

Kurze Erklärung:

                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

Leider scheint dies nur im Closed-Source-Interpreter zu funktionieren, der nur auf Anfrage verfügbar ist.

Ausführen des Befehls im Closed-Source-Interpreter.

zgrep
quelle
4

Pyke , 26 24 Bytes

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

Probieren Sie es 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

Oder 11 Bytes

Darf das Ausgabeformat ignorieren

y17y"52VDs6

Probieren Sie es 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
Blau
quelle
3

R 79 67 58 Bytes

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

Da der erste Januar ein Sonntag ist, erstellt dieses Snippet alle 7 Tage vom 01.01.2017 bis zum 31.12.2017 eine Folge von Tagen, formatiert sie in das gewünschte Format und druckt sie aus.

Plannapus
quelle
Dies sollte es auf 41 Bytes reduzierenprint(as.Date("2017-01-01")+seq(7,365,7))
Zählung am
@count Danke, aber es würde nicht die erforderliche Ausgabe drucken (dh "2017.01.01" anstelle von "2017.01.01")
Plannapus
3

Befunge-98 (PyFunge) , 99 95 93 85 Bytes, Leaving Newline

Alle Optimierungen wurden von @JoKing vorgenommen, vielen Dank an sie

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

Probieren Sie es online!

Ich hatte das Gefühl, dass wir hier etwas Esosterisches vermissen, also habe ich eine Lösung in meiner bevorzugten esosterischen Sprache gefunden.

Erläuterung :
>8><><>><><>Kodiert die Länge der 12 Monate.
sSpeichern Sie den alten Tag in der Leerstelle.
:1g2/Holen Sie sich einen ASCII-Wert aus der unteren Zeile und dividieren Sie ihn durch zwei. Dies ergibt die Länge eines bestimmten Monats. Beispiel: 8 = 56 in ASCII => 56 / 2 = 28 => Der Monat (Februar) hat 28 Tage.
10g\%Holen Sie sich den zuvor gespeicherten Tag und modulieren Sie ihn um die Länge des Monats, wodurch wir das Datum in den nächsten Monat übertragen können.
:d1pSpeichern Sie eine Kopie des neuen aktualisierten Tages.
10g\`+Prüfen Sie, ob das alte Datum vorliegt > neues Datum => wir sind in den nächsten Monat übergegangen => addiere 1 zum Monatszähler
:b`Teste, ob der Monatszähler> 11 bedeutet, dass wir das Jahresende erreicht haben (mit 0-Indizierung)
#@_Basierend auf dem vorherigen if beende das Programm
:1\0d1gOrdne den Stapel neu so sieht es also aus:Month, 1, Month, 0, Day
#überspringe die nächste Anweisung (duh) Wandle
1+:a/'0+,a%'0+,'.,die Zahl in eine 1 um, drucke , füge eine .am Ende hinzu
j;Benutze die 0 vom Stapel, um nicht zu springen und benutze die ;, um wieder zum Druckplan zu gelangen, dann benutze die 1, um über die ;nächste zu springen Zeit
a"7102"4k,Drucken 2017\n
d1gDen Tageswert erneut 7+abrufen Fügen Sie eine Woche vor der Wiederholung hinzu

IQuick 143
quelle
@JoKing Omc so eine offensichtliche Optimierung! Wie konnte ich das verpasst haben? Vielen Dank.
IQuick 143
1
Noch ein paar Bytes übrig. Probieren Sie es online! Einer davon, den -17-Sprung zu einem Kommentar zu ändern, einer davon, 0-basierte Indexierung für den
Jo King
@JoKing Wow, das ist eine Menge Golf, die du dort gemacht hast. Lass es mich der Antwort hinzufügen.
IQuick 143
1
Verdammt, warum nicht auch die Tage 0 indizieren und sich die Initialisierung ersparen? 85 Bytes
Jo King
3

JavaScript, 111 106 Bytes

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

Hinweis: Die Konsole von Stack Exchange ist nicht lang genug, um die gesamte Liste anzuzeigen. Hier ist die erste Hälfte als separates Snippet:

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

Das benutzerdefinierte Format kostet mich 40 Bytes ...

Neil
quelle
2

Perl 5 , 64 Bytes

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

Probieren Sie es online!

Die Aufgabe war 2017, nicht jedes Jahr, also habe ich fest programmiert in:

  • 117 (das ist perlish für das Jahr 2017, 1900 + 117)
  • +1 weil der 1. Januar ein Sonntag im Jahr 2017 ist
  • 0..52 weil 2017 53 Sonntage haben

POSIX ist ein Kernmodul und wird immer mit Perl5 installiert. Machen Sie dasselbe, ohne Module in 101 Bytes zu verwenden, und entfernen Sie Leerzeichen:

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

Ruby, 75 Bytes

Einfache Lösung, um die Daten mit herauszufinden Time.

t=Time.new 2017
365.times{puts t.strftime("%d.%m.%Y")if t.sunday?
t+=86400}
Schnecke_
quelle
1
Wenn Sie eine ganze Woche (604800 Sekunden) hinzufügen, müssen Sie nicht nach einem Sonntag suchen, sondern nur 53-mal wiederholen.
GB
1
Wenn Sie den von @GB vorgeschlagenen Trick ausführen und nicht mehr nach Sonntag suchen, können Sie auch mit initialisieren t=Time.new 1und dann t.strftime"%d.%m.2017"nach -1 Byte suchen .
Wert Tinte
2

SAS, 52 50 Bytes

2 Bytes gespart dank @ user3490.

data;do i=20820to 21184 by 7;put i ddmmyyp10.;end;
J_Lard
quelle
Sie müssen keinen Datensatz angeben - verwenden Sie data;stattdessen data c;und das spart 2 Bytes. Ich denke du brauchst ein run;obwohl.
user3490
@ user3490 Danke, mir war das nicht bewusst. Ich denke, das ist das Äquivalent von data _null_? Die runAnweisung wird auch impliziert, wenn sie fehlt.
J_Lard
Nicht ganz gleichwertig - Sie erhalten einen Ausgabedatensatz, der der datanNamenskonvention folgt .
user3490
2

Mathematica 90 84 Bytes

Ziemlich wortreich. numbermaniac und Scott Milner sparten 5 bzw. 1 Byte.

Column[#~DateString~{"Day",".","Month",".","Year"}&/@DayRange["2017","2018",Sunday]]
DavidC
quelle
Benötigen Sie das Most@? Die Ausgabe scheint ohne identisch zu sein.
numbermaniac
1
@numbermaniac, Danke. Mostwar dabei, um den ersten Sonntag im Jahr 2018 zu vermeiden. Ich hatte den Code ursprünglich ohne Most, seit Jahren, 2011, 2012 getestet. In diesem Fall ist der erste Sonntag im Jahr 2012 in der Ausgabe enthalten. (Deshalb habe ich es in den Code aufgenommen.) Seltsamerweise Mostwird es für 2017-18 nicht benötigt. Auch Mostauf das Ergebnis hat dies keinen offensichtlichen Einfluss. Geheimnisvoll!
DavidC
1

VBA, 81 Bytes (vielleicht 64)

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

Mein erster Beitrag. Bauen Sie auf der Lösung von newguy auf, indem Sie den Scheck für Wochentage entfernen und nur jeden 7. Tag angeben. Durch das Entfernen der Daten werden 12 Byte pro Stück gespart. 42736 ist der 1.1.2017. Das Ausgabedatum hängt von der Systemeinstellung ab. Ist das erlaubt In diesem Fall sind es 64 Byte, da Sie die Formatierungsmethode nicht benötigen .

MsgBox #1/1/2017# + i * 7
Brach Papa
quelle
Sie können auch einen Großteil des automatisch formatierten Leerraums entfernen. Zum Beispiel und For i=0To 52und Format(42736+i*7,"dd.mm.yyyy"). Sie können auch einfach Nextanstelle von verwenden Next i.
Ingenieur Toast
1

AHK , 67 Bytes

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

Hier passiert nichts Magisches. Ich habe versucht, ein kürzeres Mittel zu finden, FormatTime aber ich bin gescheitert.

Ingenieur Toast
quelle
1

Java 8+, 104 100 99 Bytes

()->{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 Bytes

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

Verwendet die Datumsfunktionen des printfFormats.

Testen Sie es selbst!

Ersparnisse

  1. 104 -> 100: Die Schleifenwerte und der Multiplikand wurden geändert.
  2. 100 -> 99: Golf die Schleife
Olivier Grégoire
quelle
1

T-SQL, 94 Bytes

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

Wenn Sie SQL GOTO oder WHILE nicht mögen, finden Sie hier eine 122-Byte-CTE-Lösung

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
ALLE
quelle
deine erste lösung fängt bei 08.01.2017nicht an01.01.2017
Grabthefish
1
Sehr gute Tricks in Ihrer Lösung. Gut gemacht. Ich konnte nicht widerstehen, sie auszuleihen. ;)
AXMIM
1

Ruby, 60 + 7 = 67 Bytes

Verwendet die -rdateFlagge.

(d=Date.new 1).step(d+365,7){|d|puts d.strftime"%d.%m.2017"}
Wert Tinte
quelle
1

Groovy, 81 77 63 60 56 Bytes

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

Das obige kann als grooviges Skript ausgeführt werden.

Mein erster Code Golf Eintrag. Glücklicherweise war das Jahr 1970 kein Schaltjahr und kann daher als Basis verwendet werden.

Dank Dennis, hier ist ein: Probieren Sie es online!

Krystian
quelle
Willkommen bei Programming Puzzles & Code Golf! Wenn Sie interessiert sind, hier ist ein Permalink: Probieren Sie es online!
Dennis
Vielen Dank @Dennis Ich wusste nicht, dass es das gibt :)
Krystian
Sie können vier Bytes speichern, indem Sie das Datum innerhalb des Zeitblocks 53.times{printf('%td.%<tm.2017%n',new Date(0)+it*7)},, 52 Bytes verschieben. Hier wird die Ehre des
Groovys
1

C #, 138 111 102 Bytes

Dank Johan du Toit 9 weitere Bytes gespart !

Dank der Vorschläge von Kevin Cruijssen wurden 27 Bytes eingespart !

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

Anonyme Funktion, die 2017 alle Sonntage druckt.

Volles Programm mit ungolfed Methode:

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
quelle
1
Ist es nicht einfacher, nur zu benutzen .AddDays(7*i++)? Dann entfällt die .DayOfWeek<1Prüfung. Wir wissen, dass der 01.01.2017 ein Sonntag ist und von da an können wir nur noch 7 Tage hinzufügen.
Kevin Cruijssen
2
Nicht sicher diese - in allen Code golfs ich teilnehmen, habe ich immer den kompletten Namensraum verwendet - sind aber nicht einige fehlen Systems drin - System.DateTimeund System.Console.Write?
Auhmaan
Cool, aber Sie können ein paar Bytes sparen: ()=>{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: Ja, entweder sollten vollständige Namespaces verwendet werden, oder die usingAnweisungen sollten in die Byteanzahl einbezogen werden.
Raznagul
3
@adrianmp: Notwendige usingAnweisungen zum Ausführen des Codes müssen gezählt werden. Siehe diese Meta-Frage: Muss ich Importe verwenden oder kann ich eine Klassenexplizität nennen?
Raznagul
1

C #, 110 109 Bytes

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

Sie können dieses Programm hier online genießen

In dieser Lösung haben wir:

  • Verwenden Sie Ole-Automatisierungsdatum (OADate), um "AddDay ()" von Datetime zu vermeiden.
    FromOADate()scheinen groß, aber es ist gleichnew DateTime(2017,1,1)

  • Starten Sie die Schleife am letzten Sonntag des Jahres 2016. Damit wir +=nur mit dem Operator inkrementieren können . Dieser Operator gibt den Wert zurück, nachdem das Inkrement abgeschlossen ist.

  • Erhöhen Sie den Wert um 7 Tage, um von Sonntag zu Sonntag zu springen, bevor Sie das Datum ausdrucken.

  • Wir hören auf, sobald der letzte Sonntag des Jahres 2017 erreicht ist.

  • Verwenden Sie Debuganstelle von Console, um zwei Zeichen zu speichern

  • Vermeiden Sie explizite Variablendeklaration und -zuweisung

AXMIM
quelle
Sofern nicht anders angegeben, sagen unsere Vorgaben Sie bieten sollte Funktion oder das Programm (dh kein Snippet), und Sie müssen Debug und Datetime qualifizieren : Ich würde empfehlen , das Hinzufügen using System;und die Umstellung auf Consoleaus Debug(was ein bisschen zwielichtig selbst ist, aber ich kann Keine Kommentare zu Meta zu finden).
VisualMelon
1
@VisualMelon Ich habe mich an "eine Funktion bereitstellen" gehalten und ich habe auch Debugfür Consoleda Debugein bestimmtes Include benötigt. Ich habe mich jedoch nicht an das Nutzungssystem gehalten, weil mein Konkurrent in dieser Sprache dies nicht tut. Sie können auch nicht außerhalb einer Klasse codieren, die selbst in einem Namespace definiert werden muss. Ich bin mir ziemlich sicher, dass die meisten C # -Antworten auf dieser Website dies nicht enthalten. Was machen wir nun mit all diesen Antworten im Müll? Stimmen wir sie alle ab, um sie zur Einhaltung zu zwingen? Wenn ja, dann könnte die Community c # genauso gut komplett vom Codegolf verbieten.
AXMIM
Diese 'Regeln' sind genau das, worauf sich die Community im Laufe der Zeit festgelegt (und auf Meta dokumentiert) hat. Wir stimmen Antworten nicht ab, kommentieren sie und stimmen sie auch nicht ab. Wenn sie sie reparieren, können wir sie verbessern. Beide anderen C # -Antworten enthalten Kommentare, die darauf hinweisen, dass die usingDirektive hinzugefügt oder die Methoden und Typen vollständig qualifiziert werden sollten. Bitte nehmen Sie nichts davon persönlich. Ich bin ein langjähriger C # -Golfer, und ich weiß zu schätzen, wie willkürlich die Regeln scheinen, deshalb schubse ich die Leute gerne in die richtige Richtung, wenn ich kann. Ich habe gezielt C # -Antworten, weil ich in dieser Sache relativ gut informiert bin.
VisualMelon
1
@VisualMelon Fair genug, ich bin hier sowieso nur ein Passant. Also werde ich deine Regeln akzeptieren, solange ich hier bin. Aus diesem Grund habe ich versucht, meine Antwort dieses Mal einzuhalten.
AXMIM
1
Sieht gut für mich aus! +1 für den ursprünglichen Ansatz. Und den Platz danach brauchen Sie nicht using System;(ich nehme an, das war nicht beabsichtigt), das sind also 109 Bytes.
VisualMelon
1

TSQL, 112 105 Bytes

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

Demo

T-SQL-Konvertierungssyntax

Salman A
quelle
Sie können 2 Bytes einsparen, DAYindem Sie durch ersetzen d. Es macht das gleiche.
AXMIM
1 Sie können weitere 3 Bytes speichern durch Ersetzen '20170101'mit 42734. Daten sind Anzahl. Zeit ist der Dezimalteil der Zahl.
AXMIM
1

JavaScript (ES6), 123 Byte

Es ist mein erster Beitrag hier, hallo!

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

Diese Lösung verwendet fest codierte Daten und wurde speziell für das Jahr 2017 entwickelt. Sie basiert auf keinen Datums- / Uhrzeit-APIs.

Was die Ziffern in der Zeichenfolge betrifft 155274263153, so ist jede Ziffer eine eigene Zahl und bezeichnet den ersten Sonntag eines jeden aufeinanderfolgenden Monats. Die Ausgabe für das gesamte Jahr kann durch sukzessives Hinzufügen von 7 zu diesen generiert werden.

Was ist mit der magischen Zahl 2633, die in der Schleife verwendet wird?
Nun ... 2633(dezimal) ist 101001001001binär. Was könnte das nun 1bedeuten? Von rechts beginnend wird das 1., 4., 7., 10. und 12. Bit gesetzt. Dies entspricht Monaten, die zufällig fünf Sonntage haben, im Gegensatz zu denen, die nur vier haben. Golfed bis zu diesem ordentlichen Ausdruck, sah es zunächst so aus: for(j=0;j<4+ +[0,3,6,9,11].includes(i);j++).

Ich denke, die restlichen Teile sind ziemlich selbsterklärend.

Nashorn
quelle
@SIGSEGV: Ich kümmere mich nicht zu ändern ECMAScript 2015zu Javascript (ES6), aber ... Sie brach mein Code und ich musste es zurück.
Nashorn
Oh, das ist der Konsens der Community, nur der Lambda-Teil ist erlaubt.
Matthew Roh
@SIGSEGV Dies ist hier nicht der Fall. Dieses Lambda enthält nur einen kleinen Teil des Codes, und ich benötige diesen Bezeichner, um es an anderer Stelle verwenden zu können. Ohne die ist a=der Code eigentlich kaputt .
Nashorn
1

T-SQL, 79 77 Bytes

Nachdem er Salman A geholfen hat, seine Antwort zu verbessern . Ich habe mich entschieden, meine eigene mit einer Schleife und zu schreiben PRINT.

Ich endete mit dieser 90-Byte-Lösung.

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

Dann habe ich mir den aktuellen Leader in T-SQL angesehen, der 94 Bytes von WORNG ALL mit dieser Antwort enthielt . Dieser Typ hatte sehr gute Tricks gefunden.

  1. Nennen Sie nur die Variable @
  2. Loop mit GOTOanstelle von LOOP
  3. Speichern Sie ein Zeichen mit FORMATanstelle von CONVERT. (Nur SSMS2012 +)

Mit diesen Tricks wurde diese Lösung auf die Lösung mit einer Größe von unter 79 Byte gekürzt.

DECLARE @ DATETIME=42734G:PRINT FORMAT(@,'dd.MM.yyy')SET @+=7IF @<43100GOTO G
AXMIM
quelle
Sie können 2 Bytes sparen, indem Sie @ = @ + 7 in @ + = 7 ändern und das Leerzeichen zwischen 7 und IF entfernen.
WORNG ALL
In diesem Beitrag habe ich alle Tricks, die dir vielleicht auch helfen.
WORNG ALL
1
@WORNGALL wunderbar, ich wusste nicht, dass wir das tun können. Vielen Dank.
AXMIM
1

Oktave , 37 Bytes

Viel kürzer als alle anderen nicht-Golf-Sprachen, und es ist sogar mit Jelly verbunden! Gut gemacht, Octave! :)

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

Probieren Sie es online!

Zum Glück 2 ADsieht das Jahr genauso aus wie das Jahr 2017 AD. Beide beginnen und enden an einem Sonntag und keines ist ein Schaltjahr. Das spart eine Menge Bytes, da 367:7:737es ziemlich viel kürzer ist als 736696:7:737060.

Hiermit wird die Anzahl der Tage seit dem 01.01.0001in eine Zeichenfolge im Format DD.mmmit einem nachgestellten Wert konvertiert .2017.

Stewie Griffin
quelle
1

Haskell , 133.130 Bytes

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)

Probieren Sie es online!

Ohne Kalenderbibliothek 148 144 140 Bytes

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

Dies ist lustig, da durch die Verwendung eines Operators für die Füllfunktion zwei Bytes gespart werden, obwohl das zweite Argument nicht verwendet wird, da weniger Klammern erforderlich sind. p(last l) ist länger als last l!l. Berechnet day/monthPaare, indem der kumulierte Monatsanfang vom Tag des Jahres abgezogen wird. Die Monatsstartdaten werden als ( scanl((+).(+28))0[3,0,3,2,3,2,3,3,2,3,2]) komprimiert . Die Monatszahl ist die Anzahl der positiven Elemente und die Tageszahl ist das letzte positive Element.

Probieren Sie es online!

Angs
quelle
0

C #, 116 114 113 Bytes

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

Kann in den interaktiven Fenstern von Visual Studio (oder einem anderen auf Roslyn basierenden C # REPL) ausgeführt werden

Bis auf 113 Bytes: Danke an Kevin Cruijssen.

rmrm
quelle
1
Könnten Sie einen TryItNow-Link hinzufügen ? Sie können auch ein bisschen Golf spielen, indem Sie eine for-Schleife anstelle einer while-Schleife verwenden:for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(new DateTime(i).ToString("dd.MM.yyyy\n"));
Kevin Cruijssen
@ KevinCruijssen Leider kann ich auf der angegebenen Seite keinen passenden Compiler finden. Hier ist ein Link zu der verwendeten Technologie, wenn Sie damit in Kontakt treten möchten: Link . Trotzdem danke für die neue Schleife. :)
rmrm
1
Sofern nicht anders angegeben, geben unsere Standardeinstellungen an, dass Sie eine Funktion oder ein Programm bereitstellen sollen (dh kein Snippet), und Sie müssen Debug und DateTime qualifizieren : Ich würde empfehlen using System;,Console.WriteLine(string)
VisualMelon am