fundo
Três anos atrás, esse cara, Tom Murphy, pensou em estender a idéia de um portmanteau a todas as palavras em um idioma e chamou isso de portmantout ( portmanteau plus tout [francês para todos ]). Definindo inglês como uma lista de 108.709 palavras, ele conseguiu encontrar uma sequência de 611.820 letras com as duas propriedades a seguir:
- Cada palavra em inglês está contida na string.
- Alguma vizinhança contendo duas letras adjacentes na sequência é uma palavra em inglês.
Aqui está um link para uma página na qual essa saída pode ser encontrada (junto com uma explicação em vídeo).
Um portmantout
A primeira das duas propriedades de um portmantout é fácil de entender. O segundo pode exigir alguma explicação.
Basicamente, as palavras devem se sobrepor. "golfcode" nunca aparecerá em um portmantout em inglês, pois não há nenhuma palavra que contenha o "fc". No entanto, você pode encontrar "codegolf" em um portmantout, pois "ego" preenche a lacuna (e todos os outros pares de letras estão em "code" ou "golf").
Sua tarefa:
Escreva um programa ou função que pegue uma lista de cadeias e retorne qualquer porta da lista.
Este código Python 3 verificará um portmantout.
Casos de teste
Todas as listas são desordenadas; isso é,
{"code", "ego", "golf"} -> "codegolf"
{"more", "elm", "maniac"} -> "morelmaniac" or "morelmorelmaniac" or "morelmorelmorelmaniac" or...
Would a morelmaniac be some sort of mycologist?
{"ab", "bc", "cd", "de", "ef", "fg", "gh", "hi", "ij", "jk", "kl", "lm", "mn", "no", "op", "pq", "qr", "rs", "st", "tu", "uv", "vw", "wx", "xy", "yz", "za"} -> "abcdefghijklmnopqrstuvwxyza" or "rstuvwxyzabcdefghijklmnopqrstuvwxyzabcdef" or any 27+ letters in order
E porque não? O massivo no site de Murphy, se o seu código for executado dentro de um prazo razoável.
Regras
- Seu código deve parar.
- Você não precisa retornar o mesmo portmantout a cada execução.
- Você pode assumir todas as cadeias consistem em apenas letras minúsculas
a
atravész
. - Se nenhuma portmantout for possível, seu programa poderá fazer qualquer coisa. Ex:
{"most", "short", "lists"}
- Aplicam-se regras padrão para E / S e brechas .
Isso é código-golfe , então a solução mais curta (em bytes) em cada idioma vence! Feliz golfe!
fonte
{"sic", "bar", "rabbits", "cradle"} -> "barabbitsicradle"
{"mauve", "elated", "cast", "electric", "tame"} -> "mauvelectricastamelated"
(mais casos de teste)Respostas:
Python 2 ,
204202 bytesExperimente online!
Salvou
fonte
["ab", "ba", "ca"]
. Minha solução tem o mesmo bug.Pitão, 39 bytes
Experimente aqui
Explicação
fonte
Stax ,
3936 bytesExecute e depure
Executa todos os casos de teste deterministicamente em cerca de um segundo.
Este é um algoritmo recursivo.
Aqui está o programa descompactado, não destruído e comentado.
Execute este
Editar: Isso falha para uma classe de entradas que possui um loop, como a
["ab", "ba", "ca"]
maioria das outras respostas postadas.fonte
JavaScript (ES6),
138130 bytesRetorna um erro para listas que não podem ser completamente desmanteladas.
Ungolfed:
Mostrar snippet de código
O código é terrivelmente lento no exemplo completo do alfabeto (não incluído por esse motivo no snippet acima).
Isso é corrigido alterando
map
s parasome
s, para a perda de 2 bytes:Mostrar snippet de código
fonte