O trocador de palavras é um jogo em que você está tentando transformar uma palavra em outra através de edições de um único caractere, sendo cada etapa sua própria palavra. Para esse desafio, as edições podem ser substituições, inserções ou exclusões. Por exemplo, WINNER → LOSER pode ser feito com esta rota (pode haver outras):
WINNER
DINNER
DINER
DINE
LINE
LONE
LOSE
LOSER
Em outro sentido, você deve conseguir alcançar uma palavra da outra, passando apenas por outras palavras a uma distância de Levenshtein de 1 a cada vez.
Codificação
Você receberá uma lista de palavras e duas palavras e deverá gerar uma rota válida de uma palavra para outra se existir uma rota ou um valor constante distinto ou um comportamento consistente se não houver uma rota.
- Você pode assumir que as palavras de entrada estão na lista de palavras
- A lista de palavras pode ser obtida através de qualquer formato plano conveniente.
- Listas, conjuntos, tentativas, seqüências separadas por espaço e arquivos separados por linha são todos válidos (por exemplo), mas um gráfico pré-calculado da adjacência de Levenshtein não é.
- A rota de saída deve incluir as duas palavras de entrada, mas que começa e termina não importa.
- Se nenhuma rota for encontrada, você poderá gerar uma constante específica, um valor falso, uma lista vazia, lançar uma exceção, sair com um código diferente de zero ou qualquer outro comportamento que ocorra em tempo finito.
- A rota não precisa ser ótima e não há exigência de qual rota deve ser seguida.
- A complexidade computacional não importa, no entanto, seu programa deve ter a garantia de término em um período finito de tempo. (mesmo que fosse além da morte por calor do universo)
- Você pode assumir que todas as palavras são compostas inteiramente de letras no mesmo caso
Casos de teste de exemplo
- CAT → CÃO; [CAT, CÃO, COG, COT, SAPO, GRÃO, BOG]
- GATO, COT, COG, CÃO
- BANHO → CHUVEIRO; [BANHO, CHUVEIRO, CHAPÉU, CHAPÉU, BAT, SAT, SERRA, SOW, MOSTRA, COMO]
- Nenhuma rota encontrada
- BREAK → CORRIGIR; .
- QUEBRA, PÃO, CARGA, RUIM, FAD, FAX, CORRIGIR
- CONSTRUIR → DESTRUIR; [CONSTRUIR, DESTRUIR, CONSTRUIR, CULPAR, CULPA, GILD, GILL, BILL, DILL, PILL, Preencher, DESTRUIR, ESTRUTURA, CONSTRUIR]
- Nenhuma rota encontrada
- CARTÃO → PLACA; [CARTÃO, PLACA, BARRA]
- CARTÃO, BARBA, PLACA
- DEMÔNIO → ANJO; [Demônio, anjo]
- Nenhuma rota encontrada
- ÚLTIMO → PASSADO; [ÚLTIMO, PASSADO, EXPLOSÃO, MOLDE, PRETO, FANTASMA, PÓS, BOAST]
- ÚLTIMO, PASSADO
- INSERIR → EXCLUIR; Esta lista de palavras
- INSERIR, INVERSAR, INVENTAR, INVENTAR, INVENTAR, DESVENDAR, DESVENDER, DESENVOLVER, DESBATAR, INKING, IRKING, SUBIR, ESCURECER, ESCREVER, ARLING, PRESTAR, SIRING, SERING, SERINE, NERINE, NERITE, CERITE, CERETE, DERTE EXCLUIR
code-golf
string
decision-problem
Beefster
fonte
fonte
Respostas:
05AB1E ,
232120 bytesImprime uma lista de rotas válidas.
Economizou 2 bytes graças a Kevin Cruijssen .
Experimente online!
fonte
Dævyœ«}
para怜€`
. (Não sei por que ambos os mapas separadamente com€
obras bem, masæεœ`}
não btw, mas é o mesmo byte-count de qualquer maneira.)[]
é em1
vez de0
(não é tão surpreendente, porém) ou que uma verificação igual com uma lista vazia aparentemente resulta em uma lista vazia em vez de0
(essa eu vejo como um bug ..) .. Caso contrário, você poderia ter combinado o filtro e localize_primeiro para salvar outro byte:怜€`.Δü.LPy¬²Qsθ³QP
€
. Eu acho que a verificação igual resulta em uma lista vazia devido à vetorização. Talvez deva haver um caso especial para a lista vazia, mas talvez isso seja inesperado em outros casos.JavaScript (V8) ,
177176 bytesToma entrada como
(target)(source, list)
. Imprime todas as rotas possíveis. Ou imprime nada se não houver solução.Experimente online!
Comentado
fonte
Wolfram Language (Mathematica) , 59 bytes
Experimente online!
fonte
Python 2 , 155 bytes
Experimente online!
Leva duas palavras e um conjunto de palavras como entrada; retorna uma rota (não ótima) se existir como uma lista de cadeias, caso contrário, retorna False.
Este fragmento:
é
True
se e somente sea==w
oua
tem Levenshtein distância de1
partirw
.fonte
Wolfram Language (Mathematica) , 124 bytes
Experimente online!
fonte
Python 2 , 163 bytes
Se uma rota for encontrada, ela será enviada para o stderr e o programa sairá com o código de saída 1.
Se não houver uma rota, não haverá saída e o programa será finalizado com o código de saída 0.
Experimente online!
fonte
Python 3 ,
217214212201 bytes-11 bytes thanx a uma dica do xnor
Experimente online!
fonte
Gelatina , 38 bytes
Experimente online!
Um programa completo que aceita três argumentos. A primeira é a palavra inicial e é fornecida como
[["START"]]
. O segundo argumento é a palavra final, fornecida como"END"
. O terceiro argumento é a lista de palavras, fornecida como palavras entre aspas e separadas por vírgula.O programa retorna uma lista de listas, com cada lista representando um caminho válido do início ao fim. Se não houver uma rota válida, a resposta será uma lista vazia.
No link TIO, há um texto de rodapé para exibir o resultado com cada palavra separada por espaços e cada lista de palavras separadas por novas linhas. Se uma impressão subjacente à representação da lista for preferida, isso pode ser feito como
ÇŒṘ
.Ao contrário do 05ABIE, não há nenhum recurso interno para a distância de Levenshtein, então este programa compara outfixes com um único caractere ausente, um pouco semelhante à solução do @ ChasBrown , embora com um toque de geléia.
Explicação
Link auxiliar: link monádico que pega uma lista de palavras e retorna uma lista de possíveis listas estendidas ou uma lista vazia se nenhuma outra extensão for possível
Link principal
fonte
Swift 4.2 / Xcode 10.2.1 , 387 bytes
Experimente online!
fonte