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 representa 2013-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 en notación xkcd, envíe la fecha ISO 8601 correspondiente ( YYYY-MM-DD
).
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).
Puede suponer que la entrada es cualquier fecha válida entre años 0000
e 9999
inclusive.
No habrá espacios iniciales en la entrada, pero puede suponer que las líneas se rellenan con espacios en un rectángulo, que contiene como máximo una columna de espacios final.
Aplican reglas estándar de código de golf .
Casos de prueba
2 3 1 4
0 1 2 3 7
5 67 8
2013-02-27
2 3 1 4
0 1 2 4 5
5 67 8
2015-12-24
1234
1 2
5678
2222-11-11
1 3 24
0 1 2 7 8
57 6 8
1878-02-08
2 4 1 3
0 1 2 6
5 678
2061-02-22
1 4 2 3
0 1 2 3 4 5 6 8
6 5 7 8
3564-10-28
1234
1
5678
1111-11-11
1 2 3 4
0 1 2 3
8 5 6 7
0123-12-30
1
está arriba2
, entonces el primer dígito es2
.2
está arriba0
, entonces el segundo dígito es0
.3
está arriba1
,4
está arriba3
, así que obtenemos2013
los primeros cuatro dígitos. Ahora5
está abajo0
, entonces el quinto dígito está0
,6
y7
ambos están abajo2
, entonces ambos dígitos están2
. Y finalmente,8
está abajo7
, así que el último dígito es8
, y terminamos con2013-02-27
. (Los guiones están implícitos en la notación xkcd porque sabemos en qué posiciones aparecen).Respuestas:
CJam, 35 bytes
Probar aquí . Espera que las líneas de entrada se rellenen con espacios.
Explicación
ll
lee dos líneas de entrada y{1$e>}*
realiza una "exploración" en la segunda: toma todos los prefijos de su entrada y calcula el máximo de cada prefijo. Para la línea de entrada"0 1 2 7 8"
, esto empuja"0001112227778"
. Nuestra pila ahora se ve así:Necesitamos volver a capturar los valores en una lista que usamos nosotros mismos
]
; esto también captura nuestra primera línea, así que la sacamos de nuevo usando(
, para obtenercomo se esperaba.
eelee+
enumera esta línea, luego hace lo mismo para una tercera línea de entrada y concatena los resultados, dejando algo como esto en la parte superior de la pila:Ahora nuestra pila es
["0001112227778" X]
dondeX
está la lista enumerada arriba.Volteamos cada par en
X
(Wf%
), ordenamos los pares lexicográficamente ($
) y dejamos los últimos 8 pares-8>
. Esto nos da algo como:Esto funciona, porque la clasificación coloca todos los pares con clave
'
(espacio) antes de todos los dígitos en orden ascendente.Estas son las " posiciones x " de los caracteres
12345678
en la primera y tercera línea: solo necesitamos recuperar los caracteres de nuestra segunda línea (modificada) que están alineados verticalmente con ellos.Para hacer esto, tomamos cada posición (
Wf=
), indexamos en la cadena que hicimos anteriormente (\f=
). Ahora tenemos"20610222"
en la pila: para agregar los guiones, primero nos dividimos en segmentos de longitud dos (2/
), imprimimos el primer segmento sin una nueva línea ((o
) y unimos los segmentos restantes con guiones ('-*
).EDITAR : ¡genial truco de escaneo, Martin! Guardado cuatro bytes.
EDIT 2 : guardado dos bytes más al reemplazar
eelee+
conl+ee
; esto funciona, porque las líneas todos tienen la misma longitud, y la lista de indexación en Cjam es modulo automáticamente la longitud de la lista, por lo que los índicesn+0
,n+1
,n+2
... bien se asignan a0
,1
,2
...EDITAR 3 : Martin guardó otro byte en el paso final del proceso. ¡Agradable!
fuente
Pyth,
4843Banco de pruebas
Requiere relleno con espacios en un rectángulo.
No creo que este sea el mejor enfoque, pero básicamente escribe el valor medio en el índice en una cadena señalada por el valor superior o inferior. Bueno, supongo que tuve tiempo suficiente para jugar al golf la mayoría de las cosas obvias que vi. :PAGS
fuente
JavaScript (ES7), 115
Función anónima. Usando cadenas de plantilla, hay una nueva línea que es significativa e incluida en el conteo de bytes.
Requisito: la línea de entrada central no puede ser más corta que la primera o la última. Este requisito se cumple cuando la entrada se rellena con espacios para formar un rectángulo.
ES6 versión 117 usando .map en lugar de comprensión de matriz
Menos golf
Fragmento de prueba
fuente
Haskell,
125106103 bytesRequiere relleno con espacios para un rectángulo completo.
Ejemplo de uso:
f " 1 3 24\n0 1 2 7 8 \n57 6 8 "
->"1878-02-08"
.Cómo funciona:
fuente
JavaScript ES6, 231
Casos de prueba .
fuente
Perl, 154 bytes
Ungolfed y explicado
fuente
JavaScript (ES6), 131 bytes
Explicación
Requiere que la entrada se rellene con espacios para formar un rectángulo.
Prueba
Mostrar fragmento de código
fuente
Powershell, 119 bytes
Script de prueba sin golf:
Salida:
fuente
Jalea , 38 bytes
Pruébalo en línea!
El ayudante solo está allí para facilitar la entrada; Este es en realidad un programa completo. Asegúrese de cuidar :
'''
), así como las líneas al lado de ellas (vacías, para mayor claridad).fuente