O sistema principal é um dispositivo mnemônico para converter números em palavras, para que possam ser memorizados mais facilmente.
É baseado em como as palavras soam foneticamente, mas para simplificar as coisas para o desafio, apenas nos preocuparemos com a forma como as palavras são escritas. Isso significa que haverá algumas conversões incorretas, mas tudo bem.
Para converter um número em uma palavra usando nosso sistema principal simplificado:
- Substitua cada um
0porsouz. (Alguns poderiam serse outros poderiam serz. O mesmo se aplica a seguir.)- Substitua cada um
1portoudouth.- Substitua cada um
2porn.- Substitua cada um
3porm.- Substitua cada um
4porr.- Substitua cada um
5porl.- Substitua cada um
6porjoushouch.- Substitua cada um
7porkoucougouq.- Substitua cada um
8porfouv.- Substitua cada um
9porpoub.- Adicione as letras
aehiouwxyem qualquer lugar, em qualquer quantidade, para formar uma palavra em inglês real, se possível .
A única exceção é quehnão pode ser inserido após umsouc.Na verdade, o número pode ser qualquer sequência de dígitos de 0 a 9 (sem decimais, vírgulas ou sinais).
A palavra pode conter apenas as letras minúsculas az.
Exemplos
O número 32deve ser convertido como ?m?n?, onde ?representa qualquer sequência finita feita a partir das letras aehiouwxy(uma sequência do monóide livre, se você preferir). Há muitas maneiras isso pode ser feito em uma palavra Inglês real: mane, moon, yeoman, etc.
O número 05pode ser convertido como ?s?l?ou ?z?l?. Algumas possibilidades são easily, hasslee hazel. A palavra shawlnão é permitida porque hnão pode ser colocada depois s; seria incorretamente lido como 65.
Desafio
Escreva um programa ou função que utilize uma sequência de dígitos de 0 a 9 e encontre todas as palavras nas quais ele pode ser convertido usando o mnemônico simplificado do sistema principal.
Seu programa tem acesso a um arquivo de texto da lista de palavras que define quais são todas as palavras "reais" em inglês. Há uma palavra az em minúscula em cada linha deste arquivo e, opcionalmente, você pode assumir que ela possui uma nova linha à direita. Aqui está uma lista de palavras reais que você pode usar para testar. Você pode assumir que esse arquivo de lista de palavras é chamado f(ou algo mais) e fica em qualquer diretório conveniente.
Para uma penalidade de 35 bytes (adicione 35 à sua pontuação), você pode assumir que a lista de palavras já está carregada em uma variável como uma lista de cadeias. Isso é principalmente para idiomas que não conseguem ler arquivos, mas qualquer envio pode tirar proveito dele.
Seu programa deve exibir todas as palavras da lista de palavras nas quais o número de entrada pode ser convertido. Eles devem ser impressos em stdout (ou similar), um por linha (com uma nova linha à direita opcional) ou podem ser retornados como uma lista de cadeias, se você optar por escrever uma função. A lista de palavras não é necessariamente alfabetizada e a saída também não precisa ser.
Se não houver palavras possíveis, a saída (ou a lista) estará vazia. A saída também está vazia se a sequência vazia for inserida.
Aceite a entrada via stdin, linha de comando ou como um argumento de string para uma função. A lista de palavras ou o nome do arquivo não deve fazer parte da entrada, apenas a sequência de dígitos.
Você está correspondendo apenas palavras únicas na lista de palavras, não seqüências de palavras. A palavra noonprovavelmente seria um dos resultados para 22, mas a sequência de palavras no onenão.
Casos de teste
Suponha que esta seja a lista de palavras:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
zdnmrlshchvb
sthnmrlchgvb
shthnmrlchgvb
bob
pop
bop
bopy
boppy
A entrada 0123456789deve conter todas as palavras longas, exceto zdnmrlshchvbe shthnmrlchgvb:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb
A entrada 99deve fornecer:
bob
pop
bop
bopy
(As palavras de saída podem estar em qualquer ordem.)
Pontuação
O menor envio em bytes vence. O desempatador vai para a submissão postada primeiro.