Dada una fecha escrita en cualquiera (debe manejar todos en el mismo programa) de los siguientes formatos, analícela en una válida yyyy/mm/dd date.
17th May 2012
March 14th, 2016
20 February 2014
September 14, 2017
Sunday, June 8, 2015
Reglas
- Las fechas a veces serán inválidas, es decir. día incorrecto para el mes o número de meses en un año, debe manejar ambos casos. Ya sea por error o devolviendo un valor de falsey consistente, usted elige. (Sin embargo, se apegarán a los formatos de plantilla anteriores)
- El relleno para días y meses inferiores a 10 debe usarse para crear una salida de dos dígitos.
- Los nombres de los meses siempre serán el nombre completo, no abreviado a sus contrapartes de tres caracteres.
- Puede asumir que el año siempre estará dentro del rango de9999.
- Los números negativos no necesitan ser manejados.
- Puede crear un programa o función completa para que la salida pueda estar en cualquier formato, imprimirse en la consola o devolverse desde una función.
- La entrada siempre será una cadena, la salida siempre debe ser una cadena, si hace que sea más corto tomarlo como un argumento único en una matriz, por ejemplo.
["17th May 2012"]puede hacerlo y la salida puede ser la misma["2012/05/17"] - Puede suponer que la ortografía en la entrada será correcta.
BONIFICACIÓN: porque a quién aquí no le gusta un desafío;)
Si puede permitir también los formatos de entrada The Fourteenth of March, 2016o March the Fourteenth, 2016puede quitar 20 bytes adicionales de su código con cualquier recuento final de bytes inferior a 1, lo que da como resultado 1.
Aquí están los números escritos completos para cada uno de los días para evitar cualquier confusión en la ortografía.
First, Second, Third, Fourth, Fifth, Sixth, Seventh, Eighth, Nineth, Tenth, Eleventh, Twelfth, Thirteenth, Fourteenth, Fifteenth, Sixteenth, Seventeenth, Eighteenth, Nineteenth, Twentieth, Twenty First, Twenty Second, Twenty Third, Twenty Fourth, Twenty Fifth, Twenty Sixth, Twenty Seventh, Twenty Eighth, Twenty Nineth, Thirtieth, Thirty First
Casos de prueba
INPUT | Output
17th May 2012 | 2012/05/17
March 14th, 2016 | 2016/03/14
20 February 2014 | 2014/02/20
September 14, 2017 | 2017/09/14
Sunday, June 8, 2015 | 2015/06/08
1st January 1918 | 1918/01/01
The Fourteenth of March, 2016 | 2016/03/14
March the Fourteenth, 2016 | 2016/03/14
November the Seventeenth, 2019 | 2019/11/17
The Thirtieth of April, 2016 | 2016/04/30
30 February 2014 | Invalid
September 99, 2017 | Invalid
Sunday, June8, 2015 | Invalid
The Thirty First of April, 2016 | Invalid

20 February 2014son soportados por omisión en un montón de fecha-analizadores, pero17thySunday, June 8, 2015son un poco más difícil de analizar (en función del idioma).Thursday, August 25, 2017valido? Veo presentaciones ignorando el DOW.Respuestas:
Carriles,
41,3735 bytesNo conozco un intérprete en línea para Rails, pero aquí hay una captura de pantalla que demuestra este proceso
fuente
PowerShell ,
91899156 bytesPruébalo en línea!
Toma la entrada como una cadena. Utiliza a
-replacepara deshacerse de la basura, luego usa elGet-Datecomando incorporado con el-findicador ormat para especificar elyyyy/MM/ddformato requerido . Esa cadena se deja en la tubería y la salida es implícita.Ahorré dos bytes gracias al Sr. Xcoder. Ahorró una gran parte gracias al juego de golf regex de TessellatingHeckler.
fuente
''del formato de fecha, para -2. Si desea apegarse a su enfoque, dado que "la ortografía es correcta", puede reemplazarlo'th|rd|st|(\b.*)day|,'y se reduce a 56 bytes y maneja los mismos casos. Aunque creo que está mal porque si abandonas los días, no puedes recoger elSunday, June8, 2015 | Invalidcaso porque era lunes. Debe error, pero se analiza como válido. No estoy seguro de cuál será la decisión sobre eso, o si otros lo están revisando.PHP,
73164 + 1 bytesEjecutar como tubería
-nRo probarlo en línea .La verificación de la fecha fue realmente costosa: tuve que desarmar la fecha antes de usar un incorporado, y luego intentar y error en el nombre del mes.
fuente
30 February 2014vuelve2014/03/02. Ya sea por error o devolviendo un valor de falsey consistente, usted elige. (Sin embargo, se apegarán a los formatos de plantilla anteriores)Python 3 + biblioteca parsedatetime,
152139155153 bytesGuardado 13 bytes gracias a Jonathan Allan
Se agregaron 16 bytes para manejar fechas con días de longitud no válidos
Se guardaron 2 bytes al eliminar la asignación lambda
Pruébalo en línea!
No admite fechas de bonificación
fuente
None;import ...as; & alambdareutilizandoparsecomoh.Python 2 , 193 bytes
Pruébalo en línea!
; -; pls halp
fuente
time.f=del recuento de bytes en TiO) declarandore.subJava (OpenJDK 8) , 190 + 26 = 216 bytes
Pruébalo en línea!
Nota importante: fue más corto validar también el día de la semana en lugar de deshacerse de él, por lo que se incluye la validación.
No he intentado con
SimpleDateFormatmás allá de los casos obvios que todos aceptaron fechas como el 30 de febrero. Así que tuve que deshacerme de él y usé Java 8DateTimeFormatter.Explicación
Este formato significa:
[EEEE, ](sucede enSunday, ...),[d ],MMMMy espacio,[d, ],uuuupara hacerle saber al analizador que estamos en la era gregoriana.Código:
Créditos
fuente
replaceAllpatrón?JavaScript (ES6),
124122 bytesfuente
2015/06/07paraJune 8, 2015(¿problema UTC? Estoy en UTC + 2) yfalsepara cualquieraSunday, June 8, 2015oMonday, June 8, 2015.nday.