Em seu xkcd sobre o formato de data padrão ISO 8601, Randall se escondeu em uma notação alternativa bastante curiosa:
Os números grandes são todos os dígitos que aparecem na data atual em sua ordem usual, e os números pequenos são índices baseados em 1 das ocorrências desse dígito. Portanto, o exemplo acima representa 2013-02-27
.
Vamos definir uma representação ASCII para essa data. A primeira linha contém os índices de 1 a 4. A segunda linha contém os dígitos "grandes". A terceira linha contém os índices 5 a 8. Se houver vários índices em um único slot, eles serão listados um do lado do outro, do menor para o maior. Se houver no máximo m
índices em um único slot (ou seja, no mesmo dígito e na mesma linha), cada coluna deverá ter m+1
caracteres largos e alinhados à esquerda:
2 3 1 4
0 1 2 3 7
5 67 8
Veja também o desafio associado para a conversão oposta.
O desafio
Dada uma data na notação xkcd, imprima a data ISO 8601 correspondente ( YYYY-MM-DD
).
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e exibindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
Você pode assumir que a entrada é qualquer data válida entre anos 0000
e 9999
inclusive.
Não haverá espaços à esquerda na entrada, mas você pode assumir que as linhas são preenchidas com espaços em um retângulo, que contém no máximo uma coluna de espaços à direita.
Aplicam-se as regras de código-golfe padrão .
Casos de teste
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á acima2
, então o primeiro dígito é2
.2
está acima0
, então o segundo dígito é0
.3
está acima1
,4
está acima3
, então obtemos2013
os quatro primeiros dígitos. Agora5
está abaixo0
, assim que o quinto dígito é0
,6
e7
são ambos abaixo2
, então ambos os dígitos são2
. E, finalmente,8
está abaixo7
, então o último dígito é8
, e terminamos com2013-02-27
. (Os hífens estão implícitos na notação xkcd porque sabemos em que posições eles aparecem.)Respostas:
CJam, 35 bytes
Experimente aqui . Ele espera que as linhas de entrada sejam preenchidas com espaços.
Explicação
ll
lê duas linhas de entrada e{1$e>}*
executa uma "varredura" na segunda: pega todos os prefixos de sua entrada e calcula o máximo de cada prefixo. Para a linha de entrada"0 1 2 7 8"
, isso empurra"0001112227778"
. Nossa pilha agora fica assim:Precisamos capturar novamente os valores em uma lista usando
]
; isso captura nossa primeira linha também, então a colocamos de volta usando(
, para obtercomo esperado.
eelee+
enumera essa linha, depois faz o mesmo para uma terceira linha de entrada e concatena os resultados, deixando algo assim no topo da pilha:Agora nossa pilha é
["0001112227778" X]
ondeX
está a lista enumerada acima.Viramos cada par em
X
(Wf%
), classificamos os pares lexicograficamente ($
) e deixamos os últimos 8 pares-8>
. Isso nos dá algo como:Isso funciona porque a classificação coloca todos os pares com a tecla
'
(espaço) antes de todos os dígitos em ordem crescente.Estas são as " posições x " dos caracteres
12345678
na primeira e terceira linhas: precisamos recuperar apenas os caracteres da nossa segunda linha (modificada) que está alinhada verticalmente com eles.Para fazer isso, pegamos cada position (
Wf=
), indexamos na string que criamos anteriormente (\f=
). Agora temos"20610222"
na pilha: para adicionar os traços, primeiro dividimos em segmentos de comprimento dois (2/
), imprima o primeiro segmento sem uma nova linha ((o
) e junte os segmentos restantes com traços ('-*
).EDIT : truque de varredura legal, Martin! Salvo quatro bytes.
EDIT 2 : salvou mais dois bytes substituindo
eelee+
porl+ee
; isso funciona, porque as linhas têm o mesmo comprimento, e lista de indexação em CJam é automaticamente módulo o comprimento lista, de modo que os índicesn+0
,n+1
,n+2
... bem mapear para0
,1
,2
...EDIT 3 : Martin salvou outro byte na etapa final do processo. Agradável!
fonte
Pyth,
4843Suíte de teste
Requer preenchimento com espaços em um retângulo.
Eu não acho que essa seja a melhor abordagem, mas basicamente ela grava o valor do meio no índice em uma string apontada pelo valor superior ou inferior. Acho que tive tempo suficiente para jogar golfe na maioria das coisas óbvias que vi. : P
fonte
JavaScript (ES7), 115
Função anônima. Usando cadeias de modelo, há uma nova linha que é significativa e incluída na contagem de bytes.
Requisito: a linha de entrada do meio não pode ser menor que a primeira ou a última. Este requisito é atendido quando a entrada é preenchida com espaços para formar um retângulo.
ES6 versão 117 usando .map em vez de compreensão de matriz
Menos golfe
Snippet de teste
fonte
Haskell,
125106103 bytesRequer preenchimento com espaços para um retângulo completo.
Exemplo de uso:
f " 1 3 24\n0 1 2 7 8 \n57 6 8 "
->"1878-02-08"
.Como funciona:
fonte
JavaScript ES6, 231
Casos de teste .
fonte
Perl, 154 bytes
Ungolfed & Explained
fonte
JavaScript (ES6), 131 bytes
Explicação
Requer que a entrada seja preenchida com espaços para formar um retângulo.
Teste
Mostrar snippet de código
fonte
Powershell, 119 bytes
Script de teste não destruído:
Resultado:
fonte
Gelatina , 38 bytes
Experimente online!
O ajudante está lá apenas para facilitar a entrada; este é realmente um programa completo. Certifique-se de cuidar de :
'''
), bem como as linhas próximas a elas (vazias, para maior clareza).fonte