En su xkcd sobre el formato de fecha estándar ISO 8601, Randall se coló en una notación alternativa bastante curiosa:
Los números grandes son todos los dígitos que aparecen en la fecha actual en su orden habitual, y los números pequeños son índices basados en 1 de las ocurrencias de ese dígito. Entonces el ejemplo anterior representa2013-02-27
.
Definamos una representación ASCII para tal fecha. La primera línea contiene los índices 1 a 4. La segunda línea contiene los dígitos "grandes". La tercera línea contiene los índices del 5 al 8. Si hay varios índices en una sola ranura, se enumeran uno al lado del otro de menor a mayor. Si hay como máximo m
índices en una sola ranura (es decir, en el mismo dígito y en la misma fila), entonces cada columna debe tener m+1
caracteres anchos y alineados a la izquierda:
2 3 1 4
0 1 2 3 7
5 67 8
Vea también el desafío complementario para la conversión opuesta.
El reto
Dada una fecha ISO 8601 (YYYY-MM-DD
), genera la notación de fecha xkcd correspondiente.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out).
Cualquier año desde 0000
hasta 9999
es entrada válida.
Los espacios finales están permitidos, los espacios iniciales no. Opcionalmente, puede generar una nueva línea final.
Se aplican reglas estándar de código de golf .
Casos de prueba
2013-02-27
2 3 1 4
0 1 2 3 7
5 67 8
2015-12-24
2 3 1 4
0 1 2 4 5
5 67 8
2222-11-11
1234
1 2
5678
1878-02-08
1 3 24
0 1 2 7 8
57 6 8
2061-02-22
2 4 1 3
0 1 2 6
5 678
3564-10-28
1 4 2 3
0 1 2 3 4 5 6 8
6 5 7 8
1111-11-11
1234
1
5678
0123-12-30
1 2 3 4
0 1 2 3
8 5 6 7
Ruby,
200195189178162157 caracteres(Código de 156 caracteres + opción de línea de comando de 1 carácter)
Ejecución de muestra:
fuente
Python 2.7,
308310 bytes¡Guau, arreglarlo solo costó 2 bytes!
La fecha no tiene que separarse, la fecha puede ser de cualquier longitud, no tiene que ser una fecha, podría ser cualquier cadena (pero se eliminan los guiones). La parte media me parece bastante golfable.
fuente
C #, 456
Golfizado:
Sin golf:
fuente
Perl6, 265 bytes
Golfed
Sin golf (ligeramente)
fuente
Python 3, 306 bytes
Estoy investigando formas de determinar, antes de ensamblar las líneas superior e inferior, cuál será el ancho máximo de cualquier columna. Una vez que tenga eso, debería poder construir los espacios en las líneas directamente en lugar de usar todas esas
join
funciones.fuente
''.join
en una variable?''.join(...)
comojoin('',...)
, lo que necesitaría ser "guardado" como una función.+=[i]
puede ser+=i,
.return '\n'
->return'\n'
.Powershell,
174170168167 bytesMenos guión de prueba de golf:
Salida (barras verticales solo para ver los espacios iniciales y finales):
fuente