Desafio
Escreva um programa que tenha como entrada um dia de 30 de abril de 1789 a 21 de agosto de 2019 e retorne como saída que foi presidente dos EUA naquele dia.
Notas
Para a lista de presidentes dos EUA , o formato de seus nomes e o período de sua presidência, veja abaixo:
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
Uma presidência é planejada como o primeiro dia incluído e o último dia excluído. Por exemplo, "4 de março de 1861 - 15 de abril de 1865; Abraham Lincoln" significa que Lincoln foi presidente de 4 de março de 1861 a 14 de abril de 1865.
Este é o código-golfe, o programa mais curto em cada idioma vence.
Exemplo
Entrada: "7 de fevereiro de 1865" Saída: "Abraham Lincoln"
WolframAlpha["president on "<>#]&
Tenho certeza de que o Mathematica puro foi construído em algum lugar, mas até eu encontrar o que é chamado, estou usando W | A.WolframAlpha["US president on "<>#]&
a saída não esteja corretaRespostas:
PHP , 936 bytes
Experimente online!
Testes: Experimente online!
O código para testes é a mesma lógica, mas um pouco diferente para substituir o
die(...)
com,return...
para que eu possa repetir os testes.Eu criei uma string com data de início da presidência menos 1 dia no formato
YYYYMMDD
e nome do presidente, separados por-
. Exemplo:17890429-George Washington-17970303-John Adams-18010303-Thomas Jefferson-...
Essa string é compactada usando gzdeflate e também a saída compactada é convertida em base-64, para que todos os caracteres sejam ASCII imprimíveis e eu possa publicá-los aqui ou usá-los no TIO .
No script, a sequência é dividida
-
e repetida. Para cada iteração de loop:$d
é definido como o valor atual da iteração (que é a data de início do presidente -1 dia) e a variável de loop ($i
) é aumentada em um.$d
,$m
será configurada para o próximo valor de iteração (que é o nome do presidente$d
) e a variável de loop ($i
) será aumentada em um novamente. Isso permite que o loop obtenha nomes de presidente, mas pule sobre eles em iterações.$d
, isso significa que a iteração anterior foi o presidente correto e, portanto,$m
é impressa usando adie
função, isso interromperá o programa inteiro após a impressão do nome.No final, se o ciclo for concluído (o que significa que não
die
foi chamado), o nome do último presidente será impresso, pois sabemos que outros presidentes anteriores não conseguiram uma correspondência (então basicamente qualquer coisa depoisJanuary 19, 2017
) imprime o nome do último presidente, mesmo que sejaJanuary 1, 3999
.fonte
Bash ,
12291124 bytes-103 bytes com os excelentes comentários de @ GammaFunction, removendo algumas substituições improdutivas (Adams) e refatorando o código para usar o deslocamento de data da data anterior em vez da data absoluta para cada presidência.
Experimente online!
Muita compressão manual :)
fonte
X=($X)
loop, poisfor z in $X
ele dividirá $ X no $ IFS. Use[ -lt ]
e use em$T
vez de${T[0]}
. Últimas linhas, em geral, devem ter 1191 bytes[ ${T#${M[++i]}*} ]
. Agora podemos deixar dezembro completamente). Também incluí a liderança:
em alguns dos nomes (fazer isso para:John
fazer todos os delimitadores em:
vez de#
).T-SQL,
1169981979977bytesCaramba, eu descobri a compactação de string no SQL ( disponível no SQL 2016 e acima ):
Não salva bastante tanto quanto eu esperava que poderia, provavelmente devido à quantidade de código necessário para converter / deconvert.
Aqui está a versão original, que é equivalente ao código que é executado após a seqüência codificada ser descompactada (1169 bytes):
Quebras de linha são apenas para legibilidade.
INT
YYYYMMDD
Alguns truques que usei para salvar bytes:
ORDER BY
ao código<
vez de<=
VALUES()
seria uma grande lista , mesmo que eu tenha que separá-las comSUBSTRING
eLEFT
.SUBSTRING()
paraSTUFF()
Usando cadeias compactadas codificadas em Base64 no SQL
(Adicionado ao tópico Dicas do SQL )
Portanto, a Microsoft adicionou um
COMPRESS
e umaDECOMPRESS
função de volta no SQL 2016, que lida com o GZIP; o problema é que ele retorna aVARBINARY
, que embora seja mais curto em bytes (quando armazenado em umVARBINARY
campo SQL ), é mais longo quando exibido em caracteres (hexadecimal bruto), o que o torna inadequado para jogar golfe.A conversão para Base64 é claramente a resposta, mas encontrar uma implementação curta e simples foi um desafio. Baseei minha versão dessa resposta antiga em SO , o que nos fornece a maior parte do que precisamos, embora ela não use as novas funções GZIP. Eu apenas tive que inserir as novas funções no lugar certo e reduzi-las um pouco.
Para usar esse método em seu próprio código:
São
7573 bytes extras de código para descompactar uma string codificada; portanto, use-a claramente apenas para strings muito longas.EDIT : salvou 2 bytes no código de descompactação com em
CAST
vez deCONVERT
.fonte
Excel,
124312061180 bytes-37 bytes subtraindo de todas as datas
-26 bytes por mexendo nos valores de subtração
A entrada está na célula
A1
com o formato,YYYYMMDD
pois o Excel não gosta de datas anteriores a 1900.Não conheço um método de compactação para datas ou nomes que não adicionariam mais bytes. O método "subtrair [valor] de todas as datas" pode ser aplicado à solução de qualquer pessoa.
Encontrei uma solução de 1102 bytes no Planilhas Google usando o mesmo princípio. O Excel não tem a
Split
função, portanto não é traduzível.fonte
19000101
?MATCH()
tem um terceiro argumento opcional match_type que determina se deve usar a correspondência exata. A exclusão desse argumento usa o padrão, que é uma correspondência "menor ou igual a", portanto, esse código está correto.05AB1E ,
587584568 bytesA entrada é uma data concatenada no formato
yyyyMMdd
(20190821
por exemplo, 21 de agosto de 2019).-16 bytes graças a @Grimy .
Experimente online ou verifique mais alguns casos de teste .
Explicação:
Começamos criando uma lista dos presidentes em ordem cronológica:
Em seguida, criamos uma lista de todas as datas como números inteiros no formato
yyyyMMdd
(a ordem é irrelevante para esta lista):Em seguida, usamos a entrada para determinar o nome do presidente de saída com base nas datas na lista:
Veja esta dica 05AB1E meu (seções Como cordas compressa não fazem parte do dicionário? , Como comprimir grandes inteiros? E Como listas inteiras compressa? ) Para entender como toda a cadeia de comprimido, inteiros, e listas de trabalho.
fonte
Gelatina ,
431 428 427426 bytesUm programa completo que aceita uma string
YYYYMMDD
que imprime o nome do presidente.Experimente online! Ou veja a suíte de testes (de Kevin Cruijssen).
Quão?
fonte
Gelatina , 454 bytes
Experimente online!
Um link monádico que toma como argumento a data no formato AAAAMMDD e retorna uma sequência com a resposta.
Casos de teste (emprestados da resposta 05AB1E de @ KevinCruijssen ).
fonte
JavaScript (Node.js) ,
855 851803 bytesExperimente online!
Quão?
A cadeia compactada contém uma lista de 89 valores.
Os primeiros 44 valores são a duração dos mandatos do presidente expressos em número de dias e codificados na base 32 (que é a base que melhor comprime).
Os próximos 45 valores são os nomes dos presidentes em letras minúsculas. O caso do título é aplicado posteriormente (truque emprestado da resposta de @ KevinCruijssen ).
fonte
SOGL , 475 bytes
Experimente aqui!
A lógica de datas provavelmente poderia ser melhorada um pouco.
fonte
PHP , 888 bytes
TENTAR DEMO
fonte
05AB1E ,
464444442418 bytes-15 bytes ou mais roubando idéias da resposta de Kevin Cruijssen
444 cruzado ainda é 444):
Experimente online!
Parte 1: os nomes
Existem dois tipos de compactação de cadeia no 05AB1E:
[a-z ]
(letras minúsculas e espaços).ÿ
, para exibir um valor da pilha e incorporá-lo na string.Nós vamos usar uma combinação ideal de ambos. Como alternar de uma codificação para outra implica uma sobrecarga, isso é mais complexo do que escolher a codificação mais curta para cada nome individual. Por exemplo:
ing
inHarding Calvin
leva ~ 1,8 bytes na base-27 vs 3 bytes em uma string de dicionário. MasHard
eCalvin
estamos ambos no dicionário, acabamos deixandoing
descompactados dentro de uma string de dicionário.Herb
inCoolidge Herbert Hoover
leva ~ 3 bytes na base-27 vs apenas 2 em uma string de dicionário (já queherb
está no dicionário). Mas comoCoolidge
nemHoover
estamos no dicionário, acabamos codificandoHerb
como base-27.Para contornar a restrição que as cadeias de base 27 só podem conter
[a-z ]
, atribuímos significados especiais a algumas letras. Entre eles, os 44 presidentes usam todas as 26 letras, mas ainda podemos fazer truques:j
s estão em palavras do dicionário (James
,Benjamin
...), por issoj
é livre para base-27 cordas.q
está dentroQuincy
, então as minúsculasq
são gratuitasz
está dentroZachary
, então as minúsculasz
são gratuitasx
está dentroNixon
, portanto, maiúsculasX
são gratuitas (na verdade, não fazemos uso disso)Com isso dito, vamos olhar para o código.
Agora temos uma lista dos 45 nomes completos em ordem cronológica, por isso terminamos com essa parte.
Parte 2: as datas
Para facilitar a comparação de datas, as convertemos em números inteiros. Isso é feito com uma conversão da base 32, que fornece 1024 * ano + 32 * mês + dia (e não se importa que o "dígito" do ano seja maior que 32).
Começamos com uma lista do número de reeleições consecutivas (eleições que não mudam o presidente), em ordem cronológica inversa:
Os três primeiros 1s correspondem a Obama, Bush e Clinton, todos sendo reeleitos uma vez. O único 2 corresponde a McKinley e Theodore Roosevelt sendo reeleitos uma vez (McKinley morreu no cargo e Theodore Roosevelt foi seu vice-presidente, portanto não houve outra eleição entre as reeleições). Deveria haver um 4 lá para Franklin D. Roosevelt + Truman, mas esse também é o ponto em que o dia da inauguração mudou de 4 de março para 20 de janeiro, por isso tratamos desse caso especial mais tarde.
Lembre-se de que 1024 significa um ano, então 4096 significa um mandato completo. Esta é agora uma lista de deltas de tempo entre presidentes recém-eleitos (ainda em ordem cronológica inversa, razão pela qual os números precisam ser negativos).
Agora, vamos cuidar dos 9 presidentes que não cumpriram mandatos completos (4 morreram por causas naturais, 4 assassinados, Nixon renunciou):
45088 é o período delta de 4 de março de 1797 (primeira introdução em 4 de março) a 4 de abril de 1841 (primeira morte no cargo). Os números a seguir são deltas de tempo entre as 9 mortes / renúncias. Finalmente, 43819 é o delta de tempo de 9 de agosto de 1974 (renúncia de Nixon) a 20 de janeiro de 2017 (última introdução em 20 de janeiro).
Agora temos uma lista de todas as datas em que o presidente mudou. A ordem é um pouco descolada: começa em 1933, segue as introduções de 4 de março ao longo do tempo, depois as mortes / renúncias avançam no tempo e depois segue as introduções de 20 de janeiro. No entanto, a ordem não será realmente importante.
E nós terminamos.
fonte
Carvão , 550 bytes
Experimente online! Link é a versão detalhada do código. Recebe entrada no formato ISO. Explicação:
fonte
Stax ,
550509502 bytesExecute e depure-o também com os testes de Kevin Cruijssen
Este programa é executado corretamente, mas se você usar a ferramenta "Descompactar literais", ele corromperá o código fonte. Ele acaba colocando dois literais inteiros bem próximos um do outro, o que torna um literal maior. Obviamente, isso não faz a mesma coisa que o programa original.
fonte