Orden del diccionario norcoreano

9

El objetivo

Dada una cadena de sílabas de Hangul, ordena los caracteres en el orden de los diccionarios de Corea del Norte.

Introducción a las sílabas de Hangul

Hangul (한글) es el sistema de escritura coreano inventado por Sejong el Grande. Las sílabas de Hangul se asignan en el punto Unicode U + AC00 - U + D7A3. Una sílaba Hangul consiste en una consonante inicial, una vocal y una consonante final opcional.

Las consonantes iniciales son:

ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ

Las vocales son:

ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ

Las consonantes finales son:

(none) ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅄ ㅅ ㅆ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ

Por ejemplo, tiene consonante inicial , vocal y consonante final .

Orden de diccionario de Corea del Sur

Las consonantes y vocales anteriores están ordenadas en el orden del diccionario de Corea del Sur. Las sílabas se ordenan primero por consonantes iniciales, luego por vocales y finalmente por consonantes finales (opcionales).

El bloque Unicode para las sílabas de Hangul contiene todas las combinaciones de consonantes / vocales, y está completamente ordenado en el orden del diccionario de Corea del Sur.

El bloque Unicode se puede ver aquí, y los primeros 256 caracteres se muestran con fines ilustrativos:

가각 갂 갃간 갅갆 갇갈 갉갊 갋갌 갍갎 갏감 갑값 갓갔 강갖 갗갘 같갚 갛개 객갞 갟갠 갡갢 갣갤 갥갦 갧갨 갩갪 갫갬 갭갮 갯갰 갱갲 갳갴 갵갶 갷갸 갹갺 갻갼 갽갾 갿걀 걁걂 걃걄 걅걆 걇걈 걉걊 걋걌 걍걎 걏걐 걑걒 걓걔 걕걖 걗걘 걙걚 걛걜 걝걞 걟걠 걙걚 걣걤 걥걦 걧걨 걩걪 걫걬 걭걮 걯거 걱걲 걳건 걵걶 걷걸 걹걺 걻걼 걽걾 걿검 겁겂 것 겄겅 겆겇 겈겉 겊겋 게겍 겎겏 겐겑 겒겓 겔겕 겖겗 겘겙 겚겛 겜겝 겞겟 겠겡 겢겣 겤겥 겦겧 겨격 겪겫 견겭 겮겯 결겱 겲겳 겴겵 겶겷 겸겹 겺겻 겼경 겾겿 곀곁 곂곃 겼경 계곅 곆곇 곈곉 곊곋 곌곍 곎곏 곐곑 곒곓 곔곕 곖곗 곘곙 곚곛 곜곝 곞곟 고곡 곢곣 곤곥 곦곧 골곩 곪곫 곬곭 곮곯 곰곱 곲곳 곴공 곶곷 곸곹 곺곻 과 곽 곾곿

Por ejemplo, la siguiente oración (sin espacios y signos de puntuación):

키스의고유조건은입술끼리만나야하고특별한기술은필요치않다

se ordena a:

건고고기끼나다리만별술술스않야요유은은의입조치키특필하한

En C ++, si la cadena está dentro std::wstring, la clasificación anterior es simple std::sort.

Orden del diccionario norcoreano

El diccionario de Corea del Norte tiene diferente orden de consonantes / vocales.

Las consonantes iniciales se ordenan como:

ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ ㄲ ㄸ ㅃ ㅆ ㅉ ㅇ

Las vocales se ordenan como:

ㅏ ㅑ ㅓ ㅕ ㅗ ㅛ ㅜ ㅠ ㅡ ㅣ ㅐ ㅒ ㅔ ㅖ ㅚ ㅟ ㅢ ㅘ ㅝ ㅙ ㅞ

Las consonantes finales se ordenan como:

(none) ㄱ ㄳ ㄴ ㄵ ㄶ ㄷ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅄ ㅅ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ ㄲ ㅆ

Al igual que South, las sílabas se ordenan primero por consonantes iniciales, luego por vocales y finalmente por consonantes finales (opcionales).

Si se da la oración anterior, la salida debe ser:

건고고기나다리만별술술스조치키특필하한끼않야요유은은입의

Reglas

  1. Si la entrada contiene un carácter que no está dentro de U + AC00 - U + D7A3, cae en una situación de no importa .

  2. Como se trata de un código de golf, gana el código más corto en bytes.

Dannyu NDos
fuente
Si eso tiene sentido, sugeriría agregar un caso de prueba donde los caracteres se ordenan de manera diferente debido a la consonante final exclusivamente (usando ㄲ o ㅆ con la misma consonante inicial y la misma vocal).
Arnauld
(En términos más generales, agregar algunos casos de prueba más sería genial.)
Arnauld
Casos de prueba sugeridos: 가까나다따라마바빠사싸아자짜차카타파(todas las consonantes iniciales), 가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기(todas las vocales), 가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛(todas las consonantes finales).
Grimmy
1
Bueno, tanto por eso ... 86 diferentes colaciones SQL coreanas; todos ellos se clasifican de la manera "surcoreana". Buena pregunta (dura).
BradC

