Introdução
Ao contrário do inglês, o alemão é considerado como tendo um sistema de escrita fonêmica . Isso significa que a correspondência entre ortografia e pronúncia está próxima. Dada qualquer palavra com a qual você não esteja familiarizado, você ainda saberia pronunciá-la por causa do sistema de ortografia. Isso significa que um computador deve ser capaz de fazê-lo também, certo?
Desafio
Escreva um programa ou função que tenha como entrada uma string que representa uma palavra alemã e imprima ou retorne sua pronúncia no Alfabeto Fonético Internacional (IPA) .
É claro que não vou fazer você aprender alemão ou o IPA completo . Esta seção da Wikipedia fornece quase todas as regras de alemão para IPA que você precisa, e eu codifiquei uma implementação de referência C # não-destruída .
Também é fornecida nesse link uma lista de 400 palavras comuns em alemão e sua pronúncia do IPA (necessária para validação). Tomando um exemplo dessa lista, se a entrada for solltest
, a saída correta é ˈzɔltəst
.
A implementação de referência adiciona duas regras úteis não mencionadas na seção da Wikipedia: Pressupõe que o estresse das palavras esteja na primeira sílaba (provavelmente em alemão) e usa uma heurística melhor para determinar quando a letra "e" representa o som schwa / ə /. Também implementa processamento especial para prefixos, mas isso não melhorou os resultados tanto quanto eu pensava.
Detalhes
Para ser considerada uma entrada válida, seu programa deve atender aos seguintes requisitos:
- Sua saída IPA deve corresponder exatamente a pelo menos 300 das 400 palavras na lista de palavras de referência (a implementação de referência fica 333 correta)
- Seu programa deve adivinhar qualquer palavra plausivelmente alemã. Portanto, temos um requisito técnico, isso significa que, para qualquer entrada que corresponda ao regex
[a-zA-ZäÄöÖüÜ][a-zäöüß]*
e tenha pelo menos uma vogal (aeiouyäöü), você deve produzir uma saída que não seja somente em espaço em branco e não com erros. - O programa deve ser determinístico (sempre produza a mesma saída com a mesma entrada)
- Caso contrário, as brechas padrão são proibidas (especialmente a que consiste em buscar recursos externos)
Coisas diversas que você pode fazer:
- Tenha um espaço em branco à esquerda e à esquerda na sua saída, se necessário
- Use qualquer codificação de caracteres pré-existente na saída (não consigo imaginar nada além de Unicode funcionando bem, mas, se puder, parabéns)
- Suponha que a entrada esteja em alguma forma normalizada, como as formas de normalização Unicode NFD, NFC, etc. Por exemplo, ä é escrito como um único caractere ou um caractere base + um caractere combinado?
- Use métodos padrão de entrada e saída
Pontuação e caracteres IPA
A pontuação está em bytes. Esteja avisado de que os caracteres alemães e IPA têm 2 bytes em UTF-8. Além disso, o caractere IPA U + 0327 COMBINANDO INFERNO ABAIXO (̯) é um caractere de combinação Unicode e é um caractere UTF-8 de 2 bytes por si só. Isso significa que algo como ɐ̯ contaria como 4 bytes em UTF-8. Para os curiosos, esse símbolo significa que a vogal não forma o núcleo da sílaba (o anterior forma).
Além disso, tenha cuidado com esses caracteres IPA que, em algumas fontes, se parecem com outros caracteres ASCII: ɡ, ɪ, ʏ, ː (marca uma vogal longa), ˈ (marca a sílaba que tem o estresse em uma palavra multissílaba).
Como a lista de palavras de referência foi criada
Esta seção é uma informação extra não necessária para o desafio.
A lista de palavras foi retirada desta lista de frequência de palavras do Wikcionário , removendo repetições por causa da diferença de maiúsculas e minúsculas e duas palavras que não tinham entradas em alemão no Wikcionário em inglês (oh, ei). O IPA foi analisando os Wikcionários inglês e alemão. Onde várias pronúncias eram oferecidas, eu escolhi a mais formal e padrão. Se isso não estava claro, escolhi aquele que mais se encaixava nas regras gerais.
Eu também tive que padronizar como a letra "r" é pronunciada. É fortemente dependente da região como esta carta se pronunciou, e o Wikcionário não foi de modo algum consistente em qual delas escolheu. Eu senti que tendia ao seguinte: "r" é pronunciado / ɐ̯ / quando seguido por uma vogal longa e uma vogal não segue, caso contrário, é ʁ. Então, mudei todos eles para seguir essa regra, exceto os prefixos ver e er que eram consistentemente consistentes / (f) ɛɐ̯ /. Da mesma forma, eu padronizei "eu" como / ɔʏ̯ /.
fonte
#~WordData~"PhoneticForm"&
), mas funciona apenas para palavras em inglês.Respostas:
PHP,
331129882916284527592671266725092484 bytes, passando 301/400Define
pronounce(string $word)
.Uso:
Uma observação: três prefixos e 33 palavras são codificados e um pouco do código é levemente otimizado para a lista de testes.
O código de teste está aqui , embora dependa desse arquivo .
Testar:
Alimentado pelas lágrimas de declarações ternárias.
EDIT 7 : Espremido ~ 170 bytes, escrevendo um pré-processador no programa. Como conseqüência, o programa atual (tudo depois
__halt_compiler();
) é meio difícil de ler. Se você deseja o programa não processado, alterneeval
comprint
na terceira instrução.fonte