Sie wissen, was ein Palindrom , eine Primzahl und ein Datum sind.
Ihre Aufgabe ist es, alle Daten in 100.000 Jahren aufzulisten, die alle drei Merkmale erfüllen.
Vergiss alles andere als die Zahlen, verwenden Sie die folgenden Formate: YYYYMMDD und JJJJjMMTT .
Daten zwischen 0000-01-01 und 9999-12-31 sollten als 8-stellige Palindromdaten (falls vorhanden?) Und Daten zwischen 10000-01-01 und 99999-12-31 als 9-stellige Palindrome gedruckt werden .
Es ist nicht zwingend erforderlich, die Daten in chronologischer Reihenfolge aufzulisten.
Beispielteil einer gültigen Ausgabe.
Die ersten drei 9-stelligen palindromischen Hauptdaten:
...
100111001
100131001
100161001
...
Regeln
Es gelten Standardlücken .
02-29
existiert nur für Jahre, die durch 400 oder (teilbar durch 4 und nicht teilbar durch 100) teilbar sind.Antworten:
Ruby ,
144141 Bytes (134 + 7 für die-rprime
Flagge)3 Bytes dank benj2240 gespeichert !
Probieren Sie es online aus!
Der Algorithmus:
Time
beispielsweise mit den gegebeneny
,m
,d
Werten. Wenn das resultierende Zeitobjekt einen#day
Wert vond
hat, war dies ein gültiges Datum. Andernfalls würde sich das Datum verschieben (z. B.Time.new 2018,2,30
Rückgabe2018-03-02
).Die innere Schleife war ursprünglich eine Funktion, die für jedes Element im
(?0..?9)
Bereich sowie für die leere Zeichenfolge aufgerufen wurde .Da die leere Zeichenfolge keine Ergebnisse lieferte (es gibt keine gültigen 8-stelligen Prim-Palindrome), habe ich beschlossen, sie zu entfernen und auf diese Version umzugestalten.
quelle
t
Variable entfernen : TIOPython 2 ,
116107128122119 BytesDie zweite Hälfte der 4. Zeile ist inspiriert von der Antwort von mxdsp auf eine andere Golffrage .
Erläuterung
Die Funktion verwendet
g()
nur ein Argument, um dien
Variable mit ihrem Standardwert zu initialisieren . Der Anfangswert ist eine ungerade Zahl, die so kurz wie möglich und so groß wie möglich ist und dennoch kleiner als die erste gültige Antwort 100111001 ist.Schleife bis
n
zum Ende des Datumsbereichs 10 9 . Inkrementn
um 2.m
ist der Monat des Datumsn
.Wenn
n
es sich um ein gültiges Datum, Palindrom und Primzahl handelt, drucken Sie es aus:0 < m < 13
prüft, ob diesm
ein gültiger Monat ist.n % 100 < 31 + (m+m/8)%2
prüft, obn
der Tag des Monats gültig ist.(m+m/8)%2
fügt1
für alle Monate mit 31 Tagen hinzu. Der Verdienst dafür geht an die Antwort von ArmanX . Für den 29. bis 30. Februar gibt es keine Primzahlen.`n`[::-1] == `n`
. Die Backticks stringifizierenn
.[::-1]
kehrt den String um.2**n % n == 2
ist ein Fermat-Primalitätstest . Dieser Test ist nur probabilistisch. Es gibt auch Nicht-Primzahlen, die übereinstimmen. Aber nicht im Zahlenbereich, den wir betrachten.quelle
APL (Dyalog Unicode) , 155 Bytes
Probieren Sie es online aus!
Dies ist ein Tradfn ( einf itional f unctio n ) , die ein Argument
arg = yyyymmdd
oderarg = yyyyymmdd
. Verwendung istf arg
.Dies gibt nichts aus, wenn das Argument beginnt,
10000101
da es in 60 Sekunden kein primäres Palindromdatum findet.Hier ist ein weniger Golf-Ansatz, der die Beispielausgabe des OP von ausgibt
( Probieren Sie es online! )
Beachten Sie, dass beide Codes bis kurz vor dem rekursiven Aufrufen der Funktion für das nächste Datum exakt gleich sind. Während die Golfversion es einfach so nennt
f arg+1
, springt der weniger Golfcode von Tag31
zu Tag01
und von Monat12
zu Monat01
, was es ziemlich beschleunigt.Wie es funktioniert:
quelle
Python 3, 163 Bytes
Die Lösung ist ziemlich lang (und kann wahrscheinlich verbessert werden), verwendet jedoch keine integrierten Funktionen für die Überprüfung von Prim / Datum / Palindrom. Eine etwas ungolfed Version für Klarheit:
Gültige Daten werden durch Auswahl eines Monats und eines Tages generiert. Wie bereits erwähnt, muss nur Größe 9 berücksichtigt werden. Beachten Sie auch, dass Schaltjahre nicht berücksichtigt werden. Dies ist aufgrund des glücklichen Zufalls nicht erforderlich, dass Palindrom-Primzahlen der Länge 9, die auf 0229 enden, einfach nicht existieren (andere Datumsanomalien wie der 30. Februar 1712 können aus demselben Grund verworfen werden).
Als nächstes wird die mittlere Ziffer frei gewählt und ein Primärtest durchgeführt. Da der Primetest so kurz wie möglich sein musste, ist er sehr naiv und damit lähmend langsam. Die Verwendung einer externen Bibliothek könnte dies lösen (und einige Bytes sparen), aber wie bereits erwähnt, wollte ich keine verwenden.
quelle
WolframLanguage (Mathematica) 187 Bytes
Möglicherweise ist eine gewisse Größenreduzierung festzustellen. Erklärung folgt ...
Testfälle
(* {"100111001", "100131001", "100161001"} *)
Erklärung des Codes
DayRange[d@#,d@#2]
Gibt alle Daten zwischen{10011, 10, 1}
und zurück{10017, 1, 1}
. In diesem Fall werden ungefähr 5 Jahre und 4 Monate (genau 1920) zurückgegeben. Schaltjahre werden berücksichtigt.Die Daten werden in Wolfram-Standardformatierung zurückgegeben. Das erste Datum wird beispielsweise als
DateObject[List[1,1,1],"Day","Gregorian",-5.
] `angezeigt#[[1]] & /@
wird den Teil des Datums in jedem Datum entfernen, der uns betrifft. Gibt im BeispielDateObject[List[1,3,7],"Day","Gregorian",-5.]
das abgekürzte Datum zurück{1,3,7}
.t/@p[#3,2]}
oderToString/@Padleft[#3,2]
füllt das dritte Element auf, nämlich die 7, die "für den 7. Tag des Monats" steht"07"
. Eine ähnliche Auffüllung ist für das einstellige Symbol für den Monat März vorgesehen, dh es3
wird zurückgegeben als"03"
.p[#, If[Length@# < 5, 4, 5]]
füllt das Jahr mit Nullen auf, um die Länge einer 4- oder 5-stelligen Zeichenfolge zu erreichen. In diesem Fall wird der Januar nämlich1
als "00001" zurückgegeben."" <>...
verbindet die Saiten. In diesem Fall wird zurückgegeben"000010307"
.Cases[...x_ /; PalindromeQ@x && PrimeQ@ToExpression@x]
gibt jene Fälle unter den 1920er Daten zurück, die Palindrome und Primzahlen sind.quelle
Javascript ,
187177Annahmen: keine übereinstimmenden 4-stelligen Jahre; Keine passenden Tage im Februar zwischen 29-30
Es funktioniert so:
Geschichte:
Anmerkungen:
Beim Testen habe ich festgestellt, dass es keine gültigen Übereinstimmungen gibt, die 4-stellige Jahre sind oder am 29. oder 30. Februar liegen. Leider gibt es aus Gründen des Codes genau fünf (ungültige) Ergebnisse, die auf den 31. verschiedener Monate fallen das haben nur 31 tage.
quelle
Java 10,
329327320318312308307264 Bytes-1 Byte dank @assylias .
Erläuterung:
Probieren Sie es online aus (Hinweis: Der Teil zur Überprüfung der Primzahl wurde durch eine effizientere getrennte Methode ersetzt, obwohl selbst nach 60 Sekunden eine Zeitüberschreitung auftritt und nur die ersten ~ 115 palindromischen Primzahlen ausgegeben werden).
Pastebin aller 197 Ausgaben eines lokalen Laufs.
quelle
if(t.equals(new StringBuffer(t).reverse()+"")
->if(t.contains(new StringBuffer(t).reverse())
um 1 Zeichen zu speichern (funktioniert, weil wir wissen, dass beide Zeichenfolgen die gleiche Länge haben). Das ist nicht viel :-(VBA, 347
quelle
DateString
ist ein beliebiger Variablenname, also sollten Sie das auf ein einziges Zeichen reduzieren können, oder?Sauber ,
262... 213 BytesProbieren Sie es online aus!
quelle
Javascript ,
234229 BytesEin bisschen sperrig, aber es zu posten, um den JS-Ball ins Rollen zu bringen. Anregungen willkommen!
Ungolfed:
Wie es funktioniert:
Die Magie des Ziffernwechsels basiert hauptsächlich auf Experimenten.
Ich begann damit, herauszufinden, von welcher Zahl ich subtrahieren sollte, um die gespiegelte Version zu erhalten. Ich habe mich nur um die letzten beiden Ziffern gekümmert.
Also, wenn wir nehmen
n
, finden Siek
dasn+k=flip(n)
. Für10<n<20
k
begann bei 101 und erhöhte sich in Schritten von 9. Fürn<10
war dies jedoch 100. Ich nahm an,k
dass es für jeden Sprung von 10 erhöht wurde, und nach einigem Fummeln stellte ich fest, dass es richtig war.Also,
k=100+9*n+n//10
wo // ganzzahlige Division bedeutet.So bekommen wir
n+k = n+(100+9*n+n//10) = 100+10*n+n//10 = flipped(n)
.Ich kann weder beweisen noch behaupten, dass dies für irgendeine Zahl funktioniert, aber es hat zu korrekten Ergebnissen für die hier verwendeten Zahlen geführt.
Für den Primalitätstest gilt die Antwort von Kevin Cruijssen . Ich hatte eine etwas kürzere Version, aber ich konnte es nicht richtig machen:
Ich habe den Palindrom-Test übersprungen, indem ich Monate, Tage und eine mittlere Ziffer durchlaufen habe, damit ich Zeichenfolgen erstellen kann
dDmMxMmDd
, wobeiD
die erste Ziffer des Tagesd
die zweite usw. ist.Geschichte
5 Bytes wurden gespeichert, indem der bedingte Teil von q entfernt wurde
quelle
f
das Ergebnis als Parameter fürq
, schneiden Sie also den mittleren Mann aus und schreiben Sief=n=>''+n%10+(n/10|0)
, und das Ergebnis von q wird immer als Zeichenfolge verwendet, damit Sie schreiben könnenq=n=>n<10?'0'+n:n
.APL NARS 626 Bytes, 313 Zeichen
Dieser Druck, was in 50 Sekunden gefunden wird, als sich selbst zu stoppen (weil ich sonst das Programm zum Kopieren nicht stoppen kann, füge den Test ein, weil ich nicht weiß, wie ich das Programm stoppen kann, ohne die Fenster des Interpreters zu schließen) Test:
quelle
Julia 0,6 , 109 Bytes
Link geht zu einer längeren Version mit zwei Unterschieden:
Probieren Sie es online aus!
quelle