Was ist das kürzeste Programm, das vorhersagen kann, wann Freitag auf den 13. Tag des Monats fällt?
- Muss ein vollständig funktionierendes Programm sein (nicht nur eine Funktion / ein Unterprogramm)
- Das Datum muss im folgenden Format ausgedruckt werden:
YYYY-MM-DD
- Ermöglichen Sie dem Benutzer, ein Startdatum als Befehlszeilenargument oder durch anzugeben
STDIN
- Wenn der Benutzer kein Startdatum angibt, verwenden Sie Heute als Startdatum.
- Wenn das Startdatum ein Freitag, der 13. ist, sollte das Programm den nächsten Freitag, den 13., finden.
Wenn ich das Programm heute (16. Februar 2011) ausführen würde, würde ich die folgende Ausgabe erhalten.
$ ./fr13th 2013-05-09
2013-09-13
$ ./fr13th 2007-06-29
2007-07-13
$ ./fr13th 2007-07-13
2008-06-13
$ ./fr13th
2011-05-13
2013-9-13
Ausgabe für das erste Beispiel in Ordnung?Antworten:
Windows PowerShell, 74
Ziemliech direkt. Ein vielleicht verwirrendes Bit ist die Verwendung von
"Get-Date $args" | Invoke-Expression
, um entweder das aktuelle Datum (falls$args
leer) oder das in angegebene Datum abzurufen,$args
ohne einen Fehler auszulösen.72-Byte-Variante:
Dauert aber ewig ... das erhöht die Datumszeit nicht um einen ganzen Tag, sondern nur um 900 Nanosekunden. Aber zwei Bytes kürzer.
67-Byte-Variante:
Dies ist ein bisschen locale-sensitiv; Wenn es auf Ihrem Computer nicht funktioniert, versuchen Sie, das Datumsformat zuvor auf ISO-8601 einzustellen. :-)
Oh, und es kann genau wie die 72-Byte-Version in 65 Bytes umgewandelt werden.
Geschichte:
for
. Vergleich nur als Subtraktion, stattdessen werden-eq
zwei weitere Bytes eingespart.date
Zeichenfolge im Unix- Format ist etwas kürzer.yyy-MM-d
ausreichend (da das Jahr immer länger als drei Zeichen ist und der Tag immer 13. Vielen Dank an Ty Auvil dafür.quelle
iex
? Versuchen Sie stattdessen einfach (date $ args).$null
anGet-Date
, wird eine Fehlermeldung angezeigt, nicht das aktuelle Datum."date $args"|iex
Es wird jedoch entweder auf das in angegebene Datum$args
oder auf das aktuelle Datum aufgelöst. Genau das möchten wir hier.Bash, 75
Dies ist ein bisschen Gebietsschemasensitiv; Wenn es auf Ihrem Computer nicht funktioniert, versuchen
export
Sie esLC_ALL=C
vorher.quelle
Ruby,
9675 ZeichenNimmt das Datum von stdin. Um kein Datum anzugeben, drücken Sie Strg-D.
Vielen Dank für die Hilfe von Ventero.
Ungolfed:
Beispiel IO:
quelle
d.wday*d.day==65
ist 4 Zeichen kürzer. Und Sie sollten in der Lage sein , ersetzenDate.today.to_s
mit"thu"
require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d
. Und Sie könnten das Datum von stdin mit lesen,gets
anstatt ein$*[0]
anderes Zeichen zu speichern (geben Sie EOF ein, um das Standardverhalten zu erhalten).C # 185
Basierend auf der C # -Lösung von Andrew Koester , jedoch stark modifiziert. Ich bin schließlich zu einer Lösung gekommen, die meiner PowerShell-Lösung ähnelt:
quelle
Perl (und andere), 114
Perl 5.10 oder höher, mit
-E 'code here'
oder ausführen-M5.010 file
. Bedarfdate
(von coreutils für Linux) undcal
(von util-linux)Probelauf:
Ich bin mir nicht sicher, wann die führende Null für Monate vor Oktober gehalten wird. Es ist offensichtlich verloren, wenn das Jahr vorbei rollt; es scheint beibehalten zu werden, wenn die Antwort erst im nächsten Monat ist. Nennen wir das undefiniertes Verhalten - hey, das ist Golfen!
quelle
BASH
VERWENDETES KONZEPT:
BEISPIEL E / A
quelle
C #
240 Zeichen. C # benötigt den Modus "Nur innerhalb einer Funktion ausführen"!
Nicht golfen:
Ausgang testen
quelle
D: 227 Zeichen
Mehr leserlich:
Der lustige Teil ist, dass während Ds std.datetime diese Art von Code sehr einfach zu schreiben macht, es auch unglaublich ausführlich ist - hauptsächlich aufgrund der präzisen (und daher langen) Funktionsnamen. Die Benutzerfreundlichkeit und Wartbarkeit des Codes ist also sehr hoch, aber die Code-Golffreundlichkeit ist eher gering.
quelle
Python - 166 Zeichen
Liest von stdin, so müssen Sie eine leere Zeile eingeben, wenn Sie das heutige Datum möchten
quelle
SQLite, 374 Zeichen
(Zeilenumbrüche hier zur besseren Lesbarkeit hinzugefügt; nicht in der Zählung enthalten.)
Die Anforderung "Benutzer darf ein Startdatum entweder als Befehlszeilenargument oder über STDIN bereitstellen" wurde aufgrund technischer Einschränkungen weggelassen.
Die ersten 4 Anweisungen erstellen eine Tabelle (R) mit einer einzelnen Spalte, die alle Ganzzahlen von 0 bis 4095 enthält.
Die 5. Anweisung erstellt eine Tabelle (F) aller Freitag, den 13. zwischen dem 13.10.2000 und dem 13.12.2340.
Die 6. Anweisung gibt einfach den ersten Freitag, den 13. nach dem aktuellen Datum (UTC) zurück.
quelle
PHP - 103
(rohe Gewalt)
Ungolfed:
Prüfung:
quelle
!=
zu-
. Sie können auch bis zu 2 Zeichen speichern, indem Sie$d->modify('next fri')
im Inkrement-Bereich der Schleife nach oben gehen.-r
und Du brauchst das Tag nicht. Verwenden Sie die Standardkonfiguration mit-n
und Sie brauchen nicht@
.\n
ist unnötig.echo
stattdie
speichert ein anderes Byte.strtotime
Anstelle derDate
Klasse können ein oder zwei weitere gespeichert werden.C #,
206194 ZeichenAktualisieren
Dies ist eine etwas andere Sichtweise des Problems, weshalb ich meinen anderen Versuch hier vollständig überlassen habe.
Hier finde ich den "aktuellen" Freitag der Woche und erhöhe ihn dann um 7, bis ich einen finde, der 13 ist. Ich habe auch Joeys for-Schleife und Ausgabeformatierung verwendet, um einige Zeichen zu rasieren.
Ungolfed:
Original:
Dies ist ähnlich wie oben bei Andrew, aber es gab genügend Unterschiede. Ich entschied mich, eine separate Antwort zu posten, anstatt zu kommentieren und Änderungen vorzuschlagen.
Ungolfed:
quelle
R, 113 Zeichen
Beispiel läuft:
quelle
Perl 6 , 69 Bytes
Probieren Sie es online!
Danke an @ ASCII-only für -5
quelle
day-of-week==5
Javascript
ps: ja, ich weiß, ich habe die erste Regel gebrochen (könnte nicht nur eine Funktion sein)
Tests auf Javascript-Shell
quelle
T-SQL
359285253 ZeichenIch wollte nur die SQLite-Lösung mit meiner nicht cleveren ausführlichen Datumsfunktion unter Verwendung des T-SQL-Verfahrens auf den Prüfstand stellen.
Update: Meine ursprüngliche Befürchtung, dass ein Tagesschritt mehr Platz in Anspruch nimmt als ein Monatesschritt, war sehr falsch.
Testergebnisse (SSMS):
quelle
Ein weiteres Javascript, 153
Ich poste eine andere Javascript-Antwort, weil ich die erste nicht kommentieren kann ...
Ausführen mit nodeJS:
quelle
Python 3.3, 166 Zeichen
Die Eingabe ist in dem Format
2013 1 1
,oder drücken Sie einfach die Eingabetaste, um das heutige Datum zu verwenden (wäre 2013/12/11 für diese Ausgabe)
(Es gibt tatsächlich eine Mischung aus meiner Lösung und der von @gnibbler, die 144 Zeichen zählt.)
Die sehr schöne Zeile
while t.day*t.weekday()-65:
stammt aus der @ gnibbler-Lösung.quelle
Japt, 35 Bytes
-8 Bytes dank @ASCIIOnly!
Versuch es!
quelle
toISOString
Konvertiten zu UTC , die das Datum ändertK
Speicherzeit als lokale Zeit?Schnelle 4 , 310 Bytes
Probieren Sie es online!
-4 dank TagTaco.
Ach...:
Int
s als verwendet wirdBool
.??
.!=
braucht auch Abstand, damit es nicht als ein Auspacken interpretiert wird.quelle
VB.net (96c *)
Eintrag
Also ist meine Wertung so aufgeschlüsselt
quelle
Rebol, 136
Ungolfed:
Anwendungsbeispiel:
quelle
Java 8,
200197 BytesErläuterung:
Probieren Sie es hier aus (entfernen Sie das Argument, um das aktuelle Datum zu verwenden).
HINWEIS: Das Standardformat von Java ist beim Drucken bereits eingestellt
yyyy-MM-dd
.quelle
05AB1E , 141 Bytes
05AB1E verfügt über keine integrierten Funktionen für Datumsobjekte oder Berechnungen. Das einzige eingebaute Datum ist das heutige Jahr / Monat / Tag / Stunde / Minute / Sekunde / Mikrosekunde.
Aus diesem Grund handelt es sich bei fast dem gesamten Code, den Sie sehen, um manuelle Berechnungen für den nächsten Tag und für die Berechnung des Wochentags.
Meistens abgeleitet von meiner 05AB1E-Antwort in der Countdown- Herausforderung " Arbeitstag" (weshalb ich diese vor ungefähr einer Stunde bearbeitet habe, als ich auf einen Fehler bin.)
Die Eingabe ist eine Zeichenfolge im Format
dd-MM-yyyy
(die Ausgabe erfolgt jedoch im Formatyyyy-MM-dd
, da dies eine der Regeln der Herausforderung ist).Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle