Diese Herausforderung ist ganz einfach. Sie nehmen eine Eingabe, die ein Jahr von 1801 bis 2400 ist, und geben aus, ob es ein Schaltjahr ist oder nicht.
Ihre Eingabe wird keine Zeilenumbrüche oder Leerzeichen enthalten:
1954
Sie geben auf jede Art und Weise aus, die Ihnen gefällt, und teilen dem Benutzer klar mit, ob es sich um ein Schaltjahr handelt oder nicht (ich akzeptiere y oder n für yes / no).
Eine Liste der Schaltjahre finden Sie hier: http://kalender-365.de/leap-years.php Ich möchte darauf hinweisen, dass Schaltjahre nicht immer vier Jahre sind. 1896 ist ein Schaltjahr, 1900 nicht. Die Jahre, die diesem "Überspringen" folgen, sind:
1900
2100
2200
2300
Testfälle:
1936 -> y
1805 -> n
1900 -> n
2272 -> y
2400 -> y
BEARBEITEN: Dies basiert auf einem gregorianischen Standardkalender: http://www.epochconverter.com/date-and-time/daynumbers-by-year.php
quelle
(divisible by 4)∧((divisible by 100)→(divisible by 400))
.Antworten:
APL,
161412 ZeichenGibt
0
für ein Schaltjahr zurück,1
für ein Nicht-Schaltjahr.Probieren Sie diese Lösung auf tryapl.org aus . Beachten Sie, dass ich die Lösung auf dfn geändert habe,
{≥/⌽×4 25 4⊤⍵}
da tryapl.com dies nicht unterstützt⎕
(Benutzereingaben übernehmen). Beachten Sie, dass⎕
es sich um ein leeres Feld handelt und kein fehlendes Zeichen.Die gleiche Lösung in J:
Erläuterung
Dyadic
⊤
(encode) repräsentiert sein rechtes Argument in der Basis, die durch sein linkes Argument angegeben wird. Ich benutze Basis4 25 4
in dieser Lösung. Dies repräsentiert das Jahr y als PolynomLassen Sie die Sätze α, β und γ darstellen, wenn a, b und c nicht Null sind: Satz γ ist falsch, wenn y durch 4 teilbar ist , β ∧ γ ist falsch, wenn y durch 100 teilbar ist und α ∧ β ∧ γ ist false, wenn y durch 400 teilbar ist.
Eine Wahrheitstabelle (
*
die "egal" darstellt), in der Satz & Dgr; darstellt, wenn y ein Schaltjahr ist, ergibt sich:Die folgende Aussage drückt Δ in α , β und γ aus :
Aufgrund der Struktur dieser Aussage kann man ¬Δ als die Reduktion ausdrücken,
≥/⌽α β γ
bei der ≥ ← implementiert. Dies führt zu der Antwort, die ich gerade erkläre.quelle
Pyth, 11 Bytes
Dieses vollständige Programm liest STDIN aus und gibt True für Schaltjahre und False für andere aus.
Vielen Dank an @Jakube, der Pyth vorgeschlagen und im Grunde meinen CJam-Code portiert hat.
Überprüfen Sie die Testfälle selbst im Pyth Compiler / Executor .
Wie es funktioniert
quelle
CJam, 12 Bytes
Dieses vollständige Programm liest aus STDIN und gibt 1 für Schaltjahre und 0 für andere aus.
Überprüfen Sie die Testfälle selbst im CJam-Interpreter .
Wie es funktioniert
quelle
r2/~~\e|i4%!
,r2/~~\~e|4%!
,r2/:~~\e|4%!
,r2/S*~\e|4%!
Und der 13 - Byter2/:~W%:e|4%!
r2/:i:\e|4%!
(12) undr2/:i(fe|~4%!
(13). Ich habe sogar GolfScript ausprobiert (was nicht erforderlich istr
), esor4
wird jedoch als einzelnes Token interpretiert. Wenn nur die Eingabe eine nachgestellte Zeile hätte ...Javascript (ES6), 21 Zeichen
Die Standardregel ist, dass
y
ein Schaltjahr ist, wenn 4 dividierty
und entweder 100 nicht dividierty
oder 400 dividierty
. In Code,100 und 400 sind nicht erforderlich. Stattdessen reicht es aus, zu überprüfen, ob 16 oder 4 y dividieren, wobei 16 ausgewählt wird, wenn 25 y dividiert, andernfalls 4. Golfen wird das
Eine Javascript-Funktion, die dies implementiert, ist 21 Zeichen lang:
Perl,
2826 ZeichenGleiche Idee, aber in Perl.
Führen Sie mit den
-lp
Optionen. Zum Beispiel,Wenn der Test als Eingabe festgelegt ist, wird dies erzeugt
quelle
y=>...
) ist eine ES6-Funktion.Pip , 13 Bytes
Dieser war interessanter als es auf den ersten Blick erschien. Es dauerte ein bisschen, aber ich konnte endlich die langen Verweise auf
400
mit4
und dieh
Variable (= 100) ersetzen .Ausgaben
1
für Schaltjahr,0
für Nichtschaltjahr. Erläuterung:quelle
Pyth,
191514 BytesViel zu einfach. Probieren Sie es online aus: Vorführ- oder Testgeschirr
edit: Verpasst, dass du Truthy / Falsy-Werte statt drucken kannst
n/y
. -4 Byteedit 2: Verwendete die Quadratwurzelidee von Martin. -1 Byte
Erläuterung
quelle
Regex,
836238Vielen Dank an Toby für die Tipps zum Kombinieren der beiden Hälften des Regex.
Wenn wir uns nur auf den Bereich 1801..2400 konzentrieren und davon ausgehen, dass es sich bei der Eingabe um Ganzzahlen handelt:
Test in Ruby (
^
=\A
und$
=\Z
weil Ruby) für den gewünschten Bereich:(Bonus) für etwas, das nicht nur für 1801..2400 funktionieren sollte, sondern für jedes nicht negative Jahr:
Test in Ruby (
^
=\A
und$
=\Z
weil Ruby) für die ersten 100000 Jahre:quelle
(?!)
, können Sie die beiden Hälften kombinieren:(?!00)([02468][048]|[13579][26])(00)?$
- für 38. Das funktioniert jedoch nicht für einstellige Jahre.JavaScript ( ES6 ) 27
Die Regel:
(y%4==0) && (y%100!=0 || y%400==0)
Golfen:
!(y%100<1&&y%400||y%4)
(hauptsächlich nach dem Gesetz von De Morgans )Eine Funktion, die die Regel implementiert:
Ein Test (in Firefox ausgeführt), um sicherzugehen:
quelle
!(y%(y%25?4:16))
anstelle von verwenden!(y%100<1&&y%400||y%4)
. Für diejenigen, die vom ternären Operator gestört werden, können Sie!(y%(4<<2*!(y%25)))
drei Zeichen verwenden und trotzdem speichern!(y%100<1&&y%400||y%4)
.TI-BASIC,
20 17 1613Da TI-BASIC tokenisiert ist, ist es bei einfachen mathematischen Herausforderungen oft wettbewerbsfähig, aber nicht bei diesem, da es keinen "teilbaren" Befehl gibt.Vielleicht ist es doch so, aber das ist immer noch länger als CJam und Pyth.Dies erfolgt nach der Methode von David Hammond.
Alter Code bei 16 Bytes:
Ungolfed:
fPart(
ist "Bruchteil"; Potenzierung hat Vorrang vor Division. In TI-BASIC sind enge Parens optional.Ich verwende das undokumentierte Verhalten des
sub(
Befehls, das normalerweise zum Abrufen einer Teilzeichenfolge verwendet wird: Wenn das Argument eine Zahl anstelle einer Zeichenfolge ist, dividiert es die Zahl durch 100. Es funktioniert mit einem Taschenrechner der Serie TI-83 oder 84.20 -> 17 durch Neuanordnen des Codes, um das Entfernen von eng beieinander liegenden Elementen zu ermöglichen; 17 -> 16 durch Ersetzen von 400 durch 16; 16 -> 13 nach der Idee von David Hammond.
quelle
Stackylogic, 226 Bytes (nicht konkurrierend)
Ja, das ist richtig. Ich habe ein Programm in Stackylogic (Nicht-TC) erstellt, das von Helka Homba für die hier zu findende Herausforderung erfunden wurde . Dies erfolgt nach der Herausforderung, also ohne Konkurrenz.
Stackylogic hat nur eine Binäreingabe, daher müssen 10 (oder mehr, alle Ziffern werden ignoriert) Bit-Binär verwendet werden (niedrigstwertiges Bit wird zuerst eingegeben). Alle Daten außerhalb des angegebenen Bereichs können fehlschlagen, da lediglich überprüft wird, wie die eingegebene Zahl lautet: Es werden keine unnötigen Daten erfasst
Dies ist nicht nur meine erste Herausforderung mit Stackylogic, sondern überhaupt die erste Herausforderung mit Stackylogic.
Mach dich bereit für dieses Chaos:
Das hat so lange gedauert, weil Stackylogic die verwirrendste Sprache ist, die mir begegnet ist, und extrem unleserlich: Sie müssen wissen, wie der Rest des Programms ausgeführt wurde, bevor Sie den aktuellen Abschnitt lesen können, der gerade bearbeitet wird. Ich musste sogar Leerzeichen für die Lesbarkeit beim Erstellen hinzufügen.
Magere Erklärung
Dies ist eine einfache Erklärung dessen, was es tut.
Stackylogic hat keine mathematischen Funktionen, was dies erschwert. Ich musste das meiste fest codieren, um zu überprüfen, ob es sich um eine bestimmte Nummer handelte.
Erstens führt dieses Programm ein NOR der niedrigstwertigen Bits durch und verwirft sie dabei. Dies bedeutet, dass, wenn es durch 4 teilbar ist, zum Hauptteil des Programms übergegangen wird, andernfalls wird 0 ausgegeben.
Zweitens wird der Zeiger auf das Labyrinth der Stackylogic übertragen. Wenn die nächsten beiden Bits Null sind, wird sofort 1 ausgegeben (da es dann durch 16 teilbar ist und somit trotz aller anderen Bedingungen ein Schaltjahr) In diesem Fall wird geprüft, ob es sich nicht um eine durch 4 teilbare Zahl handelt, sondern um ein Schaltjahr zwischen 1801 und 2400.
Im Detail zu erklären, würde bedeuten, diesen Beitrag um ein Vielfaches länger zu machen als er bereits ist
quelle
IBM System Z-Assembler - 56 Byte.
(96 Byte der Quelle. Vorher
712384202 Byte der Quelle, 168 Byte ausführbar).Kleinere Version noch. Speichert keine Anruferregister mehr, ändert den Literalspeicher und den Adressierungsmodus.
Neue Version. Dies wird mit einem S0C1 ABENDEN, wenn es ein Schaltjahr ist, und eine Schleife, wenn es nicht ist. Hoffentlich erfüllt dies die Anforderung, das Ergebnis anzugeben.
OK, also nicht die kürzeste (obwohl es sein kann, dass wir uns einmal den tatsächlich ausgeführten Code und die Interpretergröße ansehen ...)
Ausgabe:
BEENDEN SIE S0C1 für ein Schaltjahr, S222 (wenn die CPU-Zeit abgelaufen ist), wenn nicht.
1936 Y 1805 N 1900 N 2272 Y 2400 Y(wenn mehrmals ausgeführt)quelle
CJam,
1816 BytesGibt
1
(wahr) für Schaltjahre und0
(falsch) sonst.Führen Sie hier alle Testfälle aus.
Erläuterung
quelle
Mathematica,
4027 Bytes, 17 ZeichenVerwendet 17 Zeichen, aber 27 Bytes. Danke an @alephalpha für den Tipp. Beachten Sie, dass die vertikalen Balken für Teilungen tatsächlich U + 2223 sind. Das
<U+F523>
sollte durch das entsprechende Zeichen ersetzt werden.quelle
∣
darstellenDivisible
:,#∣4&&(!#∣100||#∣400)&
21 Zeichen, 27 UTF-8-Bytes.U+F523
(\[Implies]
) verwenden, um es#∣4&&(#∣100<U+F523>#∣400)&
für 19 Zeichen (aber immer noch 27 Byte) zu erstellen .R 29
Testlauf
quelle
C 81
Ich kann es kürzer machen, aber dieser hält sich ordentlich an 'char'-Typen, ohne das Argument zu analysieren (zB mit
atoi
):Sie muss mit einem Namen von 4 Zeichen Länge aufgerufen werden, da standardmäßig davon ausgegangen wird, dass Argumente unmittelbar auf den Programmnamen folgen, getrennt durch NULs. Außerdem wird davon ausgegangen, dass das einzelne Argument in ASCII codiert ist und kein führendes Leerzeichen enthält.
Erläuterung:
*v+9
ist die Position der Zehnerstelle inv[1]+2
.Wenn die Zeichen 'Zehn' und 'Einheiten' zu 96 addieren, enden wir mit, sichern Sie
00
also zwei Zeichen, sodass die Zeichen 'Zehn' und 'Einheiten' auf die Jahrhundertzahl verweisen.Jetzt xor 'units' mit dem doppelten 'tens', mod 4. Dies funktioniert, weil
10==±2 mod 4
das untere Bit der 'tens' nur Bit 1 der 'units' umschalten kann. Wir verwenden das Ergebnis als Index in unserer Resttabelle und druckeny
nur, wenn das modulare Ergebnis Null ist.quelle
Befunge -98, (41 Bytes)
Einfachheit ist großartig.
quelle
sed, 55
Beachten Sie, dass Nicht-Schaltjahre möglicherweise als
n
oderN
abhängig davon gedruckt werden, ob sie gerade oder ungerade sind. Ich halte dies für eine kreative Interpretation der Regel, die Alternativen zu "Ja" und "Nein" zulässt, ohne dass angegeben wird, dass sie konsistent sein müssen.quelle
Python2 - 37
g=lambda x:(x%4or x%400and x%100<1)<1
Beachten Sie, dass es sich bei if
a
um eine nicht negative Ganzzahla<1
handeltnot bool(a)
. Der letzte<1
wandelt den Ausdruck in den Klammern effektiv in einen Booleschen Wert um und negiert das Ergebnis.Wenn Sie die Funktion
g
auf eine Ganzzahln
zwischen 1801 und 2400 anwenden, wird zurückgegeben,True
wennn
es sich um ein Schaltjahr handelt,False
andernfalls.quelle
KDB (Q), 27 Bytes
Erläuterung
Prüfung
quelle
Julia,
3028 BytesDadurch wird eine unbenannte Funktion erstellt, die ein ganzzahliges Argument akzeptiert und einen booleschen Wert zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=y->...
.Ungolfed:
Beispiel:
quelle
PHP - 45 Bytes
Eigentlich nichts Besonderes, nur das Typ-Jonglieren zu missbrauchen.
quelle
C #, 23 Bytes
Probieren Sie es online!
Vollständige Quelle, einschließlich Testfällen:
quelle
C
37,34,30 BytesWandbox
quelle
T-SQL
3722 BytesDank BradCs Kommentar 15 Bytes gespart.
Die übliche fest codierte Variable mangels a
stdin
.z.B
Dann lautet die Lösung:
quelle
1
oder0
direkt zurückgeben:PRINT ISDATE(@+'0229')
Java 8,
49452220 Bytes-2 Bytes dank @ OlivierGrégoire .
Probieren Sie es online aus.
Einige 22-Byte-Lösungen:
Probieren Sie es online aus.
Probieren Sie es online aus.
Probieren Sie es online aus.
Erläuterung:
quelle
java.time.Year::isLeap
.n->n%(n%25<1?16:4)<1
Haskell, 19 Bytes
Probieren Sie es online!
quelle
Javascript ES6, 32, 29, 26
Jede der folgenden Zeilen funktioniert:
quelle
C 57 Bytes
Übernimmt die Eingabe von stdin mit oder ohne nachfolgende Leerzeichen / Zeilenumbrüche. Funktioniert nur auf kleinen Endian-Rechnern (ja, so wie heutzutage jeder BE betreibt). Ausgänge Y oder N.
Erläuterung
Ungolfed:
Zuerst
scanf
liest das Jahr als eine ganze Zahl in y. Dann wird y mit 4 oder 400 moduliert, je nachdem, ob das Jahr durch 100 teilbar ist. Wenn der Rest Null ist, wird der ASCII-Code für Y y zugewiesen, andernfalls wird der ASCII-Code für N abgerufen. Der Wert von y ist jetzt0x000000??
, wo0x??
ist das zugewiesene Zeichen. Wenn Sie sich auf einem Little-Endian-Computer befinden, wird dies im Speicher als gespeichert?? 00 00 00
. Dies ist eine mit NULL abgeschlossene C-Zeichenfolge, die nur die zugewiesenen Zeichen enthält. Die Adresse von y wird an Puts übergeben und das Zeichen wird gedruckt (mit einer nachgestellten Zeile).quelle
main(y){scanf("%d",&y);y=!(y%(y%100?4:400))+48;puts(&y);}
. Ich kann auf 48 Bytes runter gehen, wenn ich eine leere Zeile für Schaltjahre und ein beliebiges Zeichen (ASCII 1-99) ausgeben kann, aber ich habe das Gefühl, dass es ein bisschen gegen die Regeln verstößt. Was denkst du?PowerShell, 31 Byte
Ich freue mich zu sagen, dass ich dies kürzer als das eingebaute Golf gespielt habe!
Ausgänge für Schaltjahre wahr und ansonsten falsch.
Eingebaut:
Wollte ich die Aussage "Dem Benutzer klar sagen, ob es sich um ein Schaltjahr handelt oder nicht" strecken und etwas anderes tun, könnte ich 3 Bytes einsparen und Folgendes verwenden:
Diese Ausgabe erfolgt
0
für Schaltjahre und 1 oder höher für Nicht-Schaltjahre, was mir nicht gefällt, da ich es vorziehen würde, für Schaltjahre einen normaleren Wahrheitswert zurückzugeben.quelle
LOLCODE,
228202159 BytesUngolfed:
In Python ungolfed, weil LOLCODE verwirrend ist:
quelle
WIN
..