O maior fórum da web, chamado pós-contagem ++, decidiu criar um novo jogo no fórum. Neste jogo, o objetivo é postar a palavra, mas a palavra precisa ter uma letra adicionada, removida ou alterada. Seu chefe queria que você escrevesse um programa que recebesse a palavra e o dicionário UNIX, enquanto trabalha para uma empresa que possui um fórum mais inteligente com jogos mais inteligentes e deseja destruir a concorrência (ei, é seu chefe, não discuta com ele, você recebe muito dinheiro do seu trabalho).
Seu programa receberá dois argumentos, a palavra e o dicionário. Como o usuário que gerencia o programa (sim, um usuário, sua empresa não possui recursos para executar bots) não é perfeito, você deve normalizar o caso em ambos. As palavras no dicionário podem ter letras ASCII (maiúsculas e minúsculas, mas devem ser ignoradas durante a comparação), traços, apóstrofes e espaços não consecutivos no meio. Eles não terão mais de 78 caracteres. Você precisa produzir uma lista de palavras que seriam aceitas no jogo, para acabar com a diversão das pessoas que pensam nas palavras manualmente.
Este é um exemplo do seu programa esperado, verificando palavras semelhantes a golf
.
> ./similar golf /usr/share/dict/words
Goff
Wolf
gold
golfs
goof
gulf
wolf
A /usr/share/dict/words
é uma lista de palavras, com quebra de linha após cada uma. Você pode ler isso facilmente com fgets (), por exemplo.
A empresa em que você trabalha não possui muitos cartões perfurados (sim, é 2014 e eles ainda usam cartões perfurados), portanto, não os desperdice. Escreva o programa mais curto possível. Ah, e você foi solicitado a não usar implementações internas ou externas da distância de Levenshtein ou qualquer algoritmo semelhante. Algo sobre Não inventado aqui ou backdoors que aparentemente o fornecedor inseriu no idioma (você não tem provas disso, mas não discute com seu chefe). Portanto, se você quiser distância, terá que implementá-la você mesmo.
Você é livre para usar qualquer idioma. Mesmo com cartões perfurados, a empresa tem acesso às mais modernas linguagens de programação, como Cobol Ruby ou Haskell ou o que você quiser. Eles até têm GolfScript, se você acha que é bom para manipulação de strings (talvez eu não saiba ...).
O vencedor recebe 15 pontos de reputação de mim e provavelmente muitos outros pontos da comunidade. As outras boas respostas receberão 10 pontos e pontos da comunidade também. Você ouviu dizer que os pontos são inúteis, mas provavelmente substituirá os dólares em 2050. No entanto, isso não foi confirmado, mas é uma boa ideia obter pontos de qualquer maneira.
Respostas:
GolfScript, 59 caracteres
Claro, o GolfScript é ótimo para manipulação de strings!
O que o GolfScript não é tão bom é lidar com E / S de arquivo ou com argumentos de linha de comando. Portanto, este programa espera receber toda a sua entrada via stdin: a primeira linha que não estiver em branco é considerada a palavra de destino, enquanto as linhas restantes devem conter o dicionário. Em um sistema Unixish, você pode executar este código, por exemplo, com:
Na minha caixa do Ubuntu Linux, a saída do comando acima é:
Observe que todas as palavras são convertidas em minúsculas e as duplicatas são eliminadas; portanto, diferente da sua saída de amostra, a minha não lista
Wolf
ewolf
separadamente. Com base na descrição do seu desafio, presumo que isso seja aceitável.Além disso, o código é realmente lento, pois usa uma abordagem de força bastante bruta e não usa otimizações óbvias, como verificar se o comprimento da palavra candidata corresponde ao da palavra-alvo ± 1. Ainda assim, ele consegue ir através da
/usr/share/dict/words
lista completa, não filtrada, em ... um ... Eu avisarei quando terminar, ok?Edit: OK, demorou cerca de 25 minutos, mas terminou.
fonte
Bash + coreutils, 99 bytes
Ou eu entendi totalmente a pergunta ( a resposta de @ lambruscoAcido fornece resultados muito diferentes ) ou esta é uma aplicação regexp bastante direta:
Resultado:
fonte
${a:b:c}
fazer?b
parac
a variávela
c
começando na posiçãob
(com base em zero) da variávela
. A expansão de substring é um dos expansões de parâmetro bashPython 3, 291 caracteres
Muito simples e, portanto, não muito inteligente. Mas com um emaranhado gostoso de gerador e lentidão otimizada. Como você não deseja deixar o tempo de computação alocado sem uso, não é?
fonte
l=len
er=range
reduzir ainda mais essas funções.Scala -
403130[Atualizado]: completamente atualizado porque a solução anterior também permitia letras permutadas. Não usa regex ou nenhuma ferramenta interna.
Ungolfed:
Uso:
fonte
atechny
não muda uma letra. Esta solução faz algo não relacionado à pergunta.Python, 174 caracteres:
Rápido e direto ao ponto.
Exemplo:
Resultado:
Suponho que o arquivo de palavras do OS X tenha apenas mais entradas.
fonte
golf'
.golf'
, ele será impresso.Haskell - 219
fonte
Rebol - 213
Ungolfed (com alguns comentários):
Exemplo de uso (testado no Rebol 3 no OS X Lion):
Abaixo está a
parse
regra criada para corresponder a palavras semelhantes ao golfe :fonte
Python (103):
Bastante eficiente, eu acho. Além disso, eu gosto de quão bem isso foi no golfe em Python.
fonte