Dado um arquivo de dicionário (um arquivo de texto contendo uma palavra ou frase em cada linha, com pontuação possível, mas sem números; as linhas são alfabetizadas), você deve exibir cada combinação de palavras em que uma letra pode ser removida de uma palavra para formar outra; a letra removida deve estar entre parênteses.
Por exemplo, a entrada
cat
cart
code
golf
ode
verify
versify
deve dar uma saída de
ca(r)t
(c)ode
ver(s)ify
Várias maneiras de obter o mesmo par devem ser exibidas apenas uma vez. Você pode produzir scra(p)ped
ou scrap(p)ed
, mas não ambos.
A saída deve ser ordenada alfabeticamente pela entrada mais longa;
mart
mar
mat
ma
deve ter uma saída de
ma(r)
ma(t)
ma(r)t
mar(t)
e os dois últimos podem estar em qualquer ordem.
O arquivo do dicionário pode incluir letras maiúsculas, espaços, hífens ou apóstrofos; estes devem ser ignorados. Por exemplo,
inlay
in-play
deve produzir in(p)lay
. Sua saída deve estar no mesmo caso. Espaço em branco extra é permitido.
A entrada pode ser STDIN ou de um arquivo; é separado por novas linhas. A saída pode ser o valor de retorno de uma função ou STDOUT (ou gravada em um arquivo, se você desejar).
Isso é código-golfe , então o código mais curto em bytes vence.
(Este é o meu primeiro desafio no PPCG - deixe-me saber se fiz algo errado e vou consertar.)
mart mar mat ma
? Seriamar(t) ma(r)t ma(r) ma(t)
?Respostas:
Perl -an0, 101 + 3 bytes
Onde
@F
é o dicionário, armazenado em uma matriz, fornecido pelo sinalizador de tempo de execução mágico. (b-oost, BoO # @% @ # $% $ # @ T)map{s/\W//g;lc}@F
remove todos os símbolos das palavras e transforma tudo em minúsculas. (impulso, inicialização)sort{length$b<=>length$a}
classifica em comprimento. (inicialização, aumento)map{ (...) while/(.)(?!\1)/g}@F
corresponde a todos os caracteres que não são seguidos pelo mesmo caractere ([b] oot, bo [o] t, boo [t], ...)print"$`($1)$'\n"
imprime as peças que precedem, entre parênteses e conseguem uma correspondência ... (vaia (s) t)if $`.$'~~@F
... se a concatenação de tudo antes e depois da partida estiver no dicionário. ([impulso])fonte
JavaScript (ES6), 225
Uma função com um parâmetro de sequência, sem entrada do arquivo. Perguntei à OP se isso poderia ser válido.
Teste a execução do snippet em um navegador compatível com EcmaScript 6 (implementando funções de seta, sequência de modelos, operador de propagação - Firefox, talvez Safari ou MS Edge, não Chrome)
fonte
Ruby, 173
Teste aqui: http://ideone.com/86avbe
Versão legível aqui: http://ideone.com/ynFItB
fonte
['jacklantern','jackslantern','jack-o-lantern']
ditado.The output should be ordered by the longer entry;
...and the latter two could be in either order.
Ruby, 211
Decidi adotar uma abordagem diferente para resolver isso, usando o regex.
fonte
Perl 5, 210
O código carrega a entrada em uma matriz classificada e verifica cada valor em relação a todos os valores da matriz com 1 byte a mais.
Teste
fonte
Haskell, 201 bytes
Não tenho certeza de qual formato de entrada é permitido.
f
pega uma lista de strings. Se apenas uma única string (com nl palavras separadas) for permitida, adicione.lines
af
(+6 bytes).Exemplo de uso:
Como funciona: coloque todas as palavras em minúsculas e mantenha apenas as letras. Divida cada palavra
x
em duas partes em todas as posições possíveis e faça triplos(i,j,k)
ondei
está a primeira parte,j
é o primeiro caractere da segunda parte ek
é a cauda da segunda parte. Mantenha os triplos ondei++k
também aparece na lista de palavras. Se esta lista não estiver vazia, pegue o primeiro elemento, chame-o(l,m,n)
. Transforme todas essas cabeças de lista no formato de saída desejado, envolvendom
-o()
e colocando-o entrel
en
.fonte