Sí, básicamente eres un romanizador, bebé , pero más difícil . como, mucho más difícil.
Aprender coreano es DURO. al menos para una persona fuera de Asia. Pero al menos tienen la oportunidad de aprender, ¿verdad?
Lo que debes hacer
Se le dará una declaración coreana. Por ejemplo, 안녕하세요
. Debe convertir la entrada a su pronunciación romana. Para el ejemplo dado, la salida puede ser annyeonghaseyo
.
Ahora se pone técnico
Un carácter coreano tiene tres partes: consonante inicial, vocal y consonante final. La consonante final puede no existir en el carácter.
Por ejemplo, 아
es ㅇ
(consonante inicial) y ㅏ
(vocal), y 손
es ㅅ
(consonante inicial), ㅗ
(vocal) y ㄴ
(consonante final).
Evert consonante y vocal tiene su pronunciación. La pronunciación de cada consonante es la siguiente.
Korean ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ
Romanization Starting g kk n d tt r m b pp s ss – j jj ch k t p h
Ending k k n t – l m p – t t ng t – t k t p h
(- significa que no hay pronunciación o que no se utiliza. No tiene que manejarlos).
y la pronunciación de cada vocal es la siguiente.
Hangul ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ
Romanization a ae ya yae eo e yeo ye o wa wae oe yo u wo we wi yu eu ui i
Ahora es la parte realmente difícil
La pronunciación de la consonante cambia por la consonante final en antes. La pronunciación de cada consonante inicial / final es la siguiente imagen. (No tiene que hacer el guión entre las pronunciaciones. Es innecesario. Si una celda tiene dos o más pronunciaciones, elija una. Si no hay una consonante final, use la pronunciación original).
Ejemplos
Korean => English
안녕하세요 => annyeonghaseyo
나랏말싸미 듕귁에달아 => naranmalssami dyunggwigedara //See how the ㅅ in 랏 changes from 't' to 'n'
Sugerencia de ejemplo bienvenida. Puede obtener respuestas para sus propias entradas aquí . (El que está en "Texto general", Revisado es lo que estoy pidiendo)
fuente
ㅎ
seguidosㄱ, ㄷ, ㅈ
también son casos especiales (que se aspiran aㅋ, ㅌ, ㅈ
(k, t, j)) también deberían resaltarse.Respuestas:
Python 3.6,
400394 bytesEditar: Gracias a RootTwo por -6 bytes.
Esta es mi primera presentación en CodeGolf, así que estoy bastante seguro de que hay mejores formas de jugarlo, pero pensé que aún lo publicaría, ya que nadie ha mencionado la idea clave todavía, y esto es significativamente más corto que otras soluciones .
Cómo funciona
La solución intenta explotar el hecho (que aprendí del desafío de romanización japonés original) de que los nombres de caracteres romanizados son accesibles a través del módulo unicodedata de Python. Para el idioma coreano, toman la forma de
HANGUL SYLLABLE <NAME>
. Desafortunadamente, procesar estos nombres para cumplir con la especificación provista y para cubrir todos los escenarios de combinación de sílabas aún requiere bastante esfuerzo (y bytes).Los nombres de caracteres obtenidos enumeran todas las consonantes en su forma sonora en cualquier parte de la sílaba, por ejemplo,
GGAGG
for깎
,R/L
se transcriben según lo previsto (inicioR
, finalizaciónL
) yCH
se dan comoC
(esto realmente nos ahorra un poco de dolor de cabeza).En primer lugar, eliminamos la
HANGUL SYLLABLE
parte (primeros 16 caracteres), marcamos los límites de las sílabas con-
, y luego aplicamos una serie de RegEx'es para hacer las conversiones.El primer RegEx parece particularmente desagradable. Lo que básicamente hace es convertir las consonantes iniciales en sus equivalentes finales (también eliminando la letra extra en caso de consonantes dobles), cuando no están seguidas de una vocal, o para algunas letras, cuando están precedidas por
h
. El(?<!n)
lookbehind evita la coincidencia,g
que es parte deng
, y(?!\\1)
lookahead asegura que no se conviertan, por ejemplo,ssa
atsa
.Los siguientes RegEx'es convierten las consonantes dobles iniciales en sus equivalentes sordos. Aquí es donde los
-
separadores también son útiles ya que ayudan a discernir colisiones de límites (g-g
) de consonantes dobles (gg
). Ahora también se pueden eliminar.A continuación, manejamos las
h+consonant
combinaciones restantes ,l->r
antes de las vocales y otros casos especiales.Por último, restauramos
c
ach
, y resolver algunas otras peculiaridades de nuestros nombres Char entrante, comoyi
lugar deui
yweo
en lugar dewo
.No soy un experto en coreano y no puedo comentar mucho más, pero parece que pasa todas las pruebas publicadas en la tarea y en Github. Obviamente, se podrían eliminar unos pocos bytes más, si la salida es aceptable en mayúsculas, ya que esto es lo que obtenemos de la función de nombre.
fuente
m[0]
es lo mismo quem.group(0)
; ahorrando 6 bytes.JavaScript (ES6), 480 bytes (WIP)
Este es un intento temprano basado en las especificaciones actuales para hacer rodar la pelota. Puede requerir un poco de corrección cuando se abordan las preguntas en los comentarios.
Casos de prueba
Mostrar fragmento de código
¿Cómo?
Una vez descomprimido, la matriz V contiene los siguientes datos:
Dividimos cada carácter de Hangul en consonante inicial, vocal y consonante final. Anexamos al resultado:
V[80 + substitution] + V[vowel]
si hay una sustituciónV[40 + previousEndingConsonant] + V[21 + startingConsonant] + V[vowel]
de otra manerafuente
'!'
puede ser33
?c
no es un byte. Es una cadena de 1 carácter. Dicho esto , cuando se aplica una operación aritmética, se coacciona un espacio0
mientras se coaccionan otros caracteres que no son dígitosNaN
. Lo que significa que enc<1
realidad debería funcionar como se esperaba. (Yc<33
también funcionaría para caracteres que no sean dígitos, aunque esto es algo fortuito).c<1
también sería cierto para"0"
(lo que probablemente está bien si se garantiza que la entrada no contenga ningún número arábigo).Tcl, 529 bytes
Algoritmo
Este algoritmo está desarrollado para los propósitos del desafío; La compensación es que se supone que la entrada no contiene caracteres alfabéticos latinos, ni que usa caracteres fuera del bloque Hangul U + AC00 como se describe en el desafío. Si este código real, mantendría todas las transformaciones en Jamo hasta el último pase.
Supongo que podría arrojar un poco más de capacidad mental para hacer crujir esas vocales y algunas de las repeticiones en la tabla de búsqueda, pero esto es tan bueno como lo obtengo hoy.
Pruebas
Asegúrese de que puede proporcionar la entrada UTF-8 al intérprete Tcl. Esto se logra más fácilmente con un simple archivo de texto UTF-8. Por desgracia, Tcl todavía no usa UTF-8 por defecto; Esto me costó 33 bytes.
Aquí está mi archivo de prueba (actualmente patético):
Notas
No sé nada sobre el idioma coreano (excepto lo poco que he aprendido aquí). Este es un primer intento, pendiente de revisión potencial debido a actualizaciones en la especificación de la pregunta.
Y, sobre eso, alguna información adicional es útil. En particular, no hay una correspondencia 1: 1 entre las consonantes de plomo y cola como parece sugerirse en el desafío. Los siguientes dos sitios ayudaron enormemente a descubrirlo:
• Wikipedia: idioma coreano, Hangul
• Wikipedia: Hangul Jamo (bloque Unicode)
fuente