Sag es niemandem, aber ich habe die Zeitreisemaschine meines Onkels geklaut! Mein Onkel ist jedoch von Primzahlen besessen, und das zeigt sich in der Maschine - er hat sie so programmiert, dass sie nur Daten enthält, die eine Primzahl ergeben.
Es kann also nicht nach 1947-08-15
1947 + 8 + 15 = 1970 gehen, was keine Primzahl ist. Es kann gehen 1947-07-25
, weil 1947 + 7 + 25 = 1979, das ist prime. Wenn ich mir also Indiens Unabhängigkeitsfeier ansehen möchte, muss ich wohl ein paar Wochen früher gehen und diese 20 Tage abwarten.
Ich habe einige andere Daten, zu denen ich gehen möchte, und ich muss ebenfalls zu einem Datum gehen, das vor meinem Zieldatum liegt (oder, wenn ich Glück habe, gleich meinem Zieldatum ist) und eine Primzahl ergibt. Ich bin jedoch ungeduldig und möchte nicht zu lange warten. Deshalb möchte ich das Datum finden, das meinem Zieldatum am nächsten kommt.
Können Sie mir ein Programm schreiben, das mein Zieldatum und das Datum angibt, das ich in die Zeitmaschine eingeben soll - das nächstliegende Datum vor oder gleich dem angegebenen Datum, dessen Teile sich zu einer Primzahl addieren?
(Für diese Herausforderung verwenden wir den proleptischen Gregorianischen Kalender - was einfach bedeutet, dass wir den aktuellen Gregorianischen Kalender auch für Zeiträume verwenden, in denen Menschen den älteren Julianischen Kalender verwendeten.)
Eingang
- Ein Treffen
- im Idealfall jedes Datum in der aktuellen Ära (AD); praktisch kann jede Untergruppe Ihrer Sprache auf natürliche Weise damit umgehen
- in jedem von Menschen lesbaren Format, das Sie mögen
Ausgabe
- Das Datum, das dem Eingabedatum am nächsten liegt und kleiner oder gleich dem Eingabedatum ist und dessen Datum + Monat + Jahr eine Primzahl ergibt.
- in jedem von Menschen lesbaren Format, das Sie mögen
⁺: "vom Menschen lesbar", wie in Tag, Monat und Jahr, alle getrennt, in welcher Reihenfolge auch immer
Testfälle
1947-08-15
=> 1947-07-25
1957-10-04
=> 1957-09-27
1776-07-04
=> 1776-07-04
999-12-12
=> 0999-12-10
2018-06-20
=> 2018-06-15
1999-01-02
=> 1998-12-29
1319-12-29
=> 1319-07-01
(Danke an @Shaggy, @PeterTaylor und @Arnauld für die Hilfe bei der Frage.)
Fri Jul 25 02:46:39 CEST 1947
)Antworten:
Rot , 87 Bytes
Probieren Sie es online!
Besser lesbar:
quelle
JavaScript (Node.js) , 94 Byte
Nimmt die Eingabe als 3 Ganzzahlen in die aktuelle Syntax auf
(year)(month)(day)
. Gibt eine durch Bindestriche getrennte Zeichenfolge mit einem führenden Bindestrich zurück.Probieren Sie es online!
Wie?
Wir konvertieren zuerst das Datum in das JSON-Format
yyyy-mm-ddT00:00:00.000Z
( ISO 8601 ), teilen es auf'T'
, behalten nur den linken Teil bei und fügen einen führenden Bindestrich hinzu, der ergibt-yyyy-mm-dd
.Dieser Ausdruck s kann nun
eval()
‚uated das Gegenteil zu bekommen n der Summe von Jahr + Monat + Tag .Wir verwenden die Hilfsfunktion P () , um zu testen, ob -n eine Primzahl ist (in diesem Fall wird 0 zurückgegeben ). Wenn es so ist, geben wir s zurück . Ansonsten versuchen wir es nochmal mit dem Vortag.
quelle
Python 2 ,
130127 BytesEingabe ist
year, month, day
.-3 Bytes dank Kevin Cruijssen .
Probieren Sie es online!
quelle
Java 8,
144128 BytesProbieren Sie es online aus.
java.time.LocalDate
Klasse war eine Verbesserung im Vergleich zu den altenjava.util.Date
, aber warum mussten sie diese Namen länger machen (getMonthValue
undgetDayOfMonth
anstelle vongetMonth
undgetDay
) ..>.>Erläuterung:
quelle
Ruby , 94 Bytes
Probieren Sie es online!
Nimmt eine einzelne Datumseingabe entgegen und gibt eine Zeichenfolge im ISO 8601-Format zurück (
YYYY-MM-DD
).Es verwendet Rubys Hauptmodul. Wenn das nicht erlaubt oder verpönt ist, dann stelle ich für zwei Bytes mehr diesen Gräuel vor:
Ruby , 97 Bytes
Probieren Sie es online!
Aus dieser Stapelüberlaufantwort wird geprüft, ob eine Zahl Primzahlen enthält . Ich habe keine Ahnung, wie das funktioniert, es sieht ein bisschen wie Hexerei aus. Gleiche Eingabe wie oben und gleiche Ausgabe.
quelle
d
und das Leerzeichen nach dem Gedanken nichtif
, also können Sie 3 Bytes von Ihrer ersten Antwort entfernen, indem Sie diese entfernen. TIO Link?x*n !~ /^x?$|^(xx+?)\1+$/
= Um zu überprüfen, ob n Primzahl ist, erstellen Sie eine Folge von n 'x' s, stellen Sie sicher, dass es nicht 0 oder 1 x 's (die keine Primzahl sind) sind und dass es mit keinem übereinstimmt 2 oder mehr x wiederholen sich (Matching^(xxxxx)\1+$
würde bedeuten, dass n durch 5 teilbar ist). Es missbraucht das Backtracking der Regex-Engine, um unsere Loopings für uns durchzuführen - es ist brillant, monströs und wahrscheinlich war Tieropfer an ihrer Entdeckung beteiligt.Ruby ,
5753 BytesProbieren Sie es online!
Nicht meine Idee - von IMP1 aus dem "Greuel" gestohlen
Originale Idee:
Ruby , 59 Bytes
Probieren Sie es online!
quelle
8e4
stattdessen funktionieren?R , 117 Bytes
Probieren Sie es online!
quelle
F #,
134133 Bytes-1 byte dank von sundar .
Probieren Sie es online!
Zählen Sie Tag, Monat und Jahr zusammen und prüfen Sie, ob es optimal ist. Wenn dies der Fall ist, geben Sie das Datum zurück. Wenn nicht, verringern Sie das Datum um 1 Tag und versuchen Sie es erneut.
quelle
-1.0
als-1.
schreiben.PowerShell ,
105 bis90 ByteProbieren Sie es online!
Dank Sundar für -13 Bytes.
Nimmt Eingaben als ein
DateTime
2018-06-20
und speichert sie in$a
. Dann sind wir in einerfor
Schleife. Jede Iteration, sind gehen wir$a
-f
wie ormattedyyyy+MM+dd
(durch das heißt, das aktuelle Datum , wir sind getrennt auf+
Zeichen) hinzugefügt zusammen mit|iex
(ähnlicheval
), String-Multiplikation , dass mit1
s zur Bildung einer unären Zahl und unter Verwendung eines Prime-Überprüfung regex um festzustellen, ob das aktuelle Datum prim ist oder nicht. Wenn es keine Primzahl ist.AddDays(-1)
, gehen wir einen Tag zurück und setzen die Schleife fort. Wenn es eine Primzahl ist, brechen wir aus der Schleife aus und platzieren es$a
mit impliziter Ausgabe auf der Pipeline.Die resultierende Ausgabe ist kulturabhängig. Bei TIO, das verwendet wird
en-us
, ist die Ausgabe im Langzeitformat, wie es aussiehtSaturday, July 1, 1319 12:00:00 AM
.quelle
0001-01-01
dessen Summe 3 ist). Ich habe mir diese Änderungen hier angesehen .Bash ,
114108 BytesProbieren Sie es online!
Mein erstes Schlaggolf. Ehrlich gesagt, mein erstes richtiges Bash-Programm überhaupt ... von hier aus wurde ein Primalitätstest durchgeführt .
Dies kann manchmal fehlschlagen, wenn sich die Zeitzone ändert, TIO jedoch UTC verwendet. Daher sollte dies funktionieren.
quelle
@$
Arbeitscode von 110 Byte .C (gcc) 167 Bytes
Probieren Sie es online!
Heruntergewirtschaftet
Die Anti-Prime-Check-Funktion. Da das früheste gültige Jahr, mit dem wir uns befassen müssen, 0001-01-01 ist, ist die niedrigste Zahl, um die wir uns jemals Sorgen machen müssen, 3, sodass die Sonderfallprüfungen für n == 2 oder n <2 gestrippt werden. r wird auf einen Wahrheitswert gesetzt, wenn n keine Primzahl ist. r wird global gehalten, da es, wenn es nicht zurückgegeben werden muss, zwei Bytes spart (
i=n;
um zurückzugeben, vs,r
, um das globale zu überprüfen). i wird vom Funktionsaufrufer auf 1 gesetzt, um weitere 2 Bytes zu speichern.Wir nehmen das Datum als drei separate Ganzzahlen und starten die Hauptschleife, die so lange dauert, bis y + m + d die Primzahl ist. Dann kommen wir zum Fleisch der Funktion:
Es mag zweifelhaft erscheinen, m und y sowohl in der Schaltjahrprüfung als auch als Index des Strings zu verwenden, wenn die Auswertungsreihenfolge nicht angegeben ist. Zum Glück überprüfen wir nur das Schaltjahr, wenn m == 2, was nicht gleichzeitig mit der Änderung von m und y geschehen kann, da dies nur von Januar bis Dezember geschieht, so dass die Schaltjahrüberprüfung niemals von der Störung betroffen ist Reihenfolge der Bewertung.
Schließlich wird das Ergebnis an STDOUT ausgegeben:
quelle
C # -
281239232 Charungolfed:
Der Code wurde weniger effizient, aber kleiner. Die Prime-Schleife steigt jetzt auf die ganze Zahl und nicht auf die Quadratwurzel. Es werden auch alle geraden Zahlen verarbeitet.
quelle
public
. Da es nicht unzulässig zu sein scheint, das Datum als aufrufenden Parameter einzugeben, könnten Sie auch habenMain(string[]a)
und dannDateTime.Parse(a[0])
MATL , 14 Bytes
Probieren Sie es online!
Abwechselnd:
15 Bytes
Probieren Sie es online!
quelle