Herausforderung
Schreiben Sie ein Programm, das vom 30. April 1789 bis zum 21. August 2019 als Eingabe dient und als Ausgabe zurückkehrt, wer an diesem Tag Präsident der USA war.
Anmerkungen
Die Liste der US-Präsidenten , das Format ihrer Namen und den Zeitraum ihrer Präsidentschaft finden Sie unten:
April 30, 1789 - March 4, 1797 George Washington
March 4, 1797 - March 4, 1801 John Adams
March 4, 1801 - March 4, 1809 Thomas Jefferson
March 4, 1809 - March 4, 1817 James Madison
March 4, 1817 - March 4, 1825 James Monroe
March 4, 1825 - March 4, 1829 John Quincy Adams
March 4, 1829 - March 4, 1837 Andrew Jackson
March 4, 1837 - March 4, 1841 Martin Van Buren
March 4, 1841 - April 4, 1841 William Henry Harrison
April 4, 1841 - March 4, 1845 John Tyler
March 4, 1845 - March 4, 1849 James K. Polk
March 4, 1849 - July 9, 1850 Zachary Taylor
July 9, 1850 - March 4, 1853 Millard Fillmore
March 4, 1853 - March 4, 1857 Franklin Pierce
March 4, 1857 - March 4, 1861 James Buchanan
March 4, 1861 - April 15, 1865 Abraham Lincoln
April 15, 1865 - March 4, 1869 Andrew Johnson
March 4, 1869 - March 4, 1877 Ulysses S. Grant
March 4, 1877 - March 4, 1881 Rutherford B. Hayes
March 4, 1881 - September 19, 1881 James A. Garfield
September 19, 1881 - March 4, 1885 Chester A. Arthur
March 4, 1885 - March 4, 1889 Grover Cleveland
March 4, 1889 - March 4, 1893 Benjamin Harrison
March 4, 1893 - March 4, 1897 Grover Cleveland
March 4, 1897 - September 14, 1901 William McKinley
September 14, 1901 - March 4, 1909 Theodore Roosevelt
March 4, 1909 - March 4, 1913 William Howard Taft
March 4, 1913 - March 4, 1921 Woodrow Wilson
March 4, 1921 - August 2, 1923 Warren G. Harding
August 2, 1923 - March 4, 1929 Calvin Coolidge
March 4, 1929 - March 4, 1933 Herbert Hoover
March 4, 1933 - April 12, 1945 Franklin D. Roosevelt
April 12, 1945 - January 20, 1953 Harry S. Truman
January 20, 1953 - January 20, 1961 Dwight D. Eisenhower
January 20, 1961 - November 22, 1963 John F. Kennedy
November 22, 1963 - January 20, 1969 Lyndon B. Johnson
January 20, 1969 - August 9, 1974 Richard Nixon
August 9, 1974 - January 20, 1977 Gerald Ford
January 20, 1977 - January 20, 1981 Jimmy Carter
January 20, 1981 - January 20, 1989 Ronald Reagan
January 20, 1989 - January 20, 1993 George H. W. Bush
January 20, 1993 - January 20, 2001 Bill Clinton
January 20, 2001 - January 20, 2009 George W. Bush
January 20, 2009 - January 20, 2017 Barack Obama
January 20, 2017 - Incumbent Donald Trump
Eine Präsidentschaft ist als erster Tag inklusive und letzter Tag ausgeschlossen. Zum Beispiel bedeutet "4. März 1861 - 15. April 1865; Abraham Lincoln", dass Lincoln vom 4. März 1861 bis 14. April 1865 Präsident war .
Dies ist Code-Golf, das kürzeste Programm in jeder Sprache gewinnt.
Beispiel
Input: "7. Februar 1865" Output: "Abraham Lincoln"
WolframAlpha["president on "<>#]&
Ich bin mir sicher, dass Mathematica irgendwo ein eingebautes Programm hat, aber bis ich finde, was es heißt, bleibe ich bei W | A.WolframAlpha["US president on "<>#]&
für mich die Ausgabe nicht korrekt istAntworten:
PHP , 936 Bytes
Probieren Sie es online!
Tests: Online ausprobieren!
Der Code für die Tests ist die gleiche Logik , aber ein wenig anders zu ersetzen das
die(...)
mitreturn...
so kann ich eine Schleife über Tests.Ich habe eine Zeichenfolge mit dem Startdatum der Präsidentschaft minus 1 Tag im Format
YYYYMMDD
und Namen des Präsidenten erstellt, getrennt durch-
. Beispiel:17890429-George Washington-17970303-John Adams-18010303-Thomas Jefferson-...
Diese Zeichenkette wird mit gzdeflate komprimiert und auch die komprimierte Ausgabe wird in base-64 konvertiert, so dass alle Zeichen druckbares ASCII sind und ich sie hier posten oder in TIO verwenden kann .
Im Skript wird die Zeichenfolge durch geteilt
-
und durchgeschleift. Für jede Schleifeniteration:$d
wird auf den aktuellen Iterationswert gesetzt (dies ist das Startdatum des Präsidenten - 1 Tag) und die Schleifenvariable ($i
) wird um eins erhöht.$d
,$m
wird es auf den nächsten Iterationswert (für den der Präsidentenname steht$d
) gesetzt und die Schleifenvariable ($i
) wird erneut um eins erhöht. Auf diese Weise kann die Schleife Präsidentennamen abrufen, diese aber in Iterationen überspringen.$d
ist, bedeutet dies, dass die vorherige Iteration der richtige Präsident war$m
und mit derdie
Funktion gedruckt wird. Dadurch wird das gesamte Programm nach dem Drucken des Namens angehalten.Am Ende, wenn die Schleife beendet ist (was bedeutet, dass nein
die
aufgerufen wurde), wird der Name des letzten Präsidenten gedruckt, da wir wissen, dass keiner der vorherigen Präsidenten eine Übereinstimmung hat (also im Grunde alles danachJanuary 19, 2017
), druckt den Namen des letzten Präsidenten, auch wenn dies der Fall istJanuary 1, 3999
.quelle
Bash ,
12291124 Bytes-103 Bytes mit den ausgezeichneten Kommentaren von @ GammaFunction, die einige unproduktive Ersetzungen (Adams) entfernen und den Code überarbeiten, um den Datumsversatz vom vorherigen Datum anstelle des absoluten Datums für jede Präsidentschaft zu verwenden.
Probieren Sie es online!
Viel manuelle Komprimierung :)
quelle
X=($X)
Loopings, dafor z in $X
$ X auf $ IFS aufgeteilt wird. Verwenden Sie[ -lt ]
und verwenden Sie$T
anstelle von${T[0]}
. Die letzten paar Zeilen sollten insgesamt 1191 Bytes sein[ ${T#${M[++i]}*} ]
. Jetzt können wir den Dezember komplett auslassen). Ich habe auch die Anführungszeichen:
für einige der Namen eingefügt (dies zu tun:John
bedeutet, dass alle Begrenzer:
anstelle von erstellt werden#
).T-SQL,
1169 981 979977 BytesHeilige Kuh, ich habe die String-Komprimierung in SQL herausgefunden ( verfügbar in SQL 2016 und höher ):
Nicht speichern ganz so viel wie ich es gehofft , vielleicht, wahrscheinlich aufgrund der Menge an Code dauert es / deconvert zu konvertieren.
Hier ist die Originalversion, die dem Code entspricht, der ausgeführt wird, nachdem die codierte Zeichenfolge dekomprimiert wurde (1169 Byte):
Zeilenumbrüche dienen nur der Lesbarkeit.
INT
YYYYMMDD
Ein paar Tricks, mit denen ich Bytes gespeichert habe:
ORDER BY
dem Code keine hinzufügen musste<
anstelle von verwenden konnte<=
VALUES()
, obwohl ich den String dann mitSUBSTRING
und trennen mussLEFT
.SUBSTRING()
auf gespeichertSTUFF()
Verwenden von Base64-codierten komprimierten Zeichenfolgen in SQL
(Zum SQL Tips-Thread hinzugefügt )
Daher hat Microsoft in SQL 2016 eine
COMPRESS
und eineDECOMPRESS
Funktion hinzugefügt , die das GZIP behandelt. Das Problem ist, dass es ein zurückgibtVARBINARY
, das zwar in Bytes kürzer ist (wenn es in einem SQL-VARBINARY
Feld gespeichert ist), jedoch länger ist, wenn es in Zeichen (Rohhex) angezeigt wird, was es für das Golfen ungeeignet macht.Die Umstellung auf Base64 ist eindeutig die Antwort, aber eine kurze, einfache Implementierung zu finden, war eine Herausforderung. Ich habe meine Version dieser alten Antwort auf SO basiert , was uns das meiste von dem gibt, was wir brauchen, obwohl es die neuen GZIP-Funktionen nicht verwendet. Ich musste nur die neuen Funktionen an der richtigen Stelle einfügen und ein bisschen Golf spielen.
So verwenden Sie diese Methode in Ihrem eigenen Code:
Das sind
75 bis73 zusätzliche Byte Code, um eine codierte Zeichenfolge zu dekomprimieren. Verwenden Sie diese also eindeutig nur für sehr lange Zeichenfolgen.BEARBEITEN : 2 Bytes im Dekomprimierungscode mit
CAST
statt mit gespeichertCONVERT
.quelle
Excel,
124312061180 Bytes-37 Bytes durch Subtrahieren von allen Daten
-26 Bytes durch Fummeln mit den Subtraktionswerten
Die Eingabe erfolgt in der Zelle
A1
mit dem Format,YYYYMMDD
da Excel Datumsangaben vor 1900 nicht mag.Ich kenne keine Komprimierungsmethode für die Daten oder Namen, die nicht mehr Bytes hinzufügen würden. Die Methode "[Wert] von allen Datumsangaben subtrahieren" kann auf jede beliebige Lösung angewendet werden.
In Google Sheets habe ich nach dem gleichen Prinzip eine Lösung mit 1102 Byte gefunden. Excel hat diese
Split
Funktion nicht und ist daher nicht übersetzbar.quelle
19000101
?MATCH()
hat ein optionales 3. Argument match_type , das festlegt, ob die exakte Übereinstimmung verwendet werden soll. Wenn Sie dieses Argument ausschließen, wird die Standardeinstellung verwendet, bei der es sich um eine Übereinstimmung mit "kleiner oder gleich" handelt, sodass dieser Code korrekt ist.05AB1E ,
587584568 BytesDie Eingabe ist ein verkettetes Datum im Format
yyyyMMdd
(dh20190821
für den 21. August 2019).-16 Bytes dank @Grimy .
Probieren Sie es online aus oder überprüfen Sie ein paar weitere Testfälle .
Erläuterung:
Wir beginnen mit der Erstellung einer Liste der Präsidenten in chronologischer Reihenfolge:
Dann erstellen wir eine Liste aller Daten als Ganzzahlen im Format
yyyyMMdd
(Reihenfolge ist für diese Liste irrelevant):Dann verwenden wir die Eingabe, um den Namen des Ausgabepräsidenten basierend auf den Daten in der Liste zu bestimmen:
Sehen Sie sich meinen Tipp 05AB1E an (Abschnitte So komprimieren Sie Zeichenfolgen, die nicht Teil des Wörterbuchs sind , So komprimieren Sie große Ganzzahlen und So komprimieren Sie Ganzzahllisten ), um zu verstehen, wie alle komprimierten Zeichenfolgen, Ganzzahlen und Listen funktionieren.
quelle
Jelly ,
431 428 427426 BytesEin vollständiges Programm, das eine Zeichenfolge akzeptiert,
YYYYMMDD
die den Namen des Präsidenten ausgibt.Probieren Sie es online! Oder sehen (Kevin Cruijssen der) Testsuite .
Wie?
quelle
Jelly , 454 Bytes
Probieren Sie es online!
Ein monadischer Link, der das Datum im Format JJJJMMTT als Argument verwendet und eine Zeichenfolge mit der Antwort zurückgibt.
Testfälle (aus der 05AB1E-Antwort von @ KevinCruijssen entlehnt ).
quelle
JavaScript (Node.js) ,
855 851803 ByteProbieren Sie es online!
Wie?
Die komprimierte Zeichenfolge enthält eine Liste mit 89 Werten.
Die ersten 44 Werte sind die Länge der Präsidentenmandate, ausgedrückt in Tagen und in Basis 32 (der Basis, die am besten komprimiert wird).
Die nächsten 45 Werte sind die Präsidenten in Kleinbuchstaben. Anschließend wird die Titel- Schreibweise angewendet (Trick aus der Antwort von @ KevinCruijssen ).
quelle
SOGL , 475 Bytes
Probieren Sie es hier aus!
Die Datumslogik könnte wahrscheinlich etwas verbessert werden.
quelle
PHP , 888 Bytes
DEMO VERSUCHEN
quelle
05AB1E ,
464444442418 Bytes-15 oder so Bytes, indem Ideen aus Kevin Cruijssens Antwort gestohlen werden
444 ist immer noch 444):
Probieren Sie es online!
Teil 1: die Namen
In 05AB1E gibt es zwei Arten der String-Komprimierung:
[a-z ]
(Kleinbuchstaben und Leerzeichen) enthalten.ÿ
, um einen Wert aus dem Stapel zu entfernen und in die Zeichenfolge einzubetten.Wir werden eine optimale Mischung aus beiden verwenden. Da das Umschalten von einer Codierung zur anderen mit einem gewissen Aufwand verbunden ist, ist dies komplexer als die Auswahl der kürzesten Codierung für jeden einzelnen Namen. Zum Beispiel:
ing
inHarding Calvin
nimmt ~ 1,8 Bytes in der Basis-27 vs 3 Bytes in einem Wörterbuch String. AberHard
undCalvin
sind beide im Wörterbuch, so dass wir am Endeing
unkomprimiert in einer Wörterbuchzeichenfolge belassen.Herb
InCoolidge Herbert Hoover
benötigt ~ 3 Bytes in Base-27 gegenüber nur 2 Bytes in einer Dictionary-Zeichenfolge (daherb
im Dictionary). Aber wederCoolidge
nochHoover
sind im Wörterbuch, so dass wir am EndeHerb
als Base-27 codieren .Um die Einschränkung zu umgehen, die Base-27-Strings nur enthalten dürfen
[a-z ]
, weisen wir einigen Buchstaben spezielle Bedeutungen zu. Dazwischen verbrauchen die 44 Präsidenten alle 26 Buchstaben, aber wir können immer noch Streiche spielen:j
s sind im Wörterbuch Wörter (James
,Benjamin
, ...), soj
ist für Basis-27 - Strings.q
ist inQuincy
, Kleinbuchstabenq
sind also freiz
ist inZachary
, Kleinbuchstabenz
sind also freix
ist inNixon
, also ist GroßbuchstabenX
frei (davon machen wir eigentlich keinen Gebrauch)Schauen wir uns den Code an.
Wir haben jetzt eine Liste der 45 vollständigen Namen in chronologischer Reihenfolge, also sind wir mit diesem Teil fertig.
Teil 2: die Daten
Um den Vergleich von Daten zu vereinfachen, konvertieren wir sie in ganze Zahlen. Dies geschieht mit einer Umrechnung von base-32, die 1024 * year + 32 * month + day ergibt (und es ist egal, dass die Jahres- "Ziffer" größer als 32 ist).
Wir beginnen mit einer Liste der Anzahl aufeinanderfolgender Wiederwahlen (Wahlen, die den Präsidenten nicht ändern), in umgekehrter chronologischer Reihenfolge:
Diese ersten drei Einsen entsprechen der einmaligen Wiederwahl von Obama, Bush und Clinton. Die einzige 2 entspricht McKinley und Theodore Roosevelt, die beide einmal wiedergewählt wurden (McKinley starb im Amt und Theodore Roosevelt war sein Vizepräsident, sodass zwischen ihren Wiederwahlen keine weiteren Wahlen stattfanden). Es sollte eine 4 für Franklin D. Roosevelt + Truman geben, aber dies ist auch der Punkt, an dem der Tag der Amtseinführung vom 4. März auf den 20. Januar verlegt wurde, sodass wir diesen Sonderfall später behandeln.
Denken Sie daran, dass 1024 ein Jahr bedeutet, also 4096 ein vollständiges Mandat. Dies ist nun eine Liste der Zeitdeltas zwischen neu gewählten Präsidenten (immer noch in umgekehrter chronologischer Reihenfolge, weshalb die Zahlen negativ sein müssen).
Kümmern wir uns jetzt um die 9 Präsidenten, die nicht alle Mandate erfüllt haben (4 starben aus natürlichen Gründen, 4 wurden ermordet, Nixon trat zurück):
45088 ist das Zeitdelta vom 4. März 1797 (erste Einführung am 4. März) bis zum 4. April 1841 (erster Tod im Amt). Die folgenden Zahlen sind Zeitdeltas zwischen den 9 Todesfällen / Rücktritten. Schließlich ist 43819 das Zeitdelta vom 9. August 1974 (Nixons Rücktritt) bis zum 20. Januar 2017 (letzte Einführung am 20. Januar).
Wir haben jetzt eine Liste aller Daten, an denen der Präsident gewechselt hat. Die Reihenfolge ist ein bisschen irre: Sie beginnt 1933, folgt dann am 4. März Einführungen in der Zeit zurück, dann Tod / Rücktritt in der Zeit vorwärts, geht dann entlang der Einführungen am 20. Januar zurück. Die Reihenfolge spielt jedoch eigentlich keine Rolle.
Und wir sind fertig.
quelle
Kohle , 550 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Nimmt Eingaben im ISO-Format vor. Erläuterung:
quelle
Stax ,
550509502 BytesFühren Sie es aus und debuggen Sie es mit Kevin Cruijssens Tests
Dieses Programm wird ordnungsgemäß ausgeführt. Wenn Sie jedoch das Tool "Literale dekomprimieren" verwenden, wird der Quellcode beschädigt. Es endet damit, dass zwei ganzzahlige Literale direkt nebeneinander stehen, was ein größeres Literal ergibt. Das entspricht natürlich nicht dem ursprünglichen Programm.
quelle