Prime Mittwochs
Ihre Aufgabe ist es, die Anzahl der Mittwoche zu zählen, die auf einen Haupttag des Monats in einem bestimmten Jahr fallen. Zum Beispiel 7-13-16
ist ein Prime Mittwoch. Verwenden Sie aus Gründen der Konsistenz für alle Daten den gregorianischen Kalender .
Eingang
Die Eingabe für Ihr Programm / Ihre Funktion erfolgt in einem Jahr (z. B. 2016
) und ist flexibel. Das Jahr wird eine ganze Zahl zwischen 1912 und 2233 einschließlich sein.
Ausgabe
Die Ausgabe ist auch flexibel und sollte die Anzahl der Primemittwochs (z 18
. B. ) sein.
Wertung
Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes!
Testfälle
Eingabe -> Ausgabe
--------------------
1912 -> 19
1914 -> 16
1984 -> 17
1996 -> 19
2063 -> 19
2150 -> 16
2199 - > 18
2233 -> 18
Python 2,
95936867 BytesVielen Dank an @Josay für das Golfen ab 1 Byte!
Teste es auf Ideone .
quelle
0x10ea2c8dbb06c5619
anstelle von speichern19501370182350951961
.big_constant//5**long_expression
aber wie um alles in der Welt sind Sie mit dieser Konstante und diesem Ausdruck gekommen? Es ist verrückt: DBrain-Flak ,
6588,2310,2308, 2290 BytesZuerst habe ich nicht annähernd 100% dieses Programms geschrieben, was wahrscheinlich an der enormen Größe des Programms zu erkennen ist. Der größte Teil dieses Codes wurde von meinem eigenen Brain-Flak-Golfalgorithmus geschrieben . Zusammen mit einem zusätzlichen Python-Skript habe ich geschrieben, um es in die richtige Richtung zu lenken.
Probieren Sie es online!
Während dieses Programm für Codegolf ziemlich lang ist, ist es für Brain-Flak wirklich ziemlich kurz. Derzeit liegt der Weltrekord für die Ganzzahldivision bei über 1000 Bytes.
Erläuterung
Der Algorithmus ist recht einfach. Da nur eine begrenzte Anzahl von Jahren verfügbar ist (321), werden die Antworten einfach in umgekehrter Reihenfolge unter die Eingabe verschoben und mithilfe eines Nachschlage-Algorithmus die richtige Antwort gefunden. Während das Hardcodieren aller 321 Möglichkeiten bei einer so komplexen Aufgabe und einer so esoterischen Sprache wie Brain-Flak als ineffizient erscheint, ist es möglicherweise die beste Lösung. (Ich plane es in der kommenden Woche herauszufinden).
Da die meisten der 321 Zahlen im Durchschnitt etwa 18 sind und sich von Jahr zu Jahr nur geringfügig unterscheiden, anstatt alle Zahlen einzeln zu drücken, drücke ich das erste Jahr (2233) normal und dupliziere und ändere dann den Wert für jedes Jahr ein wenig nach. Auf diese Weise zahle ich nicht für das Drücken von ~ 18 für alle 321 Jahre, sondern nur für das Drücken von ~ 2 für jedes Jahr.
Sobald alle Antworten gepusht wurden, subtrahiert es 1912 von der Eingabe.
({}[(((((((((()()()()())){}{}){}){}){}){}[()]){}){}){}])
(Dies kann suboptimal sein. Ich habe das Optimierungsprogramm neu geschrieben, um bestimmte Werte zu überspringen, von denen ich glaube, dass sie nicht optimal sind, da die Hardcodierung von Zahlen ein überexponentieller Prozess ist und die Ausführung möglicherweise abgeschlossen ist ein paar Tage gedauert).Es subtrahiert dann eins vom ersten Element und fügt das zweite Element ein, bis das Ergebnis Null erreicht
{({}[()]<{}>)}
.Es wird die Null
{}
und alle Elemente unter dem obersten Element eingefügt({}<{{}}>)
.quelle
n
undm
welche längen habenk
undl
ich nehme ann+m
hätte längek+l
? Was istn*m
?n*m
wärek+4m-4
oderl+4n-4
. Dies liegt daran, dass die Multiplikation fest codiert ist. Wir schieben erstmaln
m-1
. Dazu benötigen wir Symbole, um die Schübek
auszudrücken,n
und2m-2
Symbole, um die Schübe auszudrücken (jeder Schübe besteht aus 2 Symbolen). Dann knallen wirm-1
mal und2m-2
kosten uns zusätzlich (Knallen kosten auch 2 Symbole). Dies summiert sich aufk+4m-4
. wir können auch multiplizierenm*n
(kommutative Eigenschaft), um zu bekommenl+4n-4
. Das Ergebnis ist das kürzere der beiden.+1
kostet es 2,*2
kostet 4,*3
kostet 8,*4
kostet 12, was teurer ist als*2*2
, also nicht wert (von Zahlen unter 1000 habe ich nur 10 gefunden, die nicht benutzt wurden*2
: 1, 2, 3 4, 5, 9, 15, 27, 45, 135). Für 1912 war das Beste, was ich tun konnte,((((((1+1+1)*2+1)*2*2+1)*2+1)*2+1)*2+1)*2*2*2
eine Länge von 52.Bash + gemeinsame Dienstprogramme, 39
Nimmt das Eingabejahr als Befehlszeilenparameter. Gibt in der Regel Nachrichten wie diese an STDERR aus. Ich halte dies für zulässig gemäß der folgenden Meta-Antwort :
Wenn Sie die STDERR-Ausgabe explizit unterdrücken möchten, können Sie dies stattdessen für eine Punktzahl von 43 tun :
quelle
gd_GB.utf8
, wenn alle Tagesnamen mit abgekürzt werdenDi
.Oktave, 86 Bytes
Dies ist keineswegs schnell. Aber das ist nicht wirklich das Ziel eines Codegolfs, oder?
Octave kann Daten anhand der "Datumsnummer" nachverfolgen - Anzahl der verstrichenen Tage, an denen der 1. Januar 0 für Tag 1 steht. Nach dieser Messung ist der 3. Januar 1912 (der erste Mittwoch in unserem Set) Tag 698.346. Beginnen Sie dort und durchlaufen Sie jeden siebten Tag (jeden Mittwoch) bis Ende 2233 und addieren Sie 1, wenn das Jahr das Zieljahr und der Monatstag das höchste ist.
quelle
Python 2.7,
166,165, 150 BytesHier besteht sicherlich Verbesserungsbedarf. Ich bin ein Neuling im Golfen mit Python. Dies nutzt das
datetime
Modul. Es durchläuft alle Tage im Jahr und addiert einen auf einen Akku, wenn es das Kriterium erfüllt. Anschließend wird das Ergebnis gedruckt. Der Großteil des Schwergutaufwands befindet sich im Modul, sodass der Code ziemlich schmal sein kann.Ein Byte dank Morgan Thrapp und 15 Byte dank Pietu1998 .
quelle
n%x==0
zun%x<1
.-1
ist nicht erforderlich, darange
der Endindex exklusiv ist. Zusätzlich können Sie diefilter
in einen Generator umwandeln .[0for x in range(2,n)if n%x<1]
any(...)
oderall(...)
anstelle von verwendennot filter(...)
.all
, können Sie eine ganze Menge sparen.c+=n>1<2==d.weekday()>0<all(n%x for x in range(2,n))
J, 44 Bytes
Ich habe gerade festgestellt, dass J über integrierte Funktionen zur Datumsmanipulation verfügt.
Verwendung
Zusätzliche Befehle werden zum Formatieren mehrerer Ein- / Ausgaben verwendet.
Erläuterung
quelle
PowerShell v3 +,
99 bis95 ByteBrute-Force-Ansatz -
Nimmt Eingaben auf , durchläuft die
$y
Schleife von1
bis12
, speichert den Monat vorübergehend in$m
und durchläuft dann jede Primzahl von2
bis31
. Für jeden von diesen konstruieren wir einenGet-Date
von diesem bestimmten Tag und wählen dann nur die mitDayOfWeek
-eq
ual bis3
(dh Mittwoch) aus. Verkapselt das alles in einer Parens, um ein Array zu formulieren, und übernimmt das.Count
davon.Alternativ mathematischer Ansatz -
PowerShell v3 +, 105 Byte
Es wird nur ein Haar länger sein als der Brute-Force-Ansatz, aber ich schließe es hier ein, da es für andere von Vorteil sein kann.
Nimmt wieder die Eingabe
$y
als das Jahr. Dieses Mal führen wir ausschließlich mathematische Operationen basierend auf dem ersten Tag des Jahres durch. Wir berechnen zuerst den Wochentag und speichern ihn$a
für eine spätere Verwendung. Das indiziert in das erste Array, was uns die Nummer gibt, die normalerweise korrekt ist. Wir müssen dem einen zweiten Index hinzufügen, der darauf basiert, ob es sich um ein potenzielles Schaltjahr handelt, ob es sich um einen Sonntag, einen Dienstag, einen Mittwoch oder einen Donnerstag handelt, und der darauf basiert, wie das Jahr lautet.Dies basiert auf der folgenden Beobachtung. Die erste Spalte ist der Wochentag, an dem der 1. Januar ist, die zweite Spalte ist die übliche Ausgabe. Wenn das Jahr nicht eine der mittleren Zahlen ist, ist es stattdessen die Zahl in Parens. Die letzte Spalte beschreibt, wie die% 5-Indizierung funktioniert.
Hinweis: Bei beiden wird davon ausgegangen, dass
en-us
es sich um die aktuelle PowerShell-Einstellung für Kultur- / Datumsinformationen handelt. Die Datumsformatierung undDayOfWeek
-nummer müssen möglicherweise für andere Kulturvarianten entsprechend angepasst werden.quelle
Ruby, 83 + 15 (
-rdate -rprime
Flags) = 98 BytesProbieren Sie es online! (Importierte Module sind inline, da idk, wenn ich Flags in repl.it verwenden kann)
quelle
JavaScript ES6,
187182181179 Bytes179 In einer for-Schleife gegen die while-Schleife getauscht
181 das ternäre Verdichtet
182 Kombinieren Sie die beiden Schleifen
187
quelle
Batch, 248 Bytes
Erklärung:
d
ist der Wochentag mit0
für Montag, der günstigerweise der 1. Januar 1912 ist.l
ist. eine Flagge für die Frage, ob das Jahr ein Schaltjahr ist,1
für 1912. Wir durchlaufen dann von 1913 bis zum Eingabejahr und aktualisieren den Tag von Woche und Neuberechnung der Schaltjahrflagge als wir gehen. Schließlich verwenden wir die Schaltjahr-Flagge und den Wochentagn
, um die Anzahl der Haupt-Mittwoche zu bestimmen , was effektiv eine große Schaltanweisung ist . Die Einstellungn
auf 20 und die Dekrementierung mit dem Abfall ist zwar billiger als die Verwendung der Ablaufsteuerungslogik, aber das Fazit ist, dass, wenn der 1. Januar eines Nichtsprungjahres Donnerstag oder Sonntag ist, es für die anderen Fälle 16 Hauptmittwoche usw. gibt .quelle
JavaScript ES6
206203199197195183182179Nicht die kürzeste, aber das Beste, was ich im Moment tun kann ... Golfvorschläge willkommen ...
Änderungen:
3>=x?3-x:10-x
nach6-(x+10)%7
, Speichern: 3 Änderungen an den Deklarationspositionen;x=w.getDay();z=D(w,6-(x+10)%7)
zuz=D(w,6-(w.getDay()+10)%7)
, speichernd: 4Z=0
vonfor
Schleife zu Datumsangabe und gedrücktz=D(w,6-(x+10)%7)
in diefor
Schleife , um aufzuräumen, speichern: 2w=new Date(a,Z=0,1)
Erklärung infor
Schleife , mit vorhandenerw
Deklaration verschmelzen , speichern: 2+!!
auf~~
, um zu reduzieren und dennochp(d=1)
von aufNaN
zu konvertieren0
, sodass die Prime Test-Funktion weiterhin funktioniert. Speichern: 1W
,for
Schleife neu definiert - umgekehrt zum 31. Dezember,Date
Objekt als separate Variable ausschreiben,for
Schleife ineval
Aufruf neu geschrieben; Sparen 3.@PandaCoder, ich hol dich ein, Kumpel!
quelle
R,
149147 BytesTeste es auf Ideone .
quelle
Groovy, 126
Groovy hat keine Primzahlvalidierung, musste das auch bauen.
quelle