Respuestas:

1

05AB1E , 47 45 38 bytes

Σ•¡®šúIтÝ„Š’#„λ†x!·“•4B33¡€.ā`ââyÇ68+è

Pruébalo en línea!

Σ                        # sort characters of the input by:
 •...•                   #  compressed integer 13096252834522000035292405913882127943177557
      4B                 #  converted to base 4: 211211121231211111033010101010231002310010331121111111111111111121111111
        33¡              #  split on 33: [2112111212312111110, 010101010231002310010, 1121111111111111111121111111]
           €.ā           #  enumerate each (pairs each digit with its index)
              `ââ        #  reduce by cartesian product (yields a list with 11172 elements)
                 yÇ      #  codepoint of the current character
                   68+   #  + 68
                      è  #  index into the large list (with wraparound)
Mugriento
fuente
7

JavaScript (ES6),  150 148  137 bytes

Guardado 10 bytes gracias a @Grimy

I / O: matrices de caracteres.

a=>a.map(c=>"ANBCODEFPGQSHRIJKLM"[(n=c.charCodeAt()-44032)/588|0]+"AKBLCMDNERTOFGSUPHIQJ"[n/28%21|0]+~(n%28%18==2)+c).sort().map(s=>s[4])

Pruébalo en línea!

División de sílabas Hangul

norteyoVF

yo=norte588, V=norte28modificación21, F=nortemodificación28

Comentado

a => a.map(c =>                  // for each character c in the input:
  "ANBCODEFPGQSHRIJKLM"[         //   start with a letter from 'A' to 'S'
    (n = c.charCodeAt() - 44032) //   for the initial consonant
    / 588 | 0                    //
  ] +                            //
  "AKBLCMDNERTOFGSUPHIQJ"[       //   append a letter from 'A' to 'U'
    n / 28 % 21 | 0              //   for the vowel
  ] +                            //
  ~(                             //   append "-2" for ㄲ or ㅆ (the only North
    n % 28 % 18 == 2             //   Korean final consonants that are sorted
  ) +                            //   differently) or "-1" otherwise
  c                              //   append the original character
)                                // end of map()
.sort()                          // sort in lexicographical order
.map(s => s[4])                  // isolate the original characters
Arnauld
fuente
1

Carbón , 80 bytes

F”&→∧⁶⍘⎚%γD¦ρJG”F”E⎇↓Nη⊙��⭆Ws@}4”F”E↖hY9 t⟧⊙γIO↶5ε∧¬⁶⦃”Φθ⁼℅μΣ⟦⁴⁴⁰³²×⌕βι⁵⁸⁸⍘⁺κλ²⁸

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación: Funciona generando todas las sílabas Hangul 11172 en el orden de los diccionarios de Corea del Norte y verificando cuáles están presentes en la entrada (por lo que todos los demás caracteres se eliminan; también algo lento: toma 18 segundos en TIO). Explicación:

F”&→∧⁶⍘⎚%γD¦ρJG”

Pase sobre la cuerda comprimida acdfghjmopqrsbeiknl. Esto representa la lista de consonantes iniciales de Corea del Sur (numeradas usando el alfabeto en minúscula occidental) en el orden de los diccionarios de Corea del Norte.

F”E⎇↓Nη⊙��⭆Ws@}4”

Pase sobre la cuerda comprimida 02468cdhik1357bgj9eaf. Esto representa la lista de vocales de Corea del Sur (numeradas usando dígitos ASCII y alfabeto en minúsculas) en el orden del diccionario de Corea del Norte.

F”E↖hY9 t⟧⊙γIO↶5ε∧¬⁶⦃”

Pase sobre la cuerda comprimida 013456789abcdefghijlmnopqr2k. Esto representa la lista de consonantes finales de Corea del Sur (usando la misma numeración que las vocales) en el orden de los diccionarios de Corea del Norte.

Φθ⁼℅μΣ⟦⁴⁴⁰³²×⌕βι⁵⁸⁸⍘⁺κλ²⁸

Concatene la vocal y la consonante final y decodifique como un número base 28, luego agregue 588 veces la vocal inicial y 0xAC00. Imprima todos los caracteres de la entrada que tienen eso como su ordinal.

Neil
fuente
¿Son válidos los caracteres de reemplazo sintaxis?
Dannyu NDos
@DannyuNDos Representa el valor de byte \xFFen la página de códigos de Charcoal.
Neil