Você é encarregado de escrever um programa que silabifique palavras em uma sequência de texto, separando-as com um hífen. Isso daria muito trabalho, então você quer pular algumas partes, principalmente porque não deseja ter uma tabela com as pronúncias necessárias para um algoritmo perfeito. Você também deseja torná-lo o mais curto possível (e, portanto, ilegível e impossível de manter), como uma vingança por receber essa tarefa.
Você tem duas opções:
- Escreva um programa que retire a string de STDIN e envie o resultado para STDOUT.
- Escreva uma função que use a string como um único parâmetro e retorne o resultado.
Especificação
- Nesse caso, string significa qualquer construção semelhante a string no idioma de sua escolha (matrizes de bytes, matrizes de caracteres, strings ...).
- As vogais são
a, e, i, o, u
- A cadeia de caracteres fornecida possui
1 <= n <= 10
palavras, onde cada uma possui um comprimento entre1 - 30
caracteres, inclusive. Sua saída deve ser essas palavras hifenizadas. - Todas as letras são minúsculas e as palavras são sempre separadas por espaços. Assim, a entrada consiste em caracteres
[a-z ]
- Aplique regras em ordem de importância.
- Quando uma palavra é dividida, comece novamente com a metade direita da palavra.
Regras para silabificação , em ordem de importância
Dois mesmas vogais consecutivos contar como um (isto é. feet
Tem apenas uma vogal, mas beat
e finding
tem dois). Cada sílaba tem exatamente uma vogal, portanto, há uma sílaba para cada vogal.
- Se a palavra inteira tiver apenas quatro letras, retorne-a inalterada. (pule isso pelo resto da palavra)
- Se a palavra tiver apenas uma vogal, retorne a palavra inalterada.
- Se a palavra tiver duas vogais consecutivas, divida entre elas (por exemplo,
diaspora
->di-as-po-ra
) - Quando duas ou mais consoantes estiverem entre duas vogais (iguais ou diferentes), divida após a primeira consoante (ie.
sis-ter
), A menos que a parte da consoante sejack
, nesse caso, divida a palavra após ela. (ie.nickel
->nick-el
) - Quando a
y
aparecer entre duas vogais, divida a palavra depois dela (por exemplo,paying
->pay-ing
). - Quando uma consoante estiver entre duas vogais (iguais ou diferentes), divida antes da consoante (ou seja
dra-gon
) . - Retorne a palavra inalterada se nenhuma divisão puder ser feita.
Eu escolhi essas regras, porque elas podem ser aplicadas recursivamente sem problemas e não requerem tabelas de pronúncia. Portanto, eles não são precisos e, por exemplo, a regra 5 geralmente não está correta. Em geral, porém, é.
Exemplo
In: hello world
Out: hel-lo world
In: have a nice day
Out: have a nice day
In: pour some nickel and xenon there
Out: pour some nick-el and xe-non the-re
x-e-non
? Referência para a regra 4?lua
Respostas:
Ruby, 144 bytes
Se estamos indo para o impossível, que tal um único regex gigante?
alguma saída:
fonte
Lua, 292
Lua pode não ter sido a melhor linguagem para fazer isso, mas funciona. É praticamente como a pergunta. As regras estão principalmente em ordem com algumas otimizações: o número 2 é ignorado (não é necessário, a menos que exista uma palavra com uma vogal com "ck" no início), e as regras ck e y são implementadas antes do resto de # 4 e # 6, que são combinados. Como algumas vogais da palavra precisam ser capturadas duas vezes (após um hífen e antes de outro), essa pesquisa é realizada duas vezes.
Ungolfed
Teste aqui: http://ideone.com/g57TzA
fonte
Bash + coreultils, 173 bytes
Eu acho que tenho todas as alterações mais recentes das regras:
Observe que o último caractere da última linha é um
(espaço).
Eu acho que isso satisfaz suficientemente "ilegível e insustentável" ;-)
Recebe entrada de STDIN.
Substituição de regex principalmente direta. A primeira linha da
sed
expressão corresponde às regras 1 e 2 e simplesmente salta para o:x
rótulo no final da expressão.Os
tr
s no início e no final do pipeline tornam as palavras separadas por nova linha, para que sejam mais fáceis desed
lidar. Eu esperava fazer esed
responder todas , mas dessa maneira é mais simples e fácil.Exemplo:
fonte