Ein Datum kann durch eine ganze Zahl ohne Vorzeichen dargestellt werden: JJJJMMTT. Was Sie tun müssen, ist, das kürzeste Programm oder die kürzeste Funktion zu schreiben, die das letzte Datum ermittelt, dessen Nummer durch eine bestimmte Zahl teilbar war n
(einschließlich des heutigen Datums), und dieses Datum dann in dem oben gezeigten Format zurückzugeben. Wenn es noch nie ein Datum (zwischen 00000101 und einschließlich heute) gab, das durch die angegebene Ganzzahl teilbar ist, sollten Sie -1 zurückgeben.
Beispiele
Current Date Input Output
30 July, 2014 4 20140728
30 July, 2014 7 20140729
28 July, 2014 4 20140728
28 July, 2014 7 20140722
28 July, 5 90000 -1
Eingang
Sie können aus STDIN lesen, ein Funktionsargument verwenden oder sogar erwarten, dass die Eingabe in einer Variablen gespeichert wird. Die Eingabe ist eine vorzeichenlose Ganzzahl.
Ausgabe
Schreiben Sie in STDOUT oder geben Sie die Ganzzahl für das Datum im Format JJJJMMTT zurück (oder speichern Sie sie in einer Variablen).
Beschränkungen
Sie können jede Standardbibliothek verwenden, die Ihre Sprache anbietet. Es gelten Standardlücken .
Gewinnbedingungen
Dies ist ein Code-Golf , also gewinnt das kleinste Programm (in Bytes). Bei Stimmengleichheit gewinnt die Antwort mit den meisten Stimmen.
Antworten:
Mathematica,
9360 BytesErwartet, dass die Eingabe in gespeichert wird
n
.Beachten Sie, dass die vertikale Linie
∣
das Unicode-Zeichen für "Teilungen" ist, die ich als 3 Bytes (UTF-8) gezählt habe.Bearbeiten: Fand einen ordentlichen Trick, um die aufgeblähte
DateString
und Formatangabe zu vermeiden :).Bearbeiten: Total vergessen über die
-1
Anforderung. Jetzt behoben.Hier ist eine Erklärung
Beachten Sie, dass ich
|
stattdessen∣
in der Erklärung verwendet habe, weil der Unicode mit Monospacing herumspielt.quelle
Python 2 - 150
Vielen Dank an @ chill0r für den Vorschlag, days = zu entfernen, und an Jason S für den Hinweis, dass der try-Block auf eine Zeile reduziert werden kann.
quelle
days=
int-=d.timedelta(days=1)
. Dies funktioniert auch gut (zumindest in Python3)int(t.strftime("%Y%m%d"))
und Löschenre
, (2) Verwenden einer einzeiligen Zeile,try
da diese nur enthalten seint-=d.timedelta(1)
muss.strftime
auf älteren Daten funktioniert in Python3, überprüft und ich bekomme einen Fehler in Python2C # 136
Mit den überarbeiteten Spezifikationen eine Funktion, die ein vorzeichenloses int annimmt und ein int zurückgibt.
152 Zeichen mit variabler Ein- / Ausgabe
Unter Ausnutzung der losen Eingabe- / Ausgabeanforderungen muss die Eingabe in der Variablen gespeichert werden
n
(derzeit werden alle Zeichen außer dem Ganzzahlliteral gezählt), und die Ausgabe wird mit der Variablen bereitgestellts
.204 Zeichen mit STDIN / STDOUT:
quelle
T-SQL (2012) - 148
Angenommen, es gibt eine freie Variable @n mit dem Wert n.
quelle
Golflua
9086Eine ungolfed Lua Version wäre,
quelle
MATLAB: 61
Angenommen, der Divisor ist in gespeichert
n
. Das Ergebnis wird in einer Variablen namens gespeichertans
.Kommentierte Version:
Erzeugt einen Fehler, wenn kein Ergebnis gefunden wird, die Antwort aber trotzdem in der Variablen verfügbar ist.
Fehler könnten auf Kosten von 2 zusätzlichen Zeichen vermieden werden:
quelle
PHP (92 = 85 + 7)
Erwartet, dass die Eingabe in gespeichert wird
$n
.Mir ist gerade eingefallen, warum ich PHP nicht mehr mag =)
EDIT: Jetzt ist auch die -1 der Spezifikation implementiert.
quelle
JavaScript (ES6) 115
Erwartet Zahl in Variable n, Ergebnis in Variable r gespeichert. Jeder Tag wird überprüft, beginnend mit dem aktuellen Datum und absteigend - es muss einen besseren Weg geben.
Bei Verwendung der Standard-Javascript-Datumsfunktionen sind alle Datumsangaben bis zum Jahr 1 gregorianisch (wobei Schaltjahre vor der gregorianischen Reform dementsprechend falsch sind).
quelle
C # - 144 (oder 124 in LINQPad) + 1 für jede Ziffer in
n
Dies erwartet, dass sich die Eingabe in der Variablen befindet
n
. Am Ende der Ausführung befindet sich der gewünschte Wert in der Variablenr
. Dies gilt jedoch00010101
als erstes Datum, da das Datum00000101
nicht vorhanden ist. Verbesserungsvorschläge sind immer willkommen.LINQPad-Version:
quelle
Groovy -
301300 ZeichenSehr einfach (und langsam), ohne Tricks, um die Tatsache zu verbergen, dass es Joda Time verwendet.
Golf gespielt:
Beispiellauf (am 30.07.2014):
Ungolfed:
quelle
R
146,139Viel Glück bei einem Date, das nicht funktioniert.
microbenchmark
Berichten zufolge dauert es ungefähr eine halbe Sekunde, um 15 Tage zurückzugehen. Ab dem 31. Juli 2014 dauert das Ausspucken etwa 20 Millionen Sekunden (~ 23 Tage)-1
, zumindest entsprechend der Rückseite des Umschlags.Bearbeiten : Einige Verknüpfungen in den Kommentaren
quelle
!d
ist kürzer alsd==F
und!z%%n
alsz%%n==0
. Das Verwandelnas.numeric(gsub("-","",...)
in eine Funktion sollte auch die Anzahl der Zeichen verringern. Trotzdem gute Arbeit!as.real
ist oft eine gute, kürzere Alternative zuas.numeric
.as.real
aktuell ab R 3.0.0. Aber wir haben immer nochas.double
ein Zeichen kürzer.paste0
ich.Rprofile
natürlich schon in meinem :)Matlab 104
Ungolfed:
EDIT: Ich schaffte es ein wenig zu optimieren, aber @DennisJaheruddin hat die wirkliche Lösung hier
quelle
-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Python 3 -
151148 Bytes, GeneratorenDanke @ nyuszika7h für den
import*
Vorschlagquelle
Rubin 103
Eingang
Erwartet, dass der Divisorwert in Variable vorhanden ist
n
.Ausgabe
Der Rückgabewert der
f
FunktionOnline-Beispiel: http://ideone.com/LoYxG4
quelle
Java: 373 Zeichen
Dies ist ein Port der Groovy-Antwort und verwendet Joda Time.
Golf gespielt:
Beispielläufe (mit joda-time-2.4.jar auf classpath:
Ungolfed:
quelle
java.time.*
in der neuesten Version von Java.Bash + Coreutils (8,21), 67 Bytes
seq
generiert ganze Zahlen von 1 bis 9 9 , eine pro Zeile, und formatiert sie als-<x>day
date -f
um jede Zeile zu interpretieren und das Datum alsdc
Ausdruck auszugeben , z. B.[pq] sp [_1pq] sq 20140728 d A1 =q d 7% 0=p
(Leerzeichen zur besseren Lesbarkeit hinzugefügt).[pq]
Definieren Sie ein Makro, um den oberen Bereich des Stapels zu drucken, und beenden Sie es dannsp
Makro in Register p speichern[pq]
Definieren Sie ein Makro, um -1 zu drücken, den oberen Bereich des Stapels zu drucken und dann zu beendensq
Makro in Register q speichern20140728
eingebettete Datums-Ganzzahld
Doppelte Oberseite des StapelsA1
Drücken Sie 101 (00000101).=q
Pop-Top-2-Stack-Werte: Vergleiche Datum und 101 und rufe das Makro auf,q
wenn es gleich ist7
Teiler drücken%
Pop-Teiler und Dividee, das Teilen und den Rest schieben0
0 drücken=p
Pop-Top-2-Stack-Werte: Vergleiche Rest und 0 und rufe das Makro auf,p
wenn es gleich istd
Doppelte Oberseite des Stapelsp
heißt: gibt Datumszahl aus und wirddc
vollständig beendetdc
Ausdrücke werdendc
zur Auswertung weitergeleitet. Sobalddc
der richtige Wert gedruckt und beendet wurde, wird der Rest der Pipeline abgerissenAusgabe:
Da dieses Programm Ganzzahlen von 1 bis 9 9 generiert , wird es in etwas mehr als 1 Million Jahren in der Zukunft gültig sein. Ich hoffe diese Einschränkung ist akzeptabel ;-)
Vielen Dank an @ WumpusQ.Wumbley für die Verkürzung der Rückgabe von -1.
quelle
|grep .||echo -1
sie am Ende der Pipeline hinzu oder verwenden Sie zsh, wo Sie Erweiterungen wieecho ${$(cmd):-1}
diese verschachteln können (dies kostet Sie einen Backslash an anderer Stelle ...)sizeof time_t
Problem zu sein, da die Grenze, an der es bricht, 2 ** 31 Sekunden vor dem 1.1.1970 ist. Meine ältere Installation ist auch pathetisch 32-BitPYTHON: 134 Bytes
Ich werde nicht in der Lage sein, den aktuellen Anführer zu schlagen, und es ist nicht viel besser als die beste Python-Antwort, aber ich habe mich entschieden, meine beste Python-Lösung zu veröffentlichen.
Ungolfed:
quelle
from datetime import*
anstelle vonimport datetime as d
,timedelta(1)
anstelle vond.timedelta(1)
undyield
anstelle von verwendenreturn
.JavaScript (ES5) - 94
Es erwartet die Eingabe in Variable
x
und platziert die Ausgabe ino
.quelle
k4
(84)(73)Dies ist nur ein erster Schnitt mit dem ersten Algorithmus, der mir in den Sinn kam; Ich bin mir sicher, dass sowohl in der Leistung als auch in der Länge etwas Besseres möglich ist.
Diese Version kodiert den "Heute" -Teil fest (das ist der
.z.D
); Ändern Sie es in ein Datumsliteral (yyyy.mm.dd
) oder eine Ganzzahl im q-Datumssystem (Tage seit dem 1. Januar 2000), um die Testfälle auszuführen. (q parst Datumsliterale nicht vor dem frühen 18. Jahrhundert. Daher müssen Sie für Datumsangaben davor den Wert ermitteln und die entsprechende Ganzzahl direkt verwenden. 1. Januar: "AD 0" aus der Spezifikation wird gedreht out to be-730457
, das im Funktionscode verwendet wird. 28. Juli, AD 5, aus dem letzten Testfall, stellt sich als-728450
.)Die gegebenen Testfälle:
bearbeiten:
Dies ist ein anderer Ansatz, bei dem einer der Konvergenzoperatoren das Datum dekrementiert, bis entweder eine teilbare Zahl gefunden wird oder die Grenze von 1/1/0000 überschritten wird. Die Konvertierung von Datum zu Ganzzahl erfolgt ebenfalls geringfügig anders.
Die Testfälle, diesmal auf einmal:
quelle
VBA 343 Bytes (Modul)
quelle
Sub d(i):a=Now:b=a:Do Until b/i=Int(b/i):a=DateAdd("d",-1,a):b=Format(a,"yyyymmdd"):If b="01000101"Then:b=-1:Exit Sub:Loop:Debug.?b:End Sub
für 139 Bytes stark komprimiert werdenPowerShell - 76
Dies hängt von der in der Variablen gespeicherten Nummer ab
$n
.quelle