Introducción
A diferencia del inglés, se considera que el alemán tiene un sistema de escritura bastante fonémico . Eso significa que la correspondencia entre la ortografía y la pronunciación es cercana. Dada cualquier palabra con la que no estés familiarizado, aún sabrías cómo pronunciarla debido al sistema de ortografía. Esto significa que una computadora también debería poder hacerlo, ¿verdad?
Reto
Escriba un programa o función que tome como entrada una cadena que represente una palabra alemana, e imprima o devuelva su pronunciación en el alfabeto fonético internacional (IPA) .
Por supuesto, no voy a hacerte aprender alemán o el IPA completo . Esta sección de Wikipedia proporciona casi todas las reglas de alemán a IPA que necesita, y he codificado una implementación de referencia de C # sin golf .
También se proporciona en ese enlace una lista de 400 palabras comunes en alemán y su pronunciación IPA (necesaria para la validación). Tomando un ejemplo de esa lista, si la entrada es solltest
, la salida correcta es ˈzɔltəst
.
La implementación de referencia agrega dos reglas útiles que no se mencionan en la sección de Wikipedia: supone que el énfasis de la palabra está en la primera sílaba (muy probablemente en alemán), y utiliza una mejor heurística para determinar cuándo la letra "e" representa el sonido schwa / ə /. También implementa un procesamiento especial para prefijos, pero eso no mejoró los resultados tanto como pensé que lo haría.
Detalles
Para ser considerado una entrada válida, su programa debe cumplir con los siguientes requisitos:
- Su salida IPA debe ser una coincidencia exacta para al menos 300 de las 400 palabras en la lista de palabras de referencia (la implementación de referencia obtiene 333 correctas)
- Su programa debe adivinar cualquier palabra plausiblemente alemana. Por lo tanto, tenemos un requisito técnico, esto significa que para cualquier entrada que coincida con la expresión regular
[a-zA-ZäÄöÖüÜ][a-zäöüß]*
y tenga al menos una vocal (aeiouyäöü), debe producir una salida que no sea solo espacios en blanco y no eliminar errores. - El programa debe ser determinista (siempre produce la misma salida dada la misma entrada)
- De lo contrario, las lagunas estándar están prohibidas (especialmente la que se refiere a la obtención de recursos fuera del sitio)
Cosas varias que puedes hacer:
- Tenga espacios en blanco iniciales y finales en su salida si es necesario
- Use cualquier codificación de caracteres preexistente en la salida (no puedo imaginar que otra cosa que Unicode funcione bien, pero si puede, felicidades)
- Suponga que la entrada está en alguna forma normalizada, como las formas de normalización Unicode NFD, NFC, etc. Por ejemplo, ¿se escribe ä como un solo carácter o un carácter base + un carácter de combinación?
- Utilice métodos de entrada y salida estándar.
Puntuación y caracteres de IPA
La puntuación está en bytes. Tenga en cuenta que los caracteres alemanes y los caracteres IPA son de 2 bytes en UTF-8. Además, el carácter IPA U + 0327 COMBINANDO BREVE INVERTIDA ABAJO (̯) es un carácter de combinación Unicode y es un carácter UTF-8 de 2 bytes por sí solo. Eso significa que algo como ɐ̯ contaría como 4 bytes en UTF-8. Para los curiosos, este símbolo significa que la vocal no forma el núcleo de la sílaba (el anterior sí lo hace).
Además, tenga cuidado con estos caracteres IPA que en algunas fuentes se parecen a otros caracteres ASCII: ɡ, ɪ, ʏ, ː (marca una vocal larga), ˈ (marca qué sílaba tiene el énfasis en una palabra multisilábica).
Cómo se creó la lista de palabras de referencia
Esta sección es información adicional no necesaria para el desafío.
La lista de palabras se tomó de esta lista de frecuencia de palabras de Wiktionary , eliminando repeticiones debido a la diferencia de mayúsculas y dos palabras que no tenían entradas en alemán en el Wiktionary en inglés (oh y hey). La IPA fue de mirar los diccionarios de inglés y alemán. Cuando se ofrecieron múltiples pronunciaciones, elegí la más formal y estándar. Si esto no estaba claro, elegí el que más se ajustaba a las reglas generales.
También tuve que estandarizar cómo se pronuncia la letra "r". Depende en gran medida de la región cómo se pronunció esta letra, y Wiktionary no fue del todo consistente en cuál eligió. Sentí que tendía a lo siguiente: "r" se pronuncia / ɐ̯ / cuando es seguido por una vocal larga y una vocal no sigue, de lo contrario, es ʁ. Entonces, los cambié a todos para seguir esa regla, excepto los prefijos ver y er que eran bastante consistentes / (f) ɛɐ̯ /. Del mismo modo, estandaricé "eu" como / ɔʏ̯ /.
#~WordData~"PhoneticForm"&
), pero solo funciona para palabras en inglés.