Convierta el formato de fecha corta a la fecha larga en inglés en la menor cantidad de bytes posible.
Entrada
La entrada tendrá la forma de una cadena con formato yyyy-mm-dd
, con cero relleno opcional para todos los valores. Puede suponer que esto es sintácticamente correcto, pero no necesariamente una fecha válida. Los valores anuales negativos no necesitan ser compatibles.
Salida
Debe convertir la fecha al formato de fecha larga en inglés (por ejemplo 14th February 2017
). Cero relleno aquí no está permitido.
Si la fecha no es válida (p 2011-02-29
. Ej. ), Debe reconocerse de alguna manera. Lanzar una excepción está permitido.
Se pueden ver más ejemplos a continuación.
Casos de prueba
"1980-05-12" -> 12th May 1980
"2005-12-3" -> 3rd December 2005
"150-4-21" -> 21st April 150
"2011-2-29" -> (error/invalid)
"1999-10-35" -> (error/invalid)
code-golf
date
conversion
GarethPW
fuente
fuente
03rd
lugar de3rd
2016-2-29
?Respuestas:
PostgreSQL, 61 caracteres
Declaración preparada, toma la entrada como parámetro.
Ejecución de muestra:
fuente
Python 3.6,
137129 bytesPruébalo en línea!
fuente
%-d
es la versión sin relleno%d
que puede usar en su formato de cadena en lugar de{g[2]}
. Además,12
debería ser12th
, no12nd
(los números del 10-19 no siguen las mismas reglas que el 1-9 y el 20+)f
cuerdasJavaScript (ES6),
142140 bytesSalidas
NaNth Invalid Date
para fechas no válidas.El código para los números ordinales se adaptó de esta respuesta .
Mostrar fragmento de código
fuente
Python 3.6 , 154 bytes
Pruébalo en línea! (Configure el flujo de entrada y luego ejecútelo).
Gracias a las buenas sugerencias de los comentaristas a continuación.
fuente
int(x)
yfor
en la lista de comp.(('st','nd','rd')[b%10-1]if b<4 or 20<b<24 else'th')
en lugar de su condicional actual para -3 bytes.(3<b<21)+(23<b<31)
para -1 byte. Pruébalo en línea!PHP, 87 bytes
Ejecutar como tubería con
-F
o probarlo en línea . Siempre imprime un año de 4 dígitos; falla por años> 9999.sin verificación de validez, 35 bytes:
fuente
Bash + coreutils,
11578Pruébalo en línea .
fuente
f=thstndrd; $d"${f:t/10-1?t%10<4?t%10*2:0:0:2} %B %Y"
.C #,
147143 bytesGuardado 4 bytes gracias a @The_Lone_Devil.
fuente
t.Day
cond
un ahorro de 4 bytes?mIRC versión 7.49 (197 bytes)
fuente
Rubí ,
104103102 + 8 =112111110 bytesUtiliza
-rdate -p
banderas de programa.-1 byte de manatwork.
Pruébalo en línea!
fuente
d<4||d>20?"..stndrd"[d%10*2,2]:"th"
26
intentará acceder a los índices12..13
en la cadena de búsqueda, que está fuera de los límites, y por lo tanto regresanil
. Por lo tanto, usar el ternario lo haced<4||d>20?"..stndrd"[d%10*2,2]||"th":"th"
, que es más largo por 2 bytes."th"
→:th
.C # (.NET Core) ,
167197 bytesPruébalo en línea!
+30 bytes para
using System;
DateTime.Parse()
fuente
!
byte -1. Y puede cambiarlo&&
a&
-3 bytes. Además, dado que usas.Day
7 veces, guarda algunos bytes para crear un valor temporal para él:s=>{var t=s.Day;return s.Equals(DateTime.MinValue)?"":t+((t%10==1&t!=11)?"st":(t%10==2&t!=12)?"nd":(t%10==3&t!=13)?"rd":"th")+" "+s.ToString("MMMM")+" "+s.Year;}
using System;
o calificar completamente elDateTime
objeto.DateTime.MinValue
es1-1-1
así que no creo que necesites ese cheque. Lo que también haría que mi punto anterior sea irrelevante.DateTime
análisis fuera del método no es aceptable, debe hacer todo el trabajo dentro del método. O agregue un método adicional para dividir el trabajo.Excel, 212 bytes
Si lo rompes en pedazos en cada ampersand, obtienes estas piezas:
ABS()
extrae el número del día de los últimos dos caracteres en la cadena. Como eso puede incluir un guión, loABS
convierte en positivo.IF((ABS-12)<2,"th",SWITCH())
agrega el ordinal. El-12
bit es porque 11, 12 y 13 no siguen la regla normal y todos obtienen enth
lugar dest
,nd
, yrd
. Esto corrige por eso.SWITCH
función solo está disponible en Excel 2016 y versiones posteriores. ( Fuente ) Es más corto queCHOOSE
en este caso porque puede devolver un valor si no se encuentra una coincidencia, mientras queCHOOSE
requiere una entrada numérica y debe tener un retorno correspondiente para cada valor posible.TEXT(MID()*30," mmmm ")
extrae el nombre del mes.MID()
extrae el número del mes como una cadena y multiplicando por 30 devuelve un número. Excel ve ese número como una fecha (1900-01-30, 1900-02-29, 1900-03-30, etc.) y loTEXT()
formatea como un nombre de mes con un espacio en ambos extremos. 28 y 29 también habrían funcionado, pero 30 se ve "mejor".LEFT()
extrae el número del año.Ahora, dado todo eso, habría sido mucho más fácil si todos los casos de prueba estuvieran en un rango de fechas que Excel puede manejar como una fecha real: 1900-01-01 a 9999-12-31. La gran ventaja es que toda la fecha está formateada a la vez. Esa solución es 133 bytes :
El otro gran obstáculo era tener que incluir el ordinal. Sin eso, la solución es solo 34 bytes :
fuente
Swift 3: 298 bytes
Pruébalo en línea!
fuente
# Language, N bytes
. Sería bueno si pudieras agregar uno también.T-SQL, 194 bytes
La entrada es a través de la columna de texto i en la tabla preexistente t , según nuestros estándares IO .
Funciona para fechas del 1 de enero de 0001 al 31 de diciembre de 9999. El año se emite con al menos 3 dígitos (por ejemplo 150AD).
Las fechas inválidas resultarán en el siguiente error feo:
Diferentes configuraciones predeterminadas de idioma / cultura pueden cambiar este comportamiento. Si desea una salida de error un poco más elegante (NULL), agregue 4 bytes cambiando
PARSE()
aTRY_PARSE()
.Formato y explicación:
El
DATE
tipo de datos introducido en SQL 2008 permite un rango mucho más amplio queDATETIME
, desde el 1 de enero de 0001 hasta el 31 de diciembre de 9999.Algunas fechas muy tempranas se pueden analizar incorrectamente con la configuración de mi localidad de EE. UU. ("01-02-03" se convierte en "2 de enero de 2003"), por lo que agregué un par de ceros adicionales para que sepa que el primer valor es el año.
Después de eso, es solo una
CASE
declaración desordenada para agregar el sufijo ordinal al día. Molesto, elFORMAT
comando SQL no tiene forma de hacerlo automáticamente.fuente
q / kdb + 210 bytes, no competidores
Solución:
Ejemplos:
Explicación:
Este es un desafío horrible ya que no hay formato de fecha, así que tengo que crear meses desde cero (95 bytes) y generar el sufijo.
La solución no oculta se encuentra a continuación, básicamente divide la cadena de entrada y luego vuelve a unirlas después de agregar el sufijo y cambiar el mes.
Notas:
Las fechas en q solo se remontan a ~ 1709, por lo que no tengo una forma trivial de validar la fecha, por lo tanto, esta es una entrada no competitiva ... Lo mejor que puedo hacer es verificar si el día es> 31 o el mes es > 12 y devuelve 0.
fuente