In 140 Zeichen bekannte F # -Lösungen , und dies ist ein Rosetta-Code- Problem.
Erforderliches Ergebnis für stdout oder in einer Zeichenfolgenvariablen für das Eingabejahr 2014
:
2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28
Wie es für 1900 gefordert wurde:
1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30
Und 2000:
2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31
Aufgestellt, weil Datumsangaben in den meisten Sprachen Unbeholfenheit hervorrufen. Ich hoffe, sie sehen zu können, da sie keine Date-Bibliotheken zulassen! Wenn Sie sich jedoch außerhalb der Basissprache befinden, geben Sie den Namen des Posts an (z. B. C # + Jon Skeets NodaTime).
Klarstellungen:
- Jahresbereich 1900 bis 3015
- Gregorianischer Kalender
- Wenn es anders ist, was auch immer für UK / London üblich ist.
- Ein Programm, das eine Befehlszeilenoption oder stdin verwendet, ist in Ordnung und liefert das Ergebnis stdout
- Eine Funktion, die einen Wert für das Jahr annimmt und eine Zeichenfolge zurückgibt, ist ebenfalls in Ordnung.
Standardlücken ausgeschlossen . Wir freuen uns auf die APL-, J- und K-Lösungen und auf einige neue Date-Bibliotheken.
Antworten:
Dyalog APL mit cal von dfns , 19 Bytes
Besser spät als nie!
Fordert zur Eingabe des Jahres auf und gibt eine Datumsliste im Format JJJJ TT zurück .
⎕
Eingabeaufforderung für die numerische Eingabe und lassen Sie das das linke Argument für die{
...}¨
anonyme Funktion (siehe unten), die auf jeden von angewendet wird⍳12
die Zahlen von 1 bis 12 (die Monate)Die obige anonyme Funktion lautet wie folgt:
⍺⍵,
Stellen Sie die linken und rechten Argumente (dh Jahr und Monat) voran2↑
die ersten beiden Zeichen von⊢⌿
die unterste Reihe voncal
der Kalender für⍺⍵
linkes Argument und rechtes Argument (Jahr und Monat)TryAPL online:
Kehren Sie zu dieser Seite zurück, nachdem Sie hier zum Importieren
cal
und den Abhängigkeiten geklickt haben .Klicken Sie hier , um die Testfälle auszuführen.
quelle
+
-
<
≤
=
≥
≠
⌈
und⌊
arbeiten mit .Net- Datumsobjekten .Rubin, 91 + 6 = 97
Funktioniert ziemlich gut.
select(&:sunday?)
ist hübsch und*' '
erledigt überraschenderweise die gesamte Formatierung von selbst.quelle
chunk
anstelle von verwendengroup_by
.Bash 4.x + ncal, 57
Wenn Zeilenumbrüche anstelle von Leerzeichen in Ordnung sind, können wir den
-n
Schalter und das nachfolgende Leerzeichen aus derecho
Anweisung entfernen . Und ich denke, dass es auch ohne den Shebang funktionieren wird, also habe ich das auch entfernt:Ursprüngliches Skript (73 Byte):
Verwendung:
Hinweis: Bash-Versionen vor 4.0 lassen die führenden Nullen aus den Monaten weg. Dies kann mit dem Zusatz von 5 Zeichen festgelegt werden , indem
{01..12}
an`seq -w 1 12)`
. Außerdem kann diestail -c-3
auf einigen Systemen zu Problemen führen, bei denen die Ausgabe vonncal
nachgestellte Leerzeichen enthält, mir ist dies jedoch nicht bekannt.quelle
`…`
anstelle einer guten Angewohnheit eine verwendet wird$(…)
.#!/bin/bash
für das Golfen zählen müssen.IBM DFSORT,
113 Zeilen mit 71, 72 oder 80 ZeichenDie beiden Antworten mit kolumnarem Ausgabeformat haben sich bewährt. Das gibt mir eine Art "Schleife", in der bei OUTFIL REPEAT = der aktuelle Datensatz so oft kopiert wird.
Eine andere Technik, um zum Wert zu gelangen, die länger zu sein scheint, aber kürzer ist, da ich keinen unbedingten Weg finden kann, um mit der 12. Platte des folgenden Jahres umzugehen
IFTHEN=(WHEN=
. Gewinne auf den Schaukeln (der erste Monat ist der einfachste Weg, dies zu tun) verlieren stark an den Kreisverkehren (besondere Syntaxanforderungen).Dies verwendet eine eingebaute Funktion (alle Funktionen in DFSORT sind eingebaut), um den letzten Tag des Monats zu finden. Fügt dann einen Tag (Funktion) hinzu, um zum ersten des folgenden Monats zu gelangen, und verwendet die PREVDSUN-Funktion, um den vorherigen Sonntag zu erhalten (der wie zuvor immer der letzte Sonntag im vorherigen Monat sein wird).
Wenn das Jahr (Eingabe) in ein gültiges Datum umgewandelt wird, wird eine zweistellige laufende Nummer für den Monat verwendet, und dieser Wert wird auch für den Tag kopiert, da der Startpunkt keine Rolle spielt, solange er gültig ist, wie wir es sind nach dem letzten tag des monats anfänglich:
5,2
ist kürzer alsC'01'
.Hier ist das Detail:
OPTION COPY - Kopiert die Eingabedatei in die Ausgabe
OUTFIL - Damit mehrere Ausgabedateien mit unterschiedlicher Auswahl und Formatierung formatierte Berichte erstellen können. Wird
INREC
wegen der Verwendung von bevorzugt dem kürzeren vorgezogenREPEAT=
.REPEAT = 12 - 12 Kopien jedes Datensatzes erstellen. In diesem Beispiel kann es aufgrund der SEQNUM (im Gegensatz zur vorherigen Version) nur einen Eingabedatensatz geben.
5: - Beginnen Sie in Spalte 5 des Datensatzes.
SEQNUM, 2, ZD - Sequenznummer, beginnt standardmäßig mit einer, zwei Ziffern, "Zonendezimal" (für vorzeichenlose Zeichen, die mit dem Zeichen identisch sind).
1,8 - Byte 1 für Länge 8 zum aktuellen Speicherort kopieren (9). Dies liegt daran, dass der Y4T diese 8 sehen muss, ansonsten wird ein anderes Datumsformat verwendet.
Y4T - Datum im ccyymmdd-Format (aufgrund der 8 direkt davor).
LASTDAYM - Letzter Tag des Monats (auch möglich für Woche, Quartal und Jahr).
TOJUL = - Datumsumwandlung für Datumsfunktionen ausgeben (TOJUL ist ein Zeichen weniger als TOGREG)
9,7 - jetzt, da es 7 ist, wird Y4T CCYYDDD sein.
ADDDAYS - Fügt eine Anzahl von Tagen hinzu und passt sich automatisch an, wenn in den folgenden Monat / das folgende Jahr übergegangen wird (dies können auch ADDMONS und ADDYEARS sein).
PREVDSUN - das julianische Datum kommt herein, der vorherige Sonntag ist lokalisiert, TOGREG, um das richtige Ausgabeformat zu erhalten, mit dem Trennzeichen "-" (kann alles sein, was Sie als Trennzeichen mögen)
12X - Lücken, um das Chaos zu beseitigen, das es uns ermöglicht hat, es auf so kurze Weise zu tun
Die Ergebnisse für 2014 lauten wie folgt:
Es ist etwas erforderlich, um der SORT zu sagen, was zu tun ist. Es gibt keine Standardeinstellung.
OPTION COPY
ist die kürzeste,SORT FIELDS=COPY
entspricht aber länger.Die Arbeit selbst erledigte es diesmal in
OUTFIL
(um die Verwendung von REPEAT zu ermöglichen). Der Arbeitscode ist wahrscheinlich einer von 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) oder 138 (70 + 68) (ohne die führenden Leerzeichen, erzwungenen Fortsetzungs- und nachfolgenden Leerzeichen).Angesichts der Tatsache, dass der Empfänger wissen müsste, was er tut, kann ich sagen, dass der DFSORT - Code den letzten Sonntag eines jeden Monats für jedes Jahr ab 1900 auflistet (ab dem Jahr 0001), aber ich vermeide die Forschung als gut) bis 9999 (obwohl DFSORT Jahre bis 9999 unterstützt, würde die vorherige Lösung im Jahr 9999 nicht funktionieren, da das 12. Datum in das folgende Jahr fällt) kann getwittert werden.
Warum ist der Code so lang, wenn es besonders geeignete eingebaute Funktionen gibt?
Felddefinitionen sind kurzlebig. Ein Feld wird nur als eine bestimmte Position innerhalb der Daten (die ein Datensatz ist) für die sofortige Verwendung definiert. Anders ausgedrückt, Felder sind nicht als solche definiert, sondern werden für jede Verwendung und nur für die Verwendung definiert. Datumsfunktionen müssen wissen, welche (von vielen) Datumsformaten für die Quelle verwendet werden, und die Ausgabe muss in einem Datumsformat erfolgen, sodass angegeben werden muss.
Jetzt, wo wir ein julianisches Date haben ... TBC?
Braucht welche
JCL
Und eine Eingabedatei (eine weitere Zeile der JCL und drei Instream-Datenelemente):
Produziert:
Funktioniert tatsächlich bis zum Jahr 9999.
DFSORT ist das Mainframe-Sortierprodukt von IBM. Daten können manipuliert werden, aber da die Sortierung von entscheidender Bedeutung ist und die Sortierung häufig langwierig und umfangreich ist, verfügen die DFSORT-Steuerkarten über keine Schleifenkonstrukte. Daher können wir eine SORT nicht in eine Schleife einfügen. Macht die Dinge für Aufgaben wie Golf etwas langatmig.
Warum die Antwort posten, liegt daran, dass DFSORT eine
PREVDday
Funktion hat. So ist letzter Sonntag in einem Monat einfach. Es ist der Sonntag vor (PREVDSUN) dem ersten Tag des folgenden Monats.Es hat auch Spaß gemacht, es in einem "Operanden" (OVERLAY) zu machen, ein bisschen wie alles in einem
sprintf
oder ähnlichem.Hier ist es ungolfed:
Es ist zwar kein Missbrauch, aber es wäre nicht üblich, zu versuchen, dies alles in ein OVERLAY zu packen, und es gibt einige scheinbar unnötige Dinge, die erforderlich sind, damit alles in ein OVERLAY passt. Es gibt etwas Platz zum Golfen, aber da es höchstens eine Linie entfernen würde, bin ich nicht versucht.
Die INREC wird für jeden Datensatz verarbeitet.
Mit OVERLAY kann der Inhalt eines vorhandenen Datensatzes geändert werden. Wenn der Datensatz dabei über seine Länge hinaus verlängert wird, ist dies kein Problem.
1,4 ist das kommende Jahr. Es wird das Literal 0201 angehängt, und die nachfolgenden 1,8 wiederholen es elf Mal, um ein langes Chuck mit 96 Bytes zu erhalten.
Das 12. Jahr des erweiterten aktuellen Datensatzes wird um 1 erhöht und der Monat auf 1 (Januar) gesetzt.
Die verbleibenden 10 Monate werden in 3 bis 11 geändert.
Dann gibt es 12 in umgekehrter Reihenfolge (aufgrund von OVERLAY) dieser Art von Dingen:
Das n: ist eine Spaltennummer im Datensatz. Das X fügt ein Leerzeichen ein. 89,8 nimmt die Daten aus dieser Spalte / Länge, Y4T behandelt sie als CCYYMMDD-Datum, PREVDSUM berechnet den vorherigen Sonntag, TOGREG = Y4T (-) gibt sie als gregorianisches CCYY-MM-DD-Datum aus.
Weil Sie Müll bekommen, wenn sich die Quelle und das Ziel eines bestimmten Teils eines OVERLAYs zerstörerisch überlappen, ordnet sich das Endergebnis
11:X,18,120,6X)
neu und maskiert ein bisschen Chaos.Handbücher und Dokumente finden Sie unter: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 . Enthält das 900-seitige DFSORT Application Programming Guide.
Wie bei allen IBM Produkten sind alle Handbücher kostenlos erhältlich (mit Ausnahme einer unglaublich kleinen Menge sehr teurer Handbücher, die nur eine sehr kleine Anzahl von Menschen auf der Welt zu verstehen vorgibt).
Alle DFSORT-Steuerkarten müssen mit einem Leerzeichen beginnen. Die Spalte 72 wird nur zur Fortsetzung verwendet (jedes Nicht-Leerzeichen reicht aus, aber * ist konventionell). Auf die Spalte 72 folgt ein Sequenznummernbereich, der ignoriert wird, so dass jeder Datensatz 80 Bytes umfasst.
Vielleicht noch ein paar Lösungen.
quelle
Bash, 63 Bytes
Ausgabe:
quelle
for i in {1..12};{ date -v30d -v${i}m -v$1y -v0w +%Y-%m-%d;}
- 60 Bytes-v
param todate
ist spezifisch für das BSD-Datum. Dies funktioniert also unter OSX, aber nicht unter den meisten Linux-Betriebssystemen - vielleicht sollte dies in der Antwort angegeben werden.Python 2 - 189 Bytes
Geben Sie das Datum über STDIN ein.
Es kann noch viel mehr Golf gespielt werden. Das Programm geht ein wenig über Bord, nur zum Spaß:
Anmerkungen
zfill
Aufgrund des Eingabebereichs sind seit Jahren keine Eingaben erforderlich, auch keine Tage, da diese immer über 20 liegenPython 2 - 106 Bytes
Die nicht so spaßige Lösung:
calendar.monthrange
gibt zwei Zahlen zurück: den Wochentag, an dem der Monat beginnt (w
) und die Anzahl der Tage im Monat (n
). Die Lösung ist aufgrund eines Fehlers etwas eingängig - der zurückgegebene Wochentag beginnt bei 0 für Montag und nicht für Sonntag! Dies wird jedoch durch die Tatsache ausgeglichen, dassn
1-basiert ist.quelle
$from calendar import monthrange as gt$V12AGH>QhN%"%d-%02d-%d"(QhN-H%+GH7
JavaScript (ES6) 155
145Bearbeiten Behobene Zeitzonenprobleme Könnten kürzer sein, wenn sie rekursiv sind. Vielleicht.
quelle
new Date(y,0,++i,9)
. Dies schlägt auch für Schaltjahre ab 2100 fehl, da JS keine Informationen über diese Schaltjahre hat und daher für Schaltjahre ab 2100 überhaupt keine Informationen hatFeb 29
.new Date(2014,0,26,9)
war ein Sonntag richtig gebenISO
String sowiegetDay()
als0
.JavaScript, ES6,
222 219199 BytesIch habe keine JavaScript-Antwort im Rosetta-Wiki gesehen.
Auf geht's:
Dadurch wird eine Funktion erstellt,
S
die eine Zeichenfolge mit der gewünschten Ausgabe zurückgibt. Die Funktion kümmert sich auch um Schaltjahre.Aufgrund von ES6 funktioniert dies nur in einem aktuellen Firefox.
Danke an apsillers für den Tipp, der ihn auf 200 Bytes reduziert hat
Finden Sie die ungolfed-Version unten als Stack-Snippet, das Sie hier selbst ausführen können:
quelle
2100
Ausgabe2100-01-31 2100-02-28 2100-03-28 2100-04-25 2100-05-30 2100-06-27 2100-07-25 2100-08-29 2100-09-26 2100-10-31 2100-11-28 2100-12-26 2101-01-02
ist falsch.Rebol -
120 116 80 7976Ungolfed + einige Anmerkungen:
Beispiel für die Sonntagsberechnung in der Rebol-Konsole:
quelle
CJam,
122102 BytesDies verwendet keine Form der Datumsbibliothek. Es kann auch noch viel Golf gespielt werden, denke ich.
Teste es hier.
quelle
R 128 Zeichen
Mit Zeilenumbrüchen:
quelle
C # 255
Ungolfed
Bearbeiten: geändert, um nur den letzten Sonntag zu drucken :)
quelle
q, 67
quelle
"Oh nein, er schon wieder!"
Java -
259246 BytesUngolfed-Version:
Verwendung:
Ausgabe:
Noch eine andere "Lassen Sie uns eine Java-Antwort nur für Kicks setzen" Antwort. Naja. Aber zumindest, da Sie sich die Mühe gemacht haben, diesen Punkt meiner Antwort zu erreichen, werde ich versuchen, Ihnen noch mehr zu langweilen und meine Argumentation zu erklären.
Die Methode
g
erhält das gewünschte Jahr und erstellt für jeden Monat einGregorianCalendar
Objekt (Monate von 0 bis 11). Dannc.set
legt der erste den Wochentag als Sonntag fest und der zweite erklärt, dass wir die letzte Woche des Monats wollen - wie aus der offiziellen Dokumentation hervorgeht . DerSystem.out.println
Ausdruck gibt das Datum dieses Sonntags aus (wenn wir dies richtig machen, würde das Jahr wie folgt gedrucktc.get(c.YEAR)
, aber beiy
erneuter Verwendung werden 13 Zeichen weggelassen). Der Monat muss formatiert werden, um von Januar bis September eine führende Null hinzuzufügen (und die Der Wert wird inkrementiert, da hier die Monate mit 0-11 dargestellt werden und der Tag des letzten Sonntags gedruckt wird. Und dieser Vorgang wird für die anderen elf Monate wiederholt.quelle
C #
212, 237Mit Zeilenumbrüchen
Ausgabe für 2014
quelle
C # 171
Funktion, die einen String zurückgibt.
Ungolfed
quelle
C # 194
mit Linq:
Ungolfed
Ausgabe
quelle
Mathematica - 171
Wird in eine anonyme Funktion eingeschlossen, wird die Zeichenfolge zurückgegeben
Erster Mathematica Golf. Ich denke, es könnte erheblich reduziert werden.
quelle
VB-192
Könnte schlimmer sein ^^
Mein zweiter und letzter Eintrag (glaube nicht, dass ich ihn kleiner bekommen kann)
142
quelle
Rubin 76
Verwendet einen Befehlszeilenparameter
ruby sundays.rb 1900
. Verwendet die Date-Bibliothek.quelle