Défi
Ecrivez un programme qui prend en entrée un jour du 30 avril 1789 au 21 août 2019 et renvoie en sortie le président des États-Unis ce jour-là.
Remarques
Pour la liste des présidents américains , le format de leurs noms et la période de leur présidence, voir ci-dessous:
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
Une présidence est prévue comme premier jour inclus et dernier jour exclu. Par exemple, "4 mars 1861 - 15 avril 1865; Abraham Lincoln" signifie que Lincoln a été président du 4 mars 1861 au 14 avril 1865.
C'est le code-golf, le programme le plus court dans chaque langue gagne.
Exemple
Entrée: "7 février 1865" Sortie: "Abraham Lincoln"
WolframAlpha["president on "<>#]&
Je suis sûr que pur Mathematica a sa propre construction quelque part, mais jusqu’à ce que je trouve ce qu’on appelle cela, je reste avec W | A.WolframAlpha["US president on "<>#]&
cause pour moi, la sortie n'est pas correcteRéponses:
PHP , 936 octets
Essayez-le en ligne!
Tests: Essayez-le en ligne!
Le code pour les tests est la même logique mais un peu différent pour remplacer le
die(...)
avecreturn...
afin que je puisse effectuer une boucle sur les tests.J'ai créé une chaîne dont la date de début de présidence est de moins 1 jour
YYYYMMDD
et dont le nom du président est séparé par-
. Exemple:17890429-George Washington-17970303-John Adams-18010303-Thomas Jefferson-...
Cette chaîne est compressée à l'aide de gzdeflate et la sortie compressée est également convertie en base 64 afin que tous les caractères soient imprimables en ASCII. Je peux les publier ici ou les utiliser dans TIO .
Dans le script, la chaîne est divisée par
-
et bouclée. Pour chaque itération de boucle:$d
est défini sur la valeur d'itération actuelle (qui correspond à la date de début du président, -1 jour) et la variable de boucle ($i
) est augmentée de un.$d
, alors$m
est définie sur la valeur d'itération suivante (qui correspond au nom du président$d
) et la variable de boucle ($i
) est augmentée de nouveau de un. Cela permet à la boucle d’obtenir les noms de président mais d’être sautée par dessus lors des itérations.$d
, cela signifie que l'itération précédente était le président correct; elle$m
est donc imprimée à l'aide de ladie
fonction. Le programme entier sera arrêté après l'impression du nom.À la fin, si la boucle est terminée (ce qui signifie que non a
die
été appelé), le nom du dernier président est imprimé, car nous savons qu'aucun des présidents précédents n'a obtenu de correspondance (donc rien aprèsJanuary 19, 2017
) affiche le nom du dernier président, même s'il estJanuary 1, 3999
.la source
Bash ,
12291124 octets-103 octets avec les excellents commentaires de @ GammaFunction, supprimant quelques substitutions non productives (Adams) et refacturant le code pour utiliser la date décalée par rapport à la date précédente plutôt que la date absolue pour chaque présidence.
Essayez-le en ligne!
Beaucoup de compression manuelle :)
la source
X=($X)
boucle, carfor z in $X
elle fractionnera $ X sur $ IFS Utilisez[ -lt ]
et utilisez$T
au lieu de${T[0]}
. Dernières lignes, le total devrait être de 1191 octets[ ${T#${M[++i]}*} ]
. Nous pouvons maintenant laisser complètement décembre). J'ai également inclus le premier:
sur quelques-uns des noms (cela:John
signifiait faire tous les délimiteurs:
au lieu de#
).T-SQL,
1169 981 979977 octetsBon sang, j'ai compris la compression de chaîne en SQL ( disponible en SQL 2016 et supérieur ):
Ne garde pas tout à fait autant que je l' espérais qu'il pourrait, sans doute en raison de la quantité de code nécessaire pour convertir / deconvert.
Voici la version d'origine, équivalente au code exécuté après la décompression de la chaîne codée (1169 octets):
Les sauts de ligne sont pour la lisibilité seulement.
INT
YYYYMMDD
Quelques astuces que j'avais l'habitude d'économiser des octets:
ORDER BY
code<
au lieu de<=
VALUES()
ne le ferait une grande liste , même si je dois ensuite séparer la chaîne avecSUBSTRING
etLEFT
.SUBSTRING()
deSTUFF()
Utilisation de chaînes compressées codées en Base64 en SQL
(Ajouté au fil SQL Tips )
Microsoft a donc ajouté une fonction
COMPRESS
et uneDECOMPRESS
fonction dans SQL 2016, qui gère le GZIP; le problème est qu'il renvoie aVARBINARY
, qui, bien que plus court en octets (lorsqu'il est stocké dans unVARBINARY
champ SQL ), est plus long lorsqu'il est affiché en caractères (raw hex), ce qui le rend inapproprié pour le golf.La conversion en Base64 est clairement la solution, mais trouver une implémentation courte et simple était un défi. J'ai basé ma version de cette ancienne réponse sur SO , qui nous donne l'essentiel de ce dont nous avons besoin, même si elle n'utilise pas les nouvelles fonctions GZIP. Il me suffisait d'insérer les nouvelles fonctions au bon endroit et de mettre les choses au clair.
Pour utiliser cette méthode dans votre propre code:
Il faut
7573 octets de code supplémentaires pour décompresser une chaîne codée. Vous ne devez donc clairement l'utiliser que pour de très longues chaînes.EDIT : 2 octets enregistrés dans le code de décompression avec
CAST
au lieu deCONVERT
.la source
Excel,
124312061180 octets-37 octets en soustrayant de toutes les dates
-26 octets en bidouillant les valeurs de soustraction
L'entrée est dans la cellule
A1
au formatYYYYMMDD
car Excel n'aime pas les dates antérieures à 1900.Je ne connais pas de méthode de compression pour les dates ou les noms qui n’ajouteraient pas plus d’octets. La méthode "soustraire [valeur] de toutes les dates" pourrait s'appliquer à la solution de n'importe qui.
J'ai trouvé une solution de 1102 octets dans Google Sheets en utilisant le même principe. Excel n'a pas la
Split
fonction donc ce n'est pas traduisible.la source
19000101
?MATCH()
a un 3ème argument optionnel match_type qui détermine s'il faut utiliser une correspondance exacte. L'exclusion de cet argument utilise la valeur par défaut, qui correspond à une correspondance "inférieure ou égale à", ce code est donc correct.05AB1E ,
587584568 octetsL'entrée est une date concaténée dans le format
yyyyMMdd
(c'est-20190821
à- dire pour le 21 août 2019).-16 octets grâce à @Grimy .
Essayez-le en ligne ou vérifiez quelques autres cas de test .
Explication:
Nous commençons par créer une liste des présidents par ordre chronologique:
Ensuite, nous créons une liste de toutes les dates sous forme d'entiers au format
yyyyMMdd
(l'ordre est sans importance pour cette liste):Ensuite, nous utilisons l'entrée pour déterminer le nom de président de sortie en fonction des dates de la liste:
Voir cette astuce 05AB1E de mes (sections Comment les chaînes Compresser ne font pas partie du dictionnaire? , Comment compresser les grands entiers? , Et comment les listes entières Compresser? ) Pour comprendre comment toute la chaîne compressée, entiers, et le travail des listes.
la source
Gelée ,
431 428 427426 octetsUn programme complet acceptant une chaîne
YYYYMMDD
qui affiche le nom du président.Essayez-le en ligne! Ou consultez la suite de tests (de Kevin Cruijssen).
Comment?
la source
Gelée , 454 octets
Essayez-le en ligne!
Un lien monadique prenant comme argument la date au format AAAAMMJJ et renvoyant une chaîne avec la réponse.
Cas de test (empruntés à la réponse 05AB1E de @ KevinCruijssen ).
la source
JavaScript (Node.js) ,
855 851803 octetsEssayez-le en ligne!
Comment?
La chaîne compressée contient une liste de 89 valeurs.
Les 44 premières valeurs correspondent à la durée des mandats présidentiels exprimée en nombre de jours et codée en base 32 (qui compresse le mieux).
Les 45 valeurs suivantes sont les noms de président en minuscule. Title-case est appliqué par la suite (astuce empruntée à la réponse de @ KevinCruijssen ).
la source
SOGL , 475 octets
Essayez-le ici!
La logique de la date pourrait probablement être améliorée un peu.
la source
PHP , 888 octets
ESSAYER LA DÉMO
la source
05AB1E ,
464444442418 octets-15 ou plus d'octets en volant des idées de la réponse de Kevin Cruijssen
Croisé 444 est toujours 444):
Essayez-le en ligne!
Partie 1: les noms
Il existe deux types de compression de chaîne dans 05AB1E:
[a-z ]
lettres minuscules et des espaces.ÿ
pour extraire une valeur de la pile et l'intégrer à la chaîne.Nous allons utiliser une combinaison optimale des deux. Le passage d’un codage à l’autre entraînant une surcharge, cela est plus complexe que de choisir le codage le plus court pour chaque nom. Par exemple:
ing
enHarding Calvin
prend ~ 1,8 octets dans la base-27 vs 3 octets dans une chaîne dictionnaire. MaisHard
etCalvin
sont tous les deux dans le dictionnaire, nous finissons donc par laissering
non compressés à l'intérieur d'une chaîne de dictionnaire.Herb
enCoolidge Herbert Hoover
prend ~ 3 octets dans la base-27 vs seulement 2 dans une chaîne dictionnaire (depuisherb
est dans le dictionnaire). Mais ni dans le dictionnaireCoolidge
niHoover
dans le dictionnaire, nous finissons par coderHerb
en base 27.Pour contourner la restriction que les chaînes en base 27 ne peuvent contenir que
[a-z ]
, nous attribuons une signification spéciale à certaines lettres. À eux deux, les 44 présidents utilisent les 26 lettres, mais on peut encore jouer des tours:j
s sont les mots du dictionnaire (James
,Benjamin
, ...), doncj
est gratuit pour les chaînes de base 27.q
estQuincy
dedans, donc les minusculesq
sont gratuitesz
estZachary
dedans, donc les minusculesz
sont gratuitesx
estNixon
dedans, donc les majusculesX
sont gratuites (nous ne les utilisons pas réellement)Cela dit, regardons le code.
Nous avons maintenant une liste des 45 noms complets par ordre chronologique, nous en avons donc terminé avec cette partie.
Partie 2: les dates
Pour faciliter la comparaison des dates, nous les convertissons en entiers. Ceci est fait avec une conversion de la base 32, ce qui donne 1024 * année + 32 * mois + jour (et cela ne sert à rien que le "chiffre" de l'année soit supérieur à 32).
Nous commençons avec une liste du nombre de réélections consécutives (les élections qui ne changent pas le président), dans l'ordre chronologique inverse:
Ces trois premiers 1 correspondent à Obama, Bush et Clinton étant tous réélus une fois. Le seul 2 correspond à McKinley et à Theodore Roosevelt qui ont tous deux été réélus (McKinley est décédé et Theodore Roosevelt était son vice-président; il n'y a donc pas eu d'autre élection entre leurs réélections). Franklin D. Roosevelt + Truman devrait faire l’objet d’un 4, mais c’est aussi le moment où le jour de l’inauguration a changé du 4 mars au 20 janvier. Nous allons donc traiter ce cas spécial plus tard.
Rappelez-vous que 1024 signifie une année, alors que 4096 signifie un mandat complet. C'est maintenant une liste de deltas de temps entre les présidents nouvellement élus (toujours dans l'ordre chronologique inverse, raison pour laquelle les chiffres doivent être négatifs).
Maintenant, prenons soin des 9 présidents qui n'ont pas rempli leur mandat (4 sont décédés pour des raisons naturelles, 4 ont été assassinés, Nixon a démissionné):
45088 correspond au delta dans le temps allant du 4 mars 1797 (première introduction le 4 mars) au 4 avril 1841 (premier décès au pouvoir). Les nombres suivants sont des deltas de temps entre les 9 décès / démissions. Enfin, 43819 correspond au delta temporel du 9 août 1974 (démission de Nixon) au 20 janvier 2017 (dernière introduction le 20 janvier).
Nous avons maintenant une liste de toutes les dates où le président a changé. La commande est un peu funky: elle commence en 1933, puis suit les introductions du 4 mars en arrière, puis les décès / démissions en avant, puis revient aux introductions du 20 janvier. Cependant, l'ordre n'aura pas d'importance.
Et nous avons fini.
la source
Charbon de bois , 550 octets
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Prend l'entrée au format ISO. Explication:
la source
Stax ,
550509502 octetsExécuter et déboguer avec également les tests de Kevin Cruijssen
Ce programme s'exécute correctement, mais si vous utilisez l'outil "Décompresser les littéraux", le code source sera corrompu. Il finit par placer deux littéraux entiers l'un à côté de l'autre, ce qui en fait un plus grand. Bien sûr, cela ne fait pas la même chose que le programme original.
la source