Aqui está um para todos os que você ama por aí! Escreva um programa ou função que pegue uma lista de palavras e produza uma lista de todas as decomposições concatenativas possíveis para cada palavra. Por exemplo:
(Nota: esta é apenas uma pequena amostra para fins ilustrativos. A produção real é muito mais volumosa.)
afterglow = after + glow
afterglow = aft + erg + low
alienation = a + lie + nation
alienation = a + lien + at + i + on
alienation = a + lien + at + ion
alienation = alien + at + i + on
alienation = alien + at + ion
archer = arc + her
assassinate = ass + as + sin + ate
assassinate = ass + ass + in + ate
assassinate = assassin + ate
backpedalled = back + pedal + led
backpedalled = back + pedalled
backpedalled = backpedal + led
goatskin = go + at + skin
goatskin = goat + skin
goatskin = goats + kin
hospitable = ho + spit + able
temporally = tempo + rally
windowed = win + do + wed
windowed = wind + owed
weatherproof = we + at + her + pro + of
yeasty = ye + a + sty
Ok, você entendeu a ideia. :-)
Regras
- Use qualquer linguagem de programação de sua escolha. O código mais curto por contagem de caracteres para cada idioma vence. Isso significa que há um vencedor para cada idioma usado. O vencedor geral será simplesmente o código mais curto de todos os inscritos.
- A lista de entrada pode ser um arquivo de texto, entrada padrão ou qualquer estrutura de lista fornecida pelo seu idioma (lista, matriz, dicionário, conjunto, etc.). As palavras podem ser em inglês ou em qualquer outro idioma natural. (Se a lista for em inglês, convém ignorar ou pré-filtrar itens de uma letra, exceto "a" e "i". Da mesma forma, em outros idiomas, você deverá ignorar itens sem sentido, se eles aparecer no arquivo.)
- A lista de saída pode ser um arquivo de texto, saída padrão ou qualquer estrutura de lista usada pelo seu idioma.
- Você pode usar qualquer dicionário de entrada que desejar, mas provavelmente desejará usar um que forneça palavras sensíveis, em vez de um que forneça muitas palavras obscuras, misteriosas ou obnubiladas. Este é o arquivo que eu usei: A lista de sabugo de milho com mais de 58000 palavras em inglês
Questões
Esse desafio é principalmente sobre escrever o código para realizar a tarefa, mas também é divertido analisar os resultados ...
- Quais subpalavras ocorrem com mais frequência?
- Que palavra pode ser decomposta no maior número de subpalavras?
- Que palavra pode ser decomposta das maneiras mais diferentes?
- Quais palavras são compostas das maiores subpalavras?
- Que decomposições você achou mais divertidas?
code-golf
string
natural-language
Todd Lehman
fonte
fonte
alienation
quando recortei e colei. Corrigido agora. Em termos dos outros, a lista acima é apenas uma pequena amostra. Meu programa de teste gerou dezenas de milhares de respostas quando recebida a lista de sabugo de milho.Respostas:
Python 186
Não é particularmente eficiente, mas na verdade não é muito lento. É ingênuo (suponho que seja possível, embora eu ache improvável que o python faça algumas otimizações inteligentes) verifica se as subpalavras estão no dicionário da espiga de milho e encontra recursivamente o máximo de palavras possível. É claro que este dicionário é bastante extenso e você pode tentar um que não inclua várias abreviações e acrônimos (levando a coisas como
bedridden: be dr id den
). Além disso, o dicionário vinculado não parecia ter 'A' ou 'I' listado como palavras, então eu as adicionei manualmente.Editar:
Agora, a primeira entrada é o nome do arquivo do dicionário a ser usado, e cada entrada adicional é uma palavra.
fonte
print f
deveria serprint(f)
echo archer|python2 filename.py
gera um EOFError para a última linhafor f in W(raw_input()):print f
=>''.join(W(raw_input())
;a=open('c').read().split('\n')
=>a=open('c').readlines()
readlines
os caracteres de nova linha no final das linhas, e é por isso que eu fiz isso como fiz.join
exige que todos os elementos sejam strings e não consigo obtê-lo em uma forma menor do que o que já tenho.Cobra - 160
Essa é uma função (que classifica duas funções) que recebe um
List<of String>
* e imprime as strings que contêm os possíveis arranjos de sub-palavras para cada string na lista de argumentos.* o tipo é realmente
List<of dynamic?>
, mas fornecer algo diferenteList<of String>
provavelmente irá quebrá-lo.fonte
Scala,
132129Edit: ligeiramente mais curto como uma leitura de loop do stdin do que uma função
correr como
(ou use uma lista de palavras mais longa :))
Original:
Função de Seq [String] para Seq [Seq [List [String]]]. Leva o dicionário como os argumentos da linha de comando.
Ungolfed:
A abordagem é gerar todas as listas possíveis de substrings e filtrar as que contêm uma string que não está no dicionário. Observe que algumas das substrings geradas contêm uma string vazia extra, presumo que a string vazia não esteja no dicionário (não há como passar a linha de comando de qualquer maneira).
fonte