Desafío
Escriba un programa que tome como entrada un día del 30 de abril de 1789 al 21 de agosto de 2019 y regrese como salida quien fue presidente de los EE. UU. Ese día.
Notas
Para ver la lista de presidentes de EE. UU. , El formato de sus nombres y el período de su presidencia, consulte a continuación:
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
Una presidencia se entiende como primer día incluido y último día excluido. Por ejemplo, "4 de marzo de 1861 - 15 de abril de 1865; Abraham Lincoln" significa que Lincoln fue presidente del 4 de marzo de 1861 al 14 de abril de 1865.
Este es el código de golf, gana el programa más corto en cada idioma.
Ejemplo
Entrada: "7 de febrero de 1865" Salida: "Abraham Lincoln"
WolframAlpha["president on "<>#]&
Estoy seguro de que Mathematica puro tiene un lugar incorporado en alguna parte, pero hasta que encuentre lo que se llama, me quedo con W | A.WolframAlpha["US president on "<>#]&
la salida no sea correcta para míRespuestas:
PHP , 936 bytes
Pruébalo en línea!
Pruebas: ¡ Pruébelo en línea!
El código para las pruebas es la misma lógica, pero un poco diferente para sustituir la
die(...)
conreturn...
lo que puede recorrer más de pruebas.He creado una cadena con fecha de inicio de la presidencia menos 1 día en formato
YYYYMMDD
y nombre del presidente, separada por-
. Ejemplo:17890429-George Washington-17970303-John Adams-18010303-Thomas Jefferson-...
Esta cadena se comprime usando gzdeflate y también la salida comprimida se convierte a base-64, por lo que todos los caracteres son ASCII imprimibles y puedo publicarlos aquí o usarlos en TIO .
En el script, la cadena se divide
-
y se repite. Para cada iteración de bucle:$d
se establece en el valor de iteración actual (que es la fecha de inicio del presidente -1 día) y la variable de bucle ($i
) se incrementa en uno.$d
,$m
se establece en el siguiente valor de iteración (que es el nombre del presidente$d
) y la variable de bucle ($i
) se incrementa en uno nuevamente. Esto permite que el bucle obtenga nombres de presidente pero salte sobre ellos en iteraciones.$d
, entonces eso significa que la iteración anterior fue el presidente correcto, por lo que$m
se imprime usando ladie
función, esto detendrá todo el programa después de imprimir el nombre.Al final, si el ciclo ha finalizado (lo que significa que no
die
se llamó), se imprime el nombre del último presidente, ya que sabemos que ninguno de los presidentes anteriores tiene una coincidencia (así que básicamente cualquier cosa despuésJanuary 19, 2017
) imprime el nombre del último presidente, incluso si esJanuary 1, 3999
.fuente
Bash ,
12291124 bytes-103 bytes con los excelentes comentarios de @ GammaFunction, eliminando un par de sustituciones improductivas (Adams) y refactorizando el código para usar el desplazamiento de fecha desde la fecha anterior en lugar de la fecha absoluta para cada presidencia.
Pruébalo en línea!
Mucha compresión manual :)
fuente
X=($X)
bucles, yafor z in $X
que dividirá $ X en $ IFS. Usar[ -lt ]
y usar en$T
lugar de${T[0]}
. Las últimas líneas, en general, deben ser 1191 bytes[ ${T#${M[++i]}*} ]
. Ahora podemos dejar completamente diciembre). También incluí el encabezado:
en algunos de los nombres (hacer esto:John
significaba hacer todos los delimitadores en:
lugar de#
).T-SQL,
1169981979977bytesSanta vaca, descubrí la compresión de cadenas en SQL ( disponible en SQL 2016 y superior ):
No guarda bastante tanto como yo esperaba que podría, probablemente debido a la cantidad de código que se necesita para convertir / deconvert.
Aquí está la versión original, que es equivalente al código que se ejecuta después de descomprimir la cadena codificada (1169 bytes):
Los saltos de línea son solo para legibilidad.
La entrada se toma de la tabla preexistente con el campo , según nuestras reglas de IO . La fecha de entrada está formateada como un número de 8 dígitos .d ii
INT
YYYYMMDD
Algunos trucos que solía guardar bytes:
ORDER BY
código<
lugar de<=
VALUES()
sería una gran lista , a pesar de que tengo que separar la cadena conSUBSTRING
yLEFT
.SUBSTRING()
aSTUFF()
Uso de cadenas comprimidas codificadas en Base64 en SQL
(Agregado al hilo de Consejos SQL )
Entonces Microsoft agregó una
COMPRESS
y unaDECOMPRESS
función en SQL 2016, que maneja el GZIP; El problema es que devuelve unVARBINARY
, que aunque es más corto en bytes (cuando se almacena en unVARBINARY
campo SQL ), es más largo cuando se muestra en caracteres (hexadecimal), lo que lo hace inadecuado para el golf.La conversión a Base64 es claramente la respuesta, pero encontrar una implementación corta y simple fue un desafío. Basé mi versión de esta vieja respuesta en SO , que nos da la mayor parte de lo que necesitamos, aunque no utiliza las nuevas funciones GZIP. Solo tenía que insertar las nuevas funciones en el lugar correcto y jugar un poco hacia abajo.
Para usar este método en su propio código:
Eso es
7573 bytes adicionales de código para descomprimir una cadena codificada, por lo que claramente solo se usa para cadenas muy largas.EDITAR : guardado 2 bytes en el código de descompresión con en
CAST
lugar deCONVERT
.fuente
Excel,
124312061180 bytes-37 bytes restando de todas las fechas
-26 bytes jugando con los valores de resta
La entrada está en una celda
A1
con el formatoYYYYMMDD
ya que a Excel no le gustan las fechas anteriores a 1900.No conozco un método de compresión para las fechas o nombres que no agreguen más bytes. El método "restar [valor] de todas las fechas" podría aplicarse a la solución de cualquiera.
Encontré una solución de 1102 bytes en Google Sheets usando el mismo principio. Excel no tiene la
Split
función, por lo que no es traducible.fuente
19000101
?MATCH()
tiene un tercer argumento opcional match_type que determina si se usa la coincidencia exacta. Al excluir ese argumento, se usa el valor predeterminado, que es una coincidencia "menor o igual que", por lo que este código es correcto.05AB1E ,
587584568 bytesLa entrada es una fecha concatenada en el formato
yyyyMMdd
(es decir,20190821
para el 21 de agosto de 2019).-16 bytes gracias a @Grimy .
Pruébelo en línea o verifique algunos casos de prueba más .
Explicación:
Comenzamos creando una lista de los presidentes en orden cronológico:
Luego creamos una lista de todas las fechas como enteros en el formato
yyyyMMdd
(el orden es irrelevante para esta lista):Luego usamos la entrada para determinar el nombre del presidente de salida en función de las fechas en la lista:
Vea esta sugerencia mía 05AB1E (secciones ¿Cómo comprimir cadenas que no forman parte del diccionario ? , ¿Cómo comprimir enteros grandes? Y ¿Cómo comprimir listas enteras? ) Para comprender cómo funcionan todas las cadenas, enteros y listas comprimidas.
fuente
Jalea ,
431 428 427426 bytesUn programa completo que acepta una cadena
YYYYMMDD
que imprime el nombre del presidente.Pruébalo en línea! O vea el conjunto de pruebas (de Kevin Cruijssen).
¿Cómo?
fuente
Jalea , 454 bytes
Pruébalo en línea!
Un enlace monádico que toma como argumento la fecha en formato AAAAMMDD y devuelve una cadena con la respuesta.
Casos de prueba (tomados de la respuesta 05AB1E de @ KevinCruijssen ).
fuente
JavaScript (Node.js) ,
855 851803 bytesPruébalo en línea!
¿Cómo?
La cadena comprimida contiene una lista de 89 valores.
Los primeros 44 valores son la duración de los mandatos del presidente expresados en número de días y codificados en la base 32 (que es la base que mejor se comprime).
Los siguientes 45 valores son los nombres de los presidentes en minúsculas. El título del caso se aplica después (truco tomado de la respuesta de @ KevinCruijssen ).
fuente
SOGL , 475 bytes
Pruébalo aquí!
La lógica de la fecha probablemente podría mejorarse un poco.
fuente
PHP , 888 bytes
PRUEBA DEMO
fuente
05AB1E ,
464444442418 bytes-15 o más bytes al robar ideas de la respuesta de Kevin Cruijssen
Cruzado 444 sigue siendo 444):
Pruébalo en línea!
Parte 1: los nombres
Hay dos tipos de compresión de cadenas en 05AB1E:
[a-z ]
(letras minúsculas y espacios).ÿ
para extraer un valor de la pila e incrustarlo en la cadena.Vamos a utilizar una combinación óptima de ambos. Dado que cambiar de una codificación a otra conlleva algo de sobrecarga, esto es más complejo que elegir la codificación más corta para cada nombre individual. Por ejemplo:
ing
deHarding Calvin
toma ~ 1,8 Bytes de base-27 vs 3 bytes en una cadena diccionario. PeroHard
yCalvin
ambos están en el diccionario, entonces terminamosing
sin comprimir dentro de una cadena de diccionario.Herb
deCoolidge Herbert Hoover
toma ~ 3 bytes en la base-27 vs solamente 2 en una cadena diccionario (ya queherb
está en el diccionario). Pero niCoolidge
tampocoHoover
están en el diccionario, por lo que terminamos codificandoHerb
como base-27.Para evitar la restricción que las cadenas de base 27 solo pueden contener
[a-z ]
, asignamos significados especiales a algunas letras. Entre ellos, los 44 presidentes usan las 26 letras, pero aún podemos jugar trucos:j
s están en las palabras del diccionario (James
,Benjamin
, ...), por lo quej
es libre para base 27 cuerdas.q
está adentroQuincy
, así que minúsculasq
es gratisz
está adentroZachary
, así que minúsculasz
es gratisx
está enNixon
, así que mayúsculasX
es gratis (en realidad no hacemos uso de eso)Dicho esto, veamos el código.
Ahora tenemos una lista de los 45 nombres completos en orden cronológico, por lo que hemos terminado con esta parte.
Parte 2: las fechas
Para facilitar la comparación de fechas, las convertimos en enteros. Esto se realiza con una conversión de base-32, que da 1024 * año + 32 * mes + día (y no le importa que el año "dígito" sea mayor que 32).
Comenzamos con una lista del número de reelecciones consecutivas (elecciones que no cambian al presidente), en orden cronológico inverso:
Esos primeros tres 1s corresponden a Obama, Bush y Clinton, todos reelegidos una vez. El solitario 2 corresponde a McKinley y Theodore Roosevelt, ambos reelegidos una vez (McKinley murió en el cargo y Theodore Roosevelt fue su vicepresidente, por lo que no hubo otra elección entre sus reelecciones). Debería haber un 4 para Franklin D. Roosevelt + Truman, pero este es también el punto donde el día de la inauguración cambió del 4 de marzo al 20 de enero, por lo que manejamos este caso especial más adelante.
Recuerde que 1024 significa un año, por lo que 4096 significa un mandato completo. Esta es ahora una lista de deltas de tiempo entre los presidentes recién elegidos (todavía en orden cronológico inverso, por lo que los números deben ser negativos).
Ahora, cuidemos de los 9 presidentes que no cumplieron mandatos completos (4 murieron por causas naturales, 4 asesinados, Nixon renunció):
45088 es el delta de tiempo desde el 4 de marzo de 1797 (primera presentación el 4 de marzo) hasta el 4 de abril de 1841 (primera muerte en el cargo). Los siguientes números son deltas de tiempo entre las 9 muertes / renuncias. Finalmente, 43819 es el intervalo de tiempo desde el 9 de agosto de 1974 (renuncia de Nixon) hasta el 20 de enero de 2017 (última presentación el 20 de enero).
Ahora tenemos una lista de todas las fechas en que cambió el presidente. El orden es un poco extraño: comienza en 1933, luego sigue las presentaciones del 4 de marzo hacia atrás en el tiempo, luego las muertes / renuncias hacia adelante en el tiempo, luego se remonta a las presentaciones del 20 de enero. Sin embargo, el orden en realidad no importará.
Y ya hemos terminado.
fuente
Carbón de leña , 550 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Toma entrada en formato ISO. Explicación:
fuente
Stax ,
550509502 bytesEjecute y depure también con las pruebas de Kevin Cruijssen
Este programa se ejecuta correctamente, pero si utiliza la herramienta "Descomprimir literales", dañará el código fuente. Termina poniendo dos literales enteros uno al lado del otro, lo que hace que un literal sea más grande. Por supuesto, eso no hace lo mismo que el programa original.
fuente