(Inspiriert von Riddler von letzter Woche auf FiveThirtyEight.com. Sandbox-Post .)
Berechnen Sie bei einem Jahr zwischen 2001 und 2099 die Anzahl der Tage in diesem Kalenderjahr und geben Sie sie zurück mm * dd = yy
(wobei yy
das zweistellige Jahr ist).
2018 hat zum Beispiel 5:
- 18. Januar (1 * 18 = 18)
- 9. Februar (2 * 9 = 18)
- 6. März (3 * 6 = 18)
- 3. Juni (6 * 3 = 18)
- 2. September (9 * 2 = 18)
Die Eingabe kann eine 2- oder 4-stellige numerische Jahreszahl sein.
Die Ausgabe sollte eine Ganzzahl sein. Optionales Leerzeichen oder Return ist in Ordnung.
Komplette Ein- / Ausgabeliste:
Input = Output
2001 = 1 2021 = 3 2041 = 0 2061 = 0 2081 = 2
2002 = 2 2022 = 3 2042 = 4 2062 = 0 2082 = 0
2003 = 2 2023 = 1 2043 = 0 2063 = 3 2083 = 0
2004 = 3 2024 = 7 2044 = 3 2064 = 2 2084 = 5
2005 = 2 2025 = 2 2045 = 3 2065 = 1 2085 = 1
2006 = 4 2026 = 2 2046 = 1 2066 = 3 2086 = 0
2007 = 2 2027 = 3 2047 = 0 2067 = 0 2087 = 1
2008 = 4 2028 = 4 2048 = 6 2068 = 1 2088 = 3
2009 = 3 2029 = 1 2049 = 1 2069 = 1 2089 = 0
2010 = 4 2030 = 6 2050 = 3 2070 = 3 2090 = 5
2011 = 2 2031 = 1 2051 = 1 2071 = 0 2091 = 1
2012 = 6 2032 = 3 2052 = 2 2072 = 6 2092 = 1
2013 = 1 2033 = 2 2053 = 0 2073 = 0 2093 = 1
2014 = 3 2034 = 1 2054 = 4 2074 = 0 2094 = 0
2015 = 3 2035 = 2 2055 = 2 2075 = 2 2095 = 1
2016 = 4 2036 = 6 2056 = 4 2076 = 1 2096 = 4
2017 = 1 2037 = 0 2057 = 1 2077 = 2 2097 = 0
2018 = 5 2038 = 1 2058 = 0 2078 = 2 2098 = 1
2019 = 1 2039 = 1 2059 = 0 2079 = 0 2099 = 2
2020 = 5 2040 = 5 2060 = 6 2080 = 4
Dies ist eine Code-Golf- Herausforderung, die niedrigste Byte-Anzahl in jeder Sprache gewinnt.
Vorausberechnung und einfaches Nachschlagen der Antworten sind normalerweise gemäß unseren Regelungslücken ausgeschlossen , aber ich erlaube dies ausdrücklich für diese Herausforderung. Es erlaubt einige interessante alternative Strategien, obwohl es unwahrscheinlich ist, dass eine Nachschlageliste mit 98 bis 99 Einträgen am kürzesten sein wird.
Antworten:
Excel, 48 Bytes
Hurra! Schließlich ist etwas Excel eigentlich gut.
Übernimmt die Eingabe von A1 in Form einer Ganzzahl von 1 bis 99, die das Jahr darstellt, und gibt sie an die Stelle aus, an der Sie diese Formel eingeben. Es handelt sich um eine Array-Formel. Verwenden Sie daher Strg-Umschalt-Eingabe anstelle der Eingabetaste, um sie einzugeben.
Dies macht sich die Tatsache zunutze, dass
COUNT
Fehler ignoriert werden, sodass alle Fehler, die entweder durch den Monat verursacht werden, der das Jahr nicht teilt (was Excel dazu veranlasst, so etwas zu analysieren,2/12.5/25
oder durch das Datum, das nicht gültig ist, so2/29/58
, werden einfach unbemerkt ignoriert.quelle
A1
. Die Eingabe einer vierstelligen Jahreszahl kehrt einfach zurück0
.Python 2 , 44 Bytes
Probieren Sie es online!
Eine anonyme Funktion, die als Methodenobjekt angegeben wird. Produziert alle Produkte von
(month, day)
Paaren(m, d)
so codiert durchk=32*m+d
mit0≤m≤12
,0≤d≤31
, Umwickeln. Eliminiert den 29. bis 31. Februar, indem sie aus dem Bereich ausgeschlossen werden.quelle
Java (JDK 10) , 65 Byte
Probieren Sie es online!
Credits
quelle
29*n
, also brauchen Sie den Scheck nicht(m==2?29:32)
zu29+m%2*3
scheint immer noch alleOK
Ergebnisse zu liefern . Dank an die Ruby-Antwort von @AsoneTuhid .PowerShell , 94 Byte
Probieren Sie es online!
Nimmt die Eingabe als zweistelliges Jahr und erstellt dann eine
for
Schleife von1/1/year
bis12/9/year
(da 12/10 und höher niemals zählen und dies ein Byte spart). Bei jeder Iteration$z
erhöhen wir, wenn die.Month
Zeiten.Day
gleich unserem Eingabejahr sind. Wird außerhalb der Schleife$z
in der Pipeline belassen und die Ausgabe erfolgt implizit.Bearbeiten - das ist kulturabhängig. Der obige Code funktioniert für
en-us
. Das Datumsformat muss möglicherweise für andere Kulturen geändert werden.quelle
Ruby ,
4642 BytesProbieren Sie es online!
quelle
JavaScript (Node.js) ,
484443 ByteProbieren Sie es online!
JavaScript (Node.js) ,
59-58ByteProbieren Sie es online!
quelle
Gelee , 15 Bytes
Probieren Sie es online!
Nehmen Sie eine Zahl im Bereich
[0,100[
als Eingabe.quelle
JavaScript (ES6), 91 Byte
Ich war gespannt, wie sich Hardcoding mit einer iterativen Berechnung vergleichen lässt. Es ist definitiv länger (siehe @ Shaggys Antwort ), aber nicht furchtbar länger.
Edit : Es ist jedoch viel länger als eine direktere Formel (siehe @ l4m2 Antwort ).
Übernimmt die Eingabe als Ganzzahl in [1..99] .
Probieren Sie es online!
Wie?
In ungeraden Jahren ist die Wahrscheinlichkeit, dass MM * TT = JJ ist, signifikant geringer als in geraden Jahren. Genauer gesagt haben ungerade Jahre 0 bis 3 Übereinstimmungen, während gerade Jahre 0 bis 7 Übereinstimmungen haben. Dies ermöglicht es uns, jedes Paar von Jahren mit nur 5 Bits zu codieren, die in Basis 36 bequem als ein einzelnes Zeichen dargestellt werden können.
quelle
Perl 6 , 40 Bytes
Probieren Sie es online!
quelle
Python 2 und 3 ,
5552 BytesProbieren Sie es online!
quelle
Bash + GNU-Dienstprogramme , 57
Beachten Sie, dass der
seq
Befehl immer eine Liste mit 366 Daten erstellt - für Nicht-Schaltjahre wird der 1. Januar des nächsten Jahres einbezogen. Im Datumsbereich 2001..2099 ist MM * DD für keines dieser Jahre der 1. Januar des nächsten Jahres, sodass dieser zusätzliche Tag das Ergebnis nicht beeinflusst.Probieren Sie es online!
quelle
date
dass ich beim Parsen so ein Datum berechnen werde.seq
benötigt nach dem kein Leerzeichen-f
, so dass Sie dort ein Byte speichern können.T-SQL,
123121 BytesGemäß unseren E / A-Regeln erfolgt die Eingabe über die bereits vorhandene Tabelle t mit einem ganzzahligen Feld y , das eine zweistellige Jahreszahl enthält.
Zeilenumbruch dient nur der Lesbarkeit. Vor allem von der Excel-Lösung von Sophia inspiriert .
CONCAT()
, der implizitevarchar
Datentypkonvertierungen vornimmt. Sonst würde ich habe eine Reihe von tunCAST
oderCONVERT
Aussagen.ISDATE()
, die 1 für gültige Daten und 0 für ungültige Daten zurückgibt.y%m=0
) in dieWHERE
Klausel, um 2 Bytes zu sparen, danke @RazvanSocol.Leider ist es nicht viel kürzer als die Lookup-Table-Version (unter Verwendung des Strings aus der osdavison-Version ):
T-SQL-Suche, 129 Byte
BEARBEITEN : Ich lasse mein Original oben, aber wir können ein paar Bytes sparen, indem wir einige neue Funktionen verwenden:
STRING_SPLIT
ist in MS SQL 2016 und höher verfügbar.CONCAT_WS
ist in MS SQL 2017 und höher verfügbar.IIF
durchWHERE
MS-SQL 2017,
121118 ByteMS-SQL 2017, zusätzliche betrügerische Ausgabe: 109 Bytes
Erfordert, dass Sie sich in der
master
Datenbank befinden, die eine Systemtabelle enthält , mit der Siespt_values
(bei Filterung nachTYPE='P'
) Zahlen von 0 bis 2048 zählen können.quelle
m/d/y
hängt die Reihenfolge, in der ich das Datum ( ) zusammenstelle, von den Lokalitätseinstellungen der SQL-Instanz ab. Andere Lokalitäten erfordern möglicherweise eine andere Reihenfolge oder ein anderes Trennzeichen, aber ich glaube nicht, dass sich dies auf die Codelänge auswirkt.SPLIT_STRING
eines CTE anstelle eines CTE werden 120 Byte erreicht. Wenn SieCONCAT_WS
anstelle von verwenden, wird einCONCAT
anderes Zeichen gespeichert und auf 119 Byte gebracht.IIF
durchWHERE
.Julia 0,6 ,
494442 BytesProbieren Sie es online!
-5 Bytes, inspiriert von Asone Tuhids Ruby-Antwort.
-2 Bytes, die count durch sum ersetzen
Erläuterung:
Für jeden Monat
i
Berechnen Sie von 1 bis 12y/i
und prüfen Sie, ob es sich um einen Tag dieses Monats handelt. Monate mit 31 Tagen sind 1, 3, 5, 7, 8, 10, 12 - also ungerade unter 8 und gerade bei und über 8. Also entwederi%2
oderi÷8
(das ist 0 für i <8 und 1 für i> = 8 hier) sollte 1 sein, aber nicht beide - also XOREN wir sie. Wenn das xor-Ergebnis wahr ist, überprüfen wir Datumsangaben,1:28+3
dh1:31
, ansonsten überprüfen wir nur Datumsangaben1:28
.1:28
ist für den Rest der Monate ausreichend (diese Verbesserung ist von Asone Tuhids Ruby-Antwort inspiriert ), weil:Für Februar wäre die einzige Möglichkeit gewesen
2*29 = 58
, aber es2058
ist kein Schaltjahr, also können wir davon ausgehen, dass der Februar immer 28 Tage hat.Die anderen Monate mit 30 Tagen sind Monat 4 und höher - für die
i*29
(undi*30
) über 100 liegen, was ignoriert werden kann.Schließlich zählen wir die Anzahl der
y/i
in diese Liste der Tage gehörenden Tage (indem wir hier den Booleschen Wert verwendensum
) und geben diesen zurück.quelle
JavaScript,
9185828177 BytesÜbernimmt die Eingabe als zweistellige Zeichenfolge (oder als 1- oder 2-stellige Ganzzahl).
Nutzt die Tatsache, dass
new Date
ein Rollover auf den nächsten Monat ausgeführt wird, und setzt dies fort, wenn Sie einen Tageswert übergeben, der die Anzahl der Tage in dem Monat überschreitet, in dem Sie ihn übergeben, sodass bei der ersten Iteration versucht wird, den zu erstellen Datum,yyyy-01-345
das wirdyyyy-12-11
, oderyyyy-12-10
Schaltjahre. Danach brauchen wir keine Daten mehr zu überprüfen, da12*11+
sich eine dreistellige Zahl ergibt.3 Bytes gespart dank Arnauld .
Probier es aus
quelle
Python 2 ,
89846858 BytesProbieren Sie es online!
quelle
Excel, 83 Bytes
Die Eingabe erfolgt in der Zelle
A1
im Formatyyyy
. Dies ist eine Matrixformel und wird mit Ctrl+ Shift+ eingegeben Enter, um die geschweiften Klammern zu erhalten{}
. Es ist ziemlich einfach und ohne Schlauheit.Gibt in einer Array-Formel
DATE(A1,1,0)+ROW(1:366)
ein Array mit 366 Datumswerten an. Auf Nicht-Schaltjahren wird dies den 1. Januar des nächsten Jahres einschließen, aber das ist kein Problem, da1*1=1
und würde nur als falsch positiv gelten, wenn das nächste Jahr2001
aber ist, da der erforderliche Jahresbereich ist2001 - 2099
, wird es nie als eine entstehen Problem.Wenn Sie diesen Teil einfach kurzgeschlossen haben,
~
ist die Formel viel einfacher zu befolgen:Ich habe versucht,
COUNTIF()
anstelle von zu verwenden,SUM(IF())
aber Excel ließ mich nicht einmal als Matrixformel eingeben, geschweige denn, ich erhielt ein Ergebnis. Ich habe eine Google Sheets- Lösung gefundenCountIf()
, die dieselbe Methode verwendet, ansonsten waren es 91 Byte, hauptsächlich, weil sie verwendet wird,ArrayFormula()
anstatt einfach{ }
.quelle
Retina 0,8,2 , 55 Bytes
Probieren Sie es online! Nimmt ein zweistelliges Jahr an; Fügen Sie 1 Byte hinzu, um 4-stellige Jahre zu unterstützen. Erläuterung: Die erste Stufe wird einfach zu Unary konvertiert. Die zweite Phase beginnt damit, dass 1 bis 12 Zeichen vor der Übereinstimmungsposition abgeglichen werden, die den Monat darstellen. Anschließend wird versucht, nach einer ganzen Anzahl von Wiederholungen dieses Monats zu suchen. Der Lookahead enthält jedoch eine Bedingung, die je nach Monat zwischen 27 oder 30 weiteren Wiederholungen auswählt. Die Anzahl der Match-Positionen ist dann das gewünschte Ergebnis.
quelle
R ,
22122 BytesProbieren Sie es online!
Beschlossen, mit einer Nachschlagetabelle Ansatz zu gehen. Das Eingabejahr muss zweistellig sein.
quelle
if
, da die Eingabe wahlweise zweistellig oder vierstellig sein kann (Sie können also nur zweistellige Eingaben akzeptieren). . Aber es sieht aus wie der Code jeden Monat hält 31 Tage enthalten, so zum Beispiel 62 (für 2062) gibt 1 zurück , wo es 0 zurückgeben sollteC (gcc)
656059 BytesPort der Java- Antwort von user202729 . Probieren Sie es hier online aus . Vielen Dank an Jonathan Frech für das Golfen mit 1 Byte.
quelle
a=0,m=13;for(;
~>for(a=0,m=13;
.J , 29 Bytes
Probieren Sie es online!
Wie es funktioniert
Versucht, unter 2 Mal Jelly Lösung zu bekommen :)
Randnotiz
Wenn jemand die 99-stelligen Daten wirklich fest codieren möchte, finden Sie hier einige Informationen:
Teilen Sie die 99-stellige Zahl in zweistellige Teile. Dann ist die erste Ziffer
<4
und die zweite<8
, was bedeutet, dass fünf Bits zwei Zahlen codieren können. Dann können die gesamten Daten in 250 Bits oder 32 Bytes codiert werden.quelle
Python 3 , 158
162215241BytesEntfernt 4 Danke an Stephen für das Golfen der Bedingungen.
53 Danke Stephen für den Hinweis auf den Leerraum entfernt
26 dank des Links von caird entfernt
Ich bin ziemlich neu darin. Ich könnte mir nicht vorstellen, wie ich das machen könnte, ohne die Tage in einem Monat zu beschreiben.
Probieren Sie es online!
quelle
(28if Y%4else 29)
kann auf gekürzt werden[29,28][Y%4>0]
. Auch die lange Liste kann auf gekürzt werden[a,...]+2*[a,b,a,b,a]
.a,b,c
kann zur Parameterliste hinzugefügt werden, um eine Zeile zu speichern.int(str(Y)[2:])
kann auf gekürzt werdenY%100
. Schließlich können Zählervariablen meistens auflen
s Listenverständnis abgekürzt werden, wodurchn
auch ein gemacht werden kannlambda
. Das ergibt 118 .Forth (gforth) ,
6059 BytesProbieren Sie es online!
Diese Version nutzt die Tatsache, dass es nicht mehr als einen passenden Tag pro Monat geben kann und dass das Jahr durch den Monat teilbar sein muss, damit es passt.
Erläuterung
Durchläuft die Monate, prüft, ob das Jahr durch den Monat teilbar ist und ob der Quotient <31 (28 für Februar) ist. Monate nach März können nicht mit Tagen größer als 25 übereinstimmen, daher können wir nur alle Monate (außer Februar) annehmen. haben 31 Tage für den Zweck des Puzzles.
Code-Erklärung
[1] - Forth hat das Konzept der doppelten Länge von Zahlen, die auf dem Stapel als zwei Zahlen einfacher Länge gespeichert werden (in der Form xy, wobei der Wert von double =
y * 2^(l) + x
wobei l die Größe in Bits eines einzelnen in der ist vierte Implementierung, mit der Sie arbeiten).In diesem Fall habe ich Quotient und Rest mit 32 (oder 29) 0 verglichen. Wenn der Rest größer als 0 wäre (Jahr nicht teilbar durch Monat), wäre das erste Double automatisch größer als 32 (oder 29) 0 und das Ergebnis wäre falsch. Wenn der Rest 0 ist, wird eine regelmäßige Überprüfung des Quotienten <= 32 (oder 29) durchgeführt.
Viertens (gviertens) , 61 Bytes
Probieren Sie es online!
Einige Bytes gespart, indem erkannt wurde, dass nur der Februar für die korrekte Anzahl von Tagen im Monat von Bedeutung ist
Erläuterung
Vier (mindestens vier) Vergleiche geben -1 für wahr und 0 für falsch zurück
quelle
Java (JDK 10) ,
797270 BytesProbieren Sie es online!
quelle
d
Ays durchschleife)&&
, ist&
es die gleiche Antwort wie die Java-Antwort von OlivierGrégoire, obwohl er 19 Minuten zuvor geantwortet hat.JavaScript (Node.js) , 108 Byte
quelle
Perl 5 , 68 Bytes
Probieren Sie es online!
quelle
Python 3, 132 Bytes
Das ist wirklich ein ziemlich langes Programm, aber ich dachte, es könnte von Interesse sein.
Alle Werte liegen zwischen 0 und 7, also codiere ich jede Zahl mit 3 Bits in einer langen Binärzeichenfolge. Ich habe versucht, eine rohe Binärzeichenfolge in mein Python-Programm einzufügen, aber ich konnte sie nicht zum Laufen bringen, also habe ich mich für base64 in der Datei entschieden.
Ich habe die folgende Zeichenfolge als Nachschlagetabelle verwendet (Ende 7 wird zum Auffüllen verwendet):
01223242434261334151533172234161321260115040331061312042410060032130113060021220420051013051110140127
Das Programm nimmt diese Zeichenfolge und decodiert sie als Zahl. Anschließend extrahiert es das Ergebnis mithilfe der Bitverschiebung.
66 Bytes + 37 Bytes Datei = 103 Bytes
Dies liest eine aufgerufene Binärdatei
e
und vermeidet die Verwendung von base64.Hier ist ein Hexdump der gelesenen Datei (ohne Auffüllung):
quelle
Haskell ,
6151 BytesProbieren Sie es online!
Inspiriert von xnors Python 2-Antwort und Laikoni.
quelle
f y=sum[1|i<-[1..12],mod y i<1,div y i<29+mod i 2*3]
Probieren Sie es online!Oracle SQL, 115 Byte
Wir können bemerken, dass es nicht wirklich wichtig ist, wie viele Tage im April (und in späteren Monaten), da 100/4 <28. Es ist auch nicht notwendig zu überprüfen, ob das Jahr ein Sprung ist oder nicht. Wir müssen nur spezifizieren, dass es im Februar 28 Tage gibt (nicht 29, da diese Validierung nur für 2058 ausgeführt wird, was kein Sprung ist), andernfalls kann es für jeden Monat nur 31 sein.
Andere Ansätze
Oracle SQL (12c Release 2 und höher), 151 Byte
Oracle SQL (12c Release 2 und höher), 137 Byte
Beide Lösung könnte 8 Byte kürzer gewesen , wenn wir ersetzen
(select level l from dual connect by level<=12)
mitxmltable('1to 12'columns l int path'.')
aber Oracle wirft eine Ausnahme , weil der Bug (getestet auf Versionen 12.2.0.1.0, 18.3.0.0.0).Der einzige Fall in beiden Lösungen, in dem das Jahr eine Rolle spielt, ist 2058. Dies ist kein Schaltjahr. Daher wurde zur Angabe des Schaltjahres das Literal '-1' verwendet.
Oracle SQL, 128 Byte
Oracle SQL, 126 Byte
Aktualisieren
Oracle SQL, 110 Byte
Oracle SQL, 108 Byte
Spark SQL, 137 Byte
Spark 2.3+ SQL, 126 Bytes
(
replace
Funktion wird verfügbar)quelle
PHP , 73 Bytes
Verwenden der Pipe-Eingabe und
php -nR
:Probieren Sie es online!
PHP , 76 Bytes
Verwenden der Befehlszeilen-Arg-Eingabe
php dm.php 18
:Probieren Sie es online!
Iterativer Ansatz. Da das einzige zu betrachtende Schaltjahr 2 * 29 = 58 ist und 2058 kein Schaltjahr ist, muss das Schaltjahr in den Feb-Tagen nicht berücksichtigt werden. Und da Wraparound kein Problem darstellt, wird ab April jeder Tag, der größer als 25 ist, 100 überschreiten. In den restlichen Monaten sind es nur noch 25 Tage.
Die Eingabe erfolgt zweistellig über die Kommandozeile (-10 Byte als Programm, danke an @Titus).
ODER:
PHP , 101 Bytes
Probieren Sie es online!
Immer noch iterativ, aber mit den Zeitstempelfunktionen von PHP. Akzeptiert das Jahr als vierstellige Zahl. Vielen Dank an @Titus für den Vorschlag,
strtotime()
anstelle vonmktime()
.quelle
$m<5?$m-2?31:28:25
zum ersten und$d=strtotime("$y-1")
zum zweiteny
das in Anführungszeichen gesetzt?strtotime()
vonmktime()
-7 Bytes anstelle von und erneut als Programm implementiert. Außerdem habe ich mir die Mehrheit der Einreichungen angesehen, einschließlich der Einreichungen mit den meisten Stimmen, die nur ein Jahr mit zwei oder vier Ziffern akzeptieren. Danke nochmal für die Vorschläge!PHP,
74-70Bytesakzeptiert nur zweistellige Jahreszahlen.
Ich übernahm Gwaughs Überlegungen und spielte sie aus. Meine erste Annäherung war länger als seine (92 Bytes):
%100
Ermöglicht die Verwendung von 4-stelligen Jahreszahlen.Laufen Sie als Pipe mit
-nR
oder probieren Sie sie online aus .quelle