Introducción
Es algo así como el diseño del teclado DVORAK , pero MUCHO más difícil.
Hablemos primero del teclado coreano. Como puede ver en Wikipedia , hay una clave Kor / Eng para cambiar entre conjuntos de claves coreano e inglés.
Los coreanos a veces escriben mal: intentan escribir en coreano en un teclado qwerty o en inglés en un teclado de dos juegos.
Entonces, aquí está el problema: si se dan caracteres coreanos escritos en un teclado de dos juegos, conviértalos a caracteres alfabéticos escritos en el teclado qwerty. Si se le dan caracteres alfabéticos escritos en qwerty, cámbielo a teclado de dos juegos.
Teclado de dos juegos
Aquí está la distribución del teclado de dos conjuntos:
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
ㅋㅌㅊㅍㅠㅜㅡ
y con la tecla shift:
ㅃㅉㄸㄲㅆㅛㅕㅑㅒㅖ
solo la fila superior cambia mientras que las otras no.
Sobre caracteres coreanos
si terminara aquí, podría ser fácil, pero no. Cuando escribes
dkssud, tprP!
la salida no se muestra de esta manera:
ㅇㅏㄴㄴㅕㅇ, ㅅㅔㄱㅖ!
pero de esta manera:
안녕, 세계!(means Hello, World!)
y hace las cosas mucho más difíciles.
Los caracteres coreanos se separan en tres partes: 'Choseong (consonante)', 'Jungseong (Vocal)' y 'Jongseong (consonante al final de la sílaba: puede estar en blanco)', y debe separarlo.
Afortunadamente, hay forma de hacerlo.
Cómo separar
Hay 19 Choseong, 21 Jungseong y 28 Jongseong (en blanco), y 0xAC00 es '가', primer carácter de los caracteres coreanos. Con esto, podemos separar los caracteres coreanos en tres partes. Aquí está el orden de cada uno y su posición en el teclado de dos juegos.
Elige un pedido:
ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
r R s e E f a q Q t T d w W c z x v g
orden de jungseong:
ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ
k o i O j p u P h hk ho hl y n nj np nl b m ml l
orden de jongseong:
()ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ
()r R rt s sw sg e f fr fa fq ft fx fv fg a q qt t T d w c z x v g
Digamos Vamos (unicode value of some character) - 0xAC00
es Korean_code
, y el índice de choseong, Jungseong, Jongseong es Cho
, Jung
, Jong
.
Entonces, Korean_code
es(Cho * 21 * 28) + Jung * 28 + Jong
Aquí está el código javascript que separa el carácter coreano de este sitio web coreano, para su conveniencia.
var rCho = [ "ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ" ];
var rJung =[ "ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ" ];
var rJong = [ "", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ","ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ" ];
var cho, jung, jong;
var sTest = "탱";
var nTmp = sTest.charCodeAt(0) - 0xAC00;
jong = nTmp % 28; // Jeongseong
jung = ((nTmp - jong) / 28 ) % 21 // Jungseong
cho = ( ( (nTmp - jong) / 28 ) - jung ) / 21 // Choseong
alert("Choseong:" + rCho[cho] + "\n" + "Jungseong:" + rJung[jung] + "\n" + "Jongseong:" + rJong[jong]);
Cuando se ensambla
- Tenga en cuenta que
ㅘ
,ㅙ
,ㅚ
,ㅝ
,ㅞ
,ㅟ
,ㅢ
es una combinación de otros jungseongs.
ㅗ+ㅏ=ㅘ, ㅗ+ㅐ=ㅙ, ㅗ+ㅣ=ㅚ, ㅜ+ㅓ=ㅝ, ㅜ+ㅔ=ㅞ, ㅜ+ㅣ=ㅟ, ㅡ+ㅣ=ㅢ
- Choseong es necesario. Eso significa que, si
frk
se da, es decirㄹㄱㅏ
, puede cambiar de dos maneras:ㄺㅏ
yㄹ가
. Luego, debe convertirlo de una manera que haya elegido. Sijjjrjr
dada, que esㅓㅓㅓㄱㅓㄱ
, que conducenㅓ
s no tienen nada que pueda ser CHOSEONG, pero el cuartoㅓ
tieneㄱ
que se puede CHOSEONG, por lo que se transforma enㅓㅓㅓ걱
.
Otro ejemplo: 세계
( tprP
). Se puede cambiar a 섹ㅖ
( (ㅅㅔㄱ)(ㅖ)
), pero debido a que elegirong es necesario, se cambia a 세계
( (ㅅㅔ)(ㄱㅖ)
)
Ejemplos
entrada 1
안녕하세요
salida 1
dkssudgktpdy
entrada 2
input 2
salida 2
ㅑㅞㅕㅅ 2
entrada 3
힘ㄴㄴ
salida 3
glass
entrada 4
아희(Aheui) is esolang which you can program with pure Korean characters.
salida 4
dkgml(모뎌ㅑ) ㅑㄴ ㄷ내ㅣ뭏 조ㅑ초 ㅛㅐㅕ ㅊ무 ㅔ갷ㄱ므 쟈소 ㅔㅕㄱㄷ ㅏㅐㄱㄷ무 촘ㄱㅁㅊㅅㄷㄱㄴ.
entrada 5
dkssud, tprP!
salida 5
안녕, 세계!
entrada 6
ㅗ디ㅣㅐ, 째깅! Hello, World!
salida 6
hello, World! ㅗ디ㅣㅐ, 째깅!
El código más corto gana. (en bytes)
Nueva regla para tu conveniencia
Puede descartar caracteres como los A
que no tienen su contraparte en el teclado de dos conjuntos. así Aheui
que Aㅗ뎌ㅑ
está bien. Pero, si cambia Aheui
a 모뎌ㅑ
, puede obtener -5 puntos, por lo que puede ganar 5 bytes.
Se pueden separar dos jungseongs (como ㅘ
a ㅗ+ㅏ
). al igual rhk
que 고ㅏ
, o how
a ㅗㅐㅈ
. Pero si se combina (como rhk
al 과
o how
a ㅙㅈ
), usted puede ganar -5 puntos adicionales.
l
posteriorml
para el símbolo coreanoㅣ
.fjfau
podría interpretarse como럶ㅕ
o럴며
. ¿Cómo resolvemos esto?tprP
en el caso de prueba 5: esto se transforma enㅅㅔㄱㅖ
, dondeㅅ
es un elegido,ㅔ
es un jungseong yㄱ
es un jongseong. Entonces, ¿no debería transformarse esto en섷ㅖ
(agrupado como(ㅅㅔㄱ)(ㅖ)
) en lugar de세계
(agrupado como(ㅅㅔ)(ㄱㅖ)
)? En un comentario anterior, usted afirma que se interpreta escribiendo, por lo que esperaríaㅅㅔㄱ
transformarme en섷
. ¿O el coreano está escribiendo de derecha a izquierda en lugar de izquierda a derecha?가
) a D7AF (힣
).Respuestas:
Gelatina ,
296264 bytesPruébalo en línea!
Un programa completo que toma una cadena como argumento y devuelve una cadena (que se imprime implícitamente). Esto funciona en tres pasadas: primero convierte todos los caracteres coreanos en listas de puntos de código para las letras latinas. Luego identifica y construye los caracteres coreanos compuestos. Finalmente, convierte cualquier letra latina perdida restante al equivalente coreano. Tenga en cuenta que otros caracteres y letras latinas que no aparecen en la especificación (p
A
. Ej. ) Se dejan solos.Si se necesita la conversión a minúsculas de mayúsculas fuera de las especificaciones, esto se puede hacer a un costo de 10 bytes adicionales .
Explicación
Enlace auxiliar 1 : enlace diádico con argumentos x e y. x es una lista de pares de sublistas de búsqueda y reemplazo. y tendrá cada sublista de búsqueda reemplazada por la sublista de reemplazo correspondiente
Enlace auxiliar 2 : Lista de caracteres latinos / pares de caracteres en el orden que corresponde al orden Unicode de los caracteres coreanos
Enlace de ayuda 3 : listas de caracteres latinos utilizados para Choseong, Jungseong y Jongseong
Enlace auxiliar 4 : Listas anteriores de caracteres latinos enumerados y ordenados en orden decreciente de longitud
Enlace principal : Mónada que toma una cadena Jelly como argumento y devuelve la cadena Jelly traducida
Sección 1 : Convierta bloques morfemicos a los puntos de código Unicode de los caracteres latinos correspondientes
Sección 1.1 : Obtenga la lista de caracteres latinos necesarios para hacer los bloques
Sección 1.2 : Cree todas las combinaciones de estas letras (19 × 21 × 28 = 11,172 combinaciones en el orden léxico apropiado)
Sección 1.3 : Empareje los puntos de código Unicode de los bloques con la lista correspondiente de caracteres latinos, y utilícelos para traducir los bloques morfemicos en la cadena de entrada
Sección 2 : Convierta los caracteres coreanos individuales en la salida de la sección 1 a los puntos de código del equivalente latino
Sección 3 : Ordene los caracteres no traducidos en la salida de la sección 2 (funciona porque todo lo traducido del coreano ahora estará en una sublista y, por lo tanto, tendrá profundidad 1)
Sección 4 : Convierta bloques morfemicos de caracteres latinos en coreano
Sección 4.1 : Obtenga todas las combinaciones posibles de Choseong y Jungseong
Sección 4.2 : Etiquete cada combinación con el punto de código Unicode para el bloque morfemico base (es decir, sin Jongseong)
Sección 4.3 : Reemplace estas cadenas de caracteres latinos en la salida de la sección 3 con los puntos de código Unicode del bloque morfemico base
Sección 4.4: Identifique si hay un Jongseong como parte de cada bloque morfemico
Sección 5 : Maneje los caracteres latinos restantes que coinciden con los coreanos pero que no son parte de un bloque morphemuc
fuente
책
, exceptuécor
, pero diocBor
. Y no cambiac
aㅊ
.can
tuvo que convertirse enㅊ무
, pero se convirtió enc무
. Y también exceptué que los caracteres grandes que no aparecen en las especificaciones se descapitalizarían, pero puede estar bien.A
como marcador de posición para el segundo carácter de caracteres individuales, y por alguna razón, el siguientec
apareció como aB
. La conversión a minúsculas de otras letras podría hacerse, pero se siente como una complicación innecesaria a lo que ya es un desafío difícil.JavaScript (Node.js) ,
587582575569557554550549 bytesNo lo sabías
string.charCodeAt() == string.charCodeAt(0)
.Pruébalo en línea!
547 si los caracteres fuera de los alfabetos y los jamos coreanos pueden ignorarse.
De acuerdo, luché por tanto tiempo para escribir esto, pero esto debería funcionar.
No se usa jamo / sílaba coreana porque son demasiado caros (3 bytes por uso).Se usa en la expresión regular para guardar bytes.fuente
Wolfram Language (Mathematica) ,
405401400 bytesPruébalo en línea!
Ligeramente no golfista
Para probar esto en Mathematica simplemente reemplace
alphabet
conAlphabet
; sin embargo, TIO no es compatible con Wolfram Cloud, así que definíAlphabet["Korean"]
en el encabezado.Primero descomponemos todas las sílabas de Hangul al alfabeto Hangul, luego intercambiamos caracteres latinos y Hangul, luego recomponemos las sílabas.
fuente
input 2
Resultados de casos de prueba enㅑㅜㅔㅕㅅ 2
lugar deㅑㅞㅕㅅ 2
en su TIO. Aunque sucede lo mismo en la solución en la que estaba trabajando, ya que ambosㅜ
yㅔ
jungseong, y tenía la impresión de que solo se elegiríanongong + jungseong + jongseong o chooseong + jungseong + vacío. Le pedí a OP que verificara por qué seㅜㅔ
hizoㅞ
.fnpfa
debería ser un solo personaje,뤪
pero en su lugar termina como루ㅔㄹㅁ
Java 19,
113311261133 bytesSalidas con letras mayúsculas
ASDFGHJKLZXCVBNM
sin cambios, ya que.toLowerCase()
cuesta más que la bonificación de -5.Atrás +7 bytes como corrección de errores para caracteres no coreanos por encima del valor Unicode 20,000 (gracias @NickKennedy por notarlo).
Pruébalo en línea.
Explicación:
fuente
44032 + 19×21×28 - 1