introduction
Contrairement à l'anglais, l'allemand est considéré comme ayant un système d'écriture assez phonémique . Cela signifie que la correspondance entre l'orthographe et la prononciation est proche. Si vous connaissez un mot que vous ne connaissez pas, vous sauriez quand même le prononcer à cause du système orthographique. Cela signifie qu'un ordinateur devrait être capable de le faire aussi bien?
Défi
Ecrivez un programme ou une fonction prenant en entrée une chaîne représentant un mot allemand, puis imprimant ou renvoyant sa prononciation dans l' alphabet phonétique international (IPA) .
Je ne vais bien sûr pas vous faire apprendre l'allemand ou l'IPA complète . Cette section Wikipedia contient presque toutes les règles allemandes à IPA dont vous avez besoin, et j'ai codé une implémentation de référence C # non golfée .
Ce lien contient également une liste de 400 mots allemands courants et leur prononciation IPA (nécessaires à la validation). En prenant un exemple de cette liste, si l'entrée est solltest
, le résultat correct est ˈzɔltəst
.
L'implémentation de référence ajoute deux règles utiles non mentionnées dans la section Wikipedia: Elle suppose que le mot accentue se trouve sur la première syllabe (très probablement en allemand) et utilise une meilleure heuristique pour déterminer quand la lettre "e" représente le son schwa / ə /. Il implémentait également un traitement spécial pour les préfixes, mais cela n'améliorait pas les résultats autant que je ne le pensais.
Détails
Pour être considéré comme une entrée valide, votre programme doit remplir les conditions suivantes:
- Votre sortie IPA doit correspondre exactement à au moins 300 des 400 mots de la liste des mots de référence (la mise en œuvre de référence obtient 333 correct)
- Votre programme doit deviner tous les mots vraisemblablement allemands. Nous avons donc une exigence technique: cela signifie que pour toute entrée qui correspond à la regex
[a-zA-ZäÄöÖüÜ][a-zäöüß]*
et qui a au moins une voyelle (aeiouyäöü), vous devez produire une sortie ne contenant pas d’espace, et non une sortie d’erreur. - Le programme doit être déterministe (toujours produire la même sortie pour la même entrée)
- Autrement, les échappatoires standard sont interdites (en particulier celle concernant l'extraction de ressources hors site)
Diverses choses que vous êtes autorisé à faire:
- Avoir des espaces de début et de fin dans votre sortie si vous devez
- Utilisez n'importe quel encodage de caractères préexistant dans la sortie (je ne peux pas imaginer autre chose qu'un Unicode fonctionnant bien, mais si vous le pouvez, félicitations)
- Supposons que l'entrée se présente sous une forme normalisée telle que les formes de normalisation Unicode NFD, NFC, etc. Par exemple, ä est-il écrit sous la forme d'un seul caractère ou d'un caractère de base + d'un caractère de combinaison?
- Utiliser des méthodes d' entrée et de sortie standard
Scoring & IPA Characters
La notation est en octets. Soyez averti que les caractères allemands et les caractères IPA sont 2 octets en UTF-8. De plus, le caractère IPA U + 0327 COMBINAISON DE BREVE INVERTED BELOW (̯) est un caractère de combinaison Unicode et est un caractère UTF-8 de 2 octets. Cela signifie que quelque chose comme compterait comme 4 octets dans UTF-8. Pour les curieux, ce symbole signifie que la voyelle ne forme pas le noyau de la syllabe (la précédente le fait).
Méfiez-vous également de ces caractères IPA qui, dans certaines polices, ressemblent à d'autres caractères ASCII: ɡ, ɪ, ʏ, v (marque une longue voyelle), (marque quelle syllabe est accentuée dans un mot multisyllable).
Comment la liste de mots de référence a été créée
Cette section contient des informations supplémentaires non nécessaires pour le défi.
La liste de mots a été extraite de cette liste de fréquences de mots Wiktionnaire , en supprimant les répétitions à cause de la différence de casse et de deux mots sans entrées en allemand dans le Wiktionnaire anglais (oh & hey). L’IPA a examiné les Wiktionnaires anglais et allemands. Lorsque plusieurs prononciations étaient proposées, j'ai choisi la plus formelle et la plus standard. Si ce n'était pas clair, j'ai choisi celui qui correspond le mieux aux règles générales.
Je devais aussi normaliser la prononciation de la lettre "r". La façon dont cette lettre a été prononcée dépend fortement de la région, et le Wiktionnaire n’a pas du tout été cohérent. Je sentais que cela tendait à ce qui suit: "r" est prononcé / ɐ̯ / suivi d’une voyelle longue et une voyelle ne suit pas, sinon c’est. Je les ai donc tous modifiés pour suivre cette règle, à l'exception des préfixes ver et er qui étaient assez cohérents / (f) ɛɐ̯ /. De même, j'ai normalisé "eu" comme / ɔʏ̯ /.
la source
#~WordData~"PhoneticForm"&
), mais cela ne fonctionne que pour les mots anglais.Réponses:
PHP,
331129882916284527592671266725092484 octets, passant 301/400Définit
pronounce(string $word)
.Usage:
Une remarque: 3 préfixes et 33 mots sont codés en dur, et une partie du code est légèrement optimisée pour la liste de test.
Le code de test est là , bien que cela dépende de ce fichier .
Tester:
Propulsé par les larmes des déclarations ternaires.
EDIT 7 : Supprimez ~ 170 octets en écrivant un pré-processeur dans le programme. En conséquence, le programme actuel (tout après
__halt_compiler();
) est un peu difficile à lire. Si vous voulez que le programme non traité, passereval
avecprint
la troisième déclaration.la source