Escreva um programa que passa por uma sequência de caracteres não-espaço em branco (você pode assumir que eles são dígitos 0
para 9
, mas nada na forma como eles devem ser processados depende deste) e adiciona espaços de acordo com as seguintes regras.
- Deixe que o token atual seja a sequência vazia e os tokens emitidos anteriormente sejam um conjunto vazio.
- Repita os caracteres da sequência. Para cada caractere, primeiro acrescente o caractere ao token atual. Se o token atual ainda não estiver no conjunto de tokens emitidos anteriormente, adicione o token atual a esse conjunto e permita que o novo token atual seja a string vazia.
- Se quando você chegar ao final da string, o token atual estiver vazio, envie os tokens emitidos anteriormente na ordem de emissão, separados por um caractere de espaço. Caso contrário, imprima a sequência original literalmente.
Entrada
A entrada para o STDIN deve ser uma sequência de dígitos.
Saída
O programa deve imprimir o resultado conforme especificado na etapa 3.
Amostras
Entradas de Amostra
2015
10101010
4815162342
101010101010
3455121372425
123456789101112131415
314159265358979323846264338327950288419716939937
Saídas de amostra
2 0 1 5
10101010
4 8 1 5 16 2 3 42
1 0 10 101 01 010
3 4 5 51 2 1 37 24 25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
3 1 4 15 9 2 6 5 35 8 97 93 23 84 62 64 33 83 27 95 0 28 841 971 69 39 937
Isso é código de golfe, portanto, as regras padrão de CG se aplicam. O programa mais curto em bytes vence.
(Solicite esclarecimentos nos comentários. Ainda sou novo nisso. Obrigado!)
4815162342
Eu vejo o que você fez lá, irmão .1 0 10
, a próxima iteração encontrará1
(já usada), avançará uma para localizar10
(já usada) e depois avançará para encontrar101
, que é novo e seria 'adicionado'. Ele adicionaria um espaço e você chegaria a um novo0
, que já foi usado, mas está aqui no final da string. Portanto, a saída seria1 0 10 101 0
, que é inválida (0
é repetida), e o script deve então apenas emitir a string de entrada. Só poderia fazer1010
se101
já tivesse sido usado.If a unique number cannot be formed at the end of the string, then the input should be printed verbatim
10101010 não pode ser dividido, portanto é impresso como está.1
, o que seria uma repetição. Então, em vez disso, você move para a direita no espaço 5, depois move para a direita novamente na etapa 4 e entra na etapa 5 novamente e cria101
.Respostas:
Pitão, 22 bytes
O espaço de liderança é importante.
fonte
Retina ,
6861 bytes<empty>
é uma linha vazia. Observe o espaço à direita na linha 3. Você pode executar o código acima a partir de um único arquivo com o-s
sinalizador.Explicação
Esta primeira etapa implementa as regras 1 a 6. É uma substituição de regex aplicada repetidamente até que a string pare de mudar (
+
é para isso que serve). Em cada etapa, adicionamos um único espaço à string da esquerda para a direita (seguindo as regras do desafio). O regex corresponde à sequência mais curta de dígitos que não apareceu na parte já processada da sequência. Garantimos que estamos analisando um prefixo da cadeia restante com a palavra limite\b
e verificando se podemos chegar ao final da cadeia sem passar espaços com(\w+)$
. O último também garante que realizamos apenas uma substituição por etapa.Isso corresponde a qualquer espaço (que está no final da regex), desde que o último segmento da string seja igual a qualquer outro segmento da string e os substitua pela string vazia. Ou seja, desfazemos a primeira etapa se ela resultou em um segmento final inválido, implementando a regra 7.
fonte
Pyth,
2423 bytesExperimente aqui .
Obrigado a @FryAmTheEggman por salvar um byte: o)
fonte
Python 3, 92 bytes
Basicamente, uma versão altamente golfe da solução da @ Willem.
fonte
[" ".join(o),i][n>""]
bool(n)
mas não pensei nisson>""
.Python 3,
10099 bytesfonte
else "
.Braquilog , 91 bytes
Isso me fez perceber que há muitas coisas sobre a sintaxe que preciso mudar ...
Explicação
fonte
CJam, 26 bytes
Teste aqui.
Explicação
fonte
JavaScript (ES6), 109
Meu formato de saída não é exatamente o mesmo dos exemplos de saída na questioin (existe um espaço à esquerda). Não vejo isso como uma falha, pois o formato de saída não está especificado (apenas O programa deve imprimir o número após o número ... )
Teste a execução do snippet abaixo em um navegador compatível com EcmaScript 6. Desenvolvido com Firefox, testado e em execução no Chrome mais recente.
fonte
GNU sed,
83777371 bytes(Marque um extra porque exigimos
-r
sinalização)O loop interno testa uma sequência repetida e acrescenta caracteres conforme necessário até que um número exclusivo apareça após o separador
_
. O loop externo se move_
.Versão anotada e expandida:
fonte
t
em um./((\b[^ ]+).*\b\2)_/{
pode ser reescrito como/(\b[^ ]+).*\b\1_/{
, sem motivo para 2 grupos de captura.\1
!Ruby, 57 + 1 = 58 bytes
Usa o sinalizador da linha de comando
-p
(oupl
se sua entrada tiver uma nova linha à direita). Explora várias características dos dicionários Ruby Hash: você pode alterar com segurança a string usada para definir uma chave sem alterar a chave (que não funciona para outros tipos mutáveis),.keys
retorna as chaves na ordem em que foram inseridas e o[]||=
operador fornece uma maneira concisa de ramificar se uma determinada chave já está lá.fonte
Haskell, 105 bytes
f
faz isso.fonte
PHP - 148 bytes
Desafio legal, muita diversão!
fonte