Dado un código de fecha entero de estilo Excel no negativo, devuelva la "fecha" correspondiente en cualquier forma razonable que muestre claramente año, mes y "día".
Trivial, puedes pensar. ¿Notaste las "citas de miedo"? Los usé porque Excel tiene algunas peculiaridades. Excel cuenta días con el número 1 para enero 1 st , 1900, pero como si 1900 registró en enero 0 º y Un informe de febrero 29 de XX , por lo que tener mucho cuidado para tratar todos los casos de prueba:
Input → Output (example format)
0 → 1900-01-00 Note: NOT 1899-12-31
1 → 1900-01-01
2 → 1900-01-02
59 → 1900-02-28
60 → 1900-02-29 Note: NOT 1900-03-01
61 → 1900-03-01
100 → 1900-04-09
1000 → 1902-09-26
10000 → 1927-05-18
100000 → 2173-10-14
code-golf
date
conversion
Adán
fuente
fuente

DayOfWeekmétodo porque la época original, 1899-12-30 (o el ficticio 1900-01-00) se eligió de modo que el día de la semana simplemente fuera el mod-7 del número del día, pero eso no funcionará con 1899-12-30.Respuestas:
Excel, 3 (+7?)
con formato
Puerto puro
fuente
k (kdb + 3.5),
55545150 bytespara probar, pegue esta línea en la consola q:
la salida debe ser
{}es una función con argumentox0 60?xíndice dexentre0 60o 2 si no se encuentraˋ1900.01.00ˋ1900.02.29una lista de dos símbolos,añádele"d"$convertido a una fechax-36526número de días desde 1900 (en lugar del predeterminado 2000)- x<60ajustar por error de salto de Excel(ˋ1900.01.00ˋ1900.02.29,"d"$x-36526-x<60)@0 60?xyuxtaposición significa indexación: la "@" en el medio está implícita$convertir a cadenafuente
{$[x;$`d$x-65746;"1900.01.00"]}parece funcionar . Supongo que algo se desborda en alguna parte100000.Python 2 , 111 bytes
Pruébalo en línea!
-5 gracias a ngn .
fuente
JavaScript (ES6),
89 8277 bytesGuardado
712 bytes gracias a @tshPruébalo en línea!
fuente
n=>n?n-60?new Date(1900,0,n-(n>60)).toJSON().slice(0,10):'1900-02-29':'1900-01-00'new Date(0,0,1)es lo mismo quenew Date(1900,0,1). Entonces eliminar190guarda 3 bytes. Y ...n=>(p=n>60?'':19)+new Date(p*400,0,n-!p||1).toJSON().slice(p/9,10-!n)+(n&&'')Limpio ,
205189 bytesPruébalo en línea!
fuente
Japt, 43 bytes
Terminé con un puerto parcial de la solución de Arnauld .
La salida está en
yyyy-m-dformato.Pruébelo en línea o pruebe 0-100
fuente
APL (Dyalog Classic) , 31 bytes
Función de prefijo tácito anónimo. Fecha de devolución como
[Y,M,D]Pruébalo en línea!
×signo del código de fecha⊢-reste eso del argumento (el código de fecha)60∘>+aumentar si el código de fecha es superior a sesenta2⎕NQ#263,úselo como argumento inmediato para el "Evento 263" (IDN hasta la fecha)IDN es como el código de fecha de Excel, pero sin el 29 de febrero de 1900, y el día anterior al 1 de enero de 1900 es el 31 de diciembre de 1899
3↑tome los primeros tres elementos de eso (el cuarto es el día de la semana)(…)+Agregue lo siguiente a aquellos:60∘≠0 si el código de fecha es 60; 1 si el código de fecha no es 60×-reste eso del signo del código de fecha¯3↑tome los últimos tres elementos (solo hay uno) relleno con (dos) cerosdesarrollado junto con @ Adám en el chat
fuente
C # (.NET Core) ,
186185 bytesPruébalo en línea!
-1 byte reemplazando el operador OR (||) con el operador OR binario (|).
fuente
Perl 6 , 81 bytes
Pruébalo en línea!
fuente
T-SQL,
141 9594 bytesEl salto de línea es solo para legibilidad.
La entrada se toma a través de la tabla i existente con el campo entero n , según nuestros estándares IO .
SQL utiliza un punto de inicio similar (pero corregido) 1-1-1900 para su formato de fecha interno, por lo que solo tengo que compensarlo en 1 o 2 días en el
DATEADDfunción.SQL no puede generar una columna que contenga una combinación de valores de fecha y caracteres, por lo que no puedo omitir el
FORMATcomando (ya que luego intentaría convertir1/0/1900a una fecha, que por supuesto no es válida).Lo bueno de SQL es que puedo cargar todos los valores de entrada en la tabla y ejecutarlos todos a la vez. Mi localidad (de EE. UU.) Tiene un
m/d/yyyyformato de fecha predeterminado :EDITAR : guardó 46 bytes al cambiar a un anidado en
IIF()lugar del mucho más detalladoCASE WHEN.EDITAR 2 : guardado otro byte moviendo el
-frente deIIF.fuente