Considere a seguinte lista de palavras classificadas em ordem alfabética:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
Todas as palavras começam com b
, e as 5 primeiras começam com bal
. Se apenas olharmos para as 2 primeiras palavras:
balderdash
ballet
nós poderíamos escrever:
balderdash
+let
onde ' '
é usado onde uma palavra compartilha um caractere de prefixo com a palavra anterior; exceto o '+'
caractere que indica o ÚLTIMO caractere em que a segunda palavra compartilha um prefixo com a palavra anterior.
Esta é uma espécie de visualização 'trie' : o pai é ' bal
' e tem 2 descendentes: 'derdash'
e 'let'
.
Com uma lista mais longa, como:
balderdash
ballet
brooding
além disso, podemos usar o caractere de barra vertical '|'
para deixar mais claro onde o prefixo compartilhado termina, da seguinte maneira:
balderdash
| +let
+rooding
e a árvore equivalente teria a raiz de 'b'
ter dois filhos: a subárvore com raiz ee 'al'
seus dois filhos 'derdash'
e 'let'
; e 'rooding'
.
Se aplicarmos essa estratégia à nossa lista original,
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
obtemos resultados parecidos com:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
Se duas palavras consecutivas na lista não tiverem prefixo compartilhado, nenhum caractere especial será substituído; por exemplo, para a lista:
broom
brood
crude
crumb
queremos a saída:
broom
+d
crude
+mb
Entrada
As palavras na entrada serão compostas apenas por alfanuméricos (sem espaços ou pontuação); isso pode estar na forma de uma lista de strings, uma única string ou qualquer outra abordagem razoável, desde que você especifique o formato escolhido. Não há duas palavras consecutivas iguais. A lista será classificada em ordem alfabética.
Saída
Sua saída pode conter espaços em branco à direita por linha ou no total, mas nenhum espaço em branco à esquerda. Uma lista de strings ou similar também seria aceitável.
Isso é código-golfe ; o código mais curto em cada idioma mantém os direitos de se gabar. Aplicam-se as proibições usuais contra brechas.
Casos de teste
Input:
apogee
apology
app
apple
applique
apply
apt
Output:
apogee
|+logy
+p
|+le
| +ique
| +y
+t
Input:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
donald
donatella
donna
dont
dumb
Output:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
donald
| |+tella
| +na
| +t
+umb
ball
depoisballoon
. Que saída devemos esperar?+
menos do que o primeiroo
, mas não escrevi o desafio, então não tenho certeza.Respostas:
Retina 0.8.2 ,
5857 bytesExperimente online! O link inclui um caso de teste. Edit: Salvo 1 byte graças a @FryAmTheEggman, apontando que eu ignorei uma mudança de
\b
para^
tornada possível pelom)
. Explicação:Ative por linha
^
para todo o programa.Para cada palavra, tente corresponder o máximo possível desde o início da palavra anterior. Altere a correspondência para espaços, exceto o último caractere, que se torna a
+
.Substitua repetidamente todos os espaços imediatamente acima de
+
s ou|
s por|
s.fonte
m)
especificamente para poder fazer isso, então estou chateado por ter perdido uma instância.JavaScript (ES6), 128 bytes
Espera e retorna uma lista de listas de caracteres.
Experimente online!
Quão?
Os espaços e
+
's podem ser inseridos percorrendo a primeira até a última palavra em ordem, mas|
só podem ser inseridos a posteriori uma vez+
identificação. Isso pode ser conseguido com duas passagens distintas, mas, em vez disso, salvamos um ponteiro em cada entrada modificadaa[~y]
para que ela possa ser atualizada mais tarde na mesmamap()
loop.Em teoria, uma solução mais simples seria percorrer as palavras em ordem inversa e reverter a saída também no final do processo. Mas isso é um pouco caro em JS e não encontrei uma maneira de obter uma versão mais curta com esse método.
fonte
JavaScript (Node.js) ,
125122118117 bytesExperimente online!
fonte
Python,
263260 bytes- 3 bytes graças a Jonathan Frech
Código:
Experimente Online!
Explicação:
Essa solução cria um trie das palavras de entrada e a analisa recursivamente na saída necessária. A função a pega um teste e uma string se adiciona x a t. As tentativas são implementadas como dicionários aninhados. Cada dicionário representa um nó na árvore. Por exemplo, o dicionário que representa o trie gerado pelo primeiro caso de teste é assim:
A função p se repete através dessa estrutura e gera a representação em cadeia da árvore esperada pelo desafio. A função f pega um monte de strings como argumentos, adiciona todos eles a um trie com a e, em seguida, retorna o resultado da chamada p no trie.
fonte
C (gcc) ,
165155 bytesLeva três argumentos:
char** a
: uma matriz de palavras terminadas em nulochar* m
: uma matriz do comprimento de cada palavraint n
: o número de palavras na matrizExperimente online!
fonte
++i<n&j<m[i]&a[i--]
comportamento indefinido? Posso confiar na avaliação do gcc da esquerda para a direita?Perl 6 ,
149 144142 bytesExperimente online!
Tenho certeza de que isso pode ser mais importante, especialmente porque não sou especialista em regexes. Isso usa o mesmo processo da resposta Retina de Neil .
fonte
Python 2 , 191 bytes
Experimente online!
fonte
Ruby , 118 bytes
Experimente online!
Aceita uma matriz de seqüências de caracteres, saídas modificando a matriz de entrada original no local.
Explicação
A transformação básica de strings não é muito complexa, mas para inserir corretamente os tubos verticais, precisamos iterar na ordem inversa e, como o
reverse
método é bastante detalhado, faremos isso de uma maneira mais complicada. Aqui, usamosmap
apenas para executar o loop, deixar a primeira palavra em paz e, em seguida, iterar a partir do final usando índices negativos:fonte