Nesse desafio sobre o código de prefixo , aprendemos que os códigos de prefixo são concatenáveis exclusivamente.
Isso significa que eles podem ser unidos sem separador e sem ambiguidade.
Por exemplo, como [1,2,45] é um código de prefixo, eu posso uni-los sem separador, como tal: 1245245112145, e não haverá ambiguidade.
No entanto, o inverso nem sempre é verdadeiro.
Por exemplo, [3,34] não é um código de prefixo. No entanto, posso fazer o mesmo: 3333434334333 e não haverá ambiguidade. Você precisaria apenas de um analisador mais inteligente.
No entanto, [1,11] não é concatenável de forma única, porque 1111 pode ser interpretado de 5 maneiras.
Objetivo
Sua tarefa é escrever um programa / função que use uma lista de seqüências de caracteres (ASCII) como entrada e determinar se elas são concatenáveis exclusivamente.
Detalhes
Duplicar conta como falso.
Pontuação
Isso é código-golfe . A solução mais curta em bytes vence.
Casos de teste
Verdade:
[12,21,112]
[12,112,1112]
[3,4,35]
[2,3,352]
Falso:
[1,1]
[1,2,112]
[1,23,4,12,34]
[1,2,35,4,123,58,8]
Respostas:
05AB1E , 15 bytes
No telefone, a explicação terá que seguir mais tarde. Código:
Usa a codificação CP-1252 . Experimente online! .
Consome muita memória para o último caso de teste, portanto, isso pode não funcionar ...
fonte
CJam (54 bytes)
Recebe entrada no stdin como lista separada por nova linha.
Demonstração online
Se não precisássemos lidar com palavras-chave duplicadas, isso poderia ser reduzido para 44:
Ou se CJam tivesse uma subtração de matriz que removesse apenas um item da primeira lista para cada item na segunda, poderia ser 48 ...
Dissecação
Este é o algoritmo Sardinas-Patterson mas des otimizado. Como cada sufixo dangling é exibido apenas no máximo uma vez, a execução do loop principal quantas vezes houver caracteres na entrada (incluindo separadores) garante ser suficiente.
Observe que eu tive que contornar o que é indiscutivelmente um bug no intérprete CJam:
Portanto, a verificação do prefixo é complicada em
1$,<=
vez de\#!
fonte