Ordre du dictionnaire nord-coréen

9

L'objectif

Étant donné une chaîne de syllabes Hangul, triez les caractères dans l'ordre du dictionnaire nord-coréen.

Introduction aux syllabes Hangul

Hangul (한글) est le système d'écriture coréen inventé par Sejong le Grand. Les syllabes Hangul sont attribuées au point Unicode U + AC00 - U + D7A3. Une syllabe Hangul se compose d'une consonne initiale, d'une voyelle et d'une consonne finale facultative.

Les consonnes initiales sont:

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

Les voyelles sont:

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

Les consonnes finales sont:

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

Par exemple, a une consonne initiale , une voyelle et une consonne finale .

Ordre du dictionnaire sud-coréen

Les consonnes et les voyelles ci-dessus sont triées dans l'ordre du dictionnaire sud-coréen. Les syllabes sont d'abord triées par consonnes initiales, ensuite par voyelles, et enfin par consonnes finales (facultatives).

Le bloc Unicode pour les syllabes Hangul contient toutes les combinaisons consonne / voyelle et est entièrement trié dans l'ordre du dictionnaire sud-coréen.

Le bloc Unicode peut être vu ici, et les 256 premiers caractères sont affichés à des fins d'illustration:

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

Par exemple, la phrase suivante (sans espaces ni ponctuations):

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

est trié en:

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

En C ++, si la chaîne est dedans std::wstring, le tri ci-dessus est simplestd::sort .

Ordre du dictionnaire nord-coréen

Le dictionnaire nord-coréen a un ordre de consonne / voyelle différent.

Les consonnes initiales sont triées comme:

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

Les voyelles sont triées comme:

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

Les consonnes finales sont triées comme:

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

Comme South, les syllabes sont d'abord triées par consonnes initiales, ensuite par voyelles, et enfin par consonnes finales (facultatives).

Si la phrase ci-dessus est donnée, la sortie doit être:

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

Règles

  1. Si l'entrée contient un caractère pas dans U + AC00 - U + D7A3, il tombe en ne se soucient pas la situation.

  2. Comme il s'agit d'un code-golf, le code le plus court en octets l'emporte.

Dannyu NDos
la source
En partie lié .
Arnauld
Si cela a du sens, je suggère d'ajouter un cas de test où les caractères sont triés différemment en raison de la consonne finale exclusivement (en utilisant ㄲ ou ㅆ avec la même consonne initiale et la même voyelle).
Arnauld du
(Plus généralement, l'ajout de quelques cas de test supplémentaires serait formidable.)
Arnauld
Cas de test suggérés: 가까나다따라마바빠사싸아자짜차카타파(toutes les consonnes initiales), 가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기(toutes les voyelles), 가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛(toutes les consonnes finales).
Grimmy
1
Eh bien, tant pis pour cela ... 86 classements SQL coréens différents; tous trient de la manière «sud-coréenne». Belle question (difficile).
BradC

Réponses:

1

05AB1E , 47 45 38 octets

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

Essayez-le en ligne!

Σ                        # 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)
Grimmy
la source
7

JavaScript (ES6),  150 148  137 octets

10 octets enregistrés grâce à @Grimy

E / S: tableaux de caractères.

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])

Essayez-le en ligne!

Diviser les syllabes Hangul

njeVF

je=n588, V=n28mod21, F=nmod28

Commenté

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
la source
1

Fusain , 80 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication: Fonctionne en générant toutes les syllabes Hangul 11172 dans l'ordre du dictionnaire nord-coréen et en vérifiant celles qui sont présentes dans l'entrée (afin que tous les autres caractères soient supprimés; également un peu lent: prend 18 secondes sur TIO). Explication:

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

Boucle sur la chaîne compressée acdfghjmopqrsbeiknl. Cela représente la liste des consonnes initiales sud-coréennes (numérotées en utilisant l'alphabet occidental en minuscules) dans l'ordre du dictionnaire nord-coréen.

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

Boucle sur la chaîne compressée 02468cdhik1357bgj9eaf. Cela représente la liste des voyelles sud-coréennes (numérotées à l'aide de chiffres ASCII et de l'alphabet minuscule) dans l'ordre du dictionnaire nord-coréen.

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

Boucle sur la chaîne compressée 013456789abcdefghijlmnopqr2k. Cela représente la liste des consonnes finales sud-coréennes (en utilisant la même numérotation que les voyelles) dans l'ordre du dictionnaire nord-coréen.

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

Concaténer la voyelle et la consonne finale et décoder comme un nombre de base 28, puis ajouter 588 fois la voyelle initiale et 0xAC00. Imprimez tous les caractères de l'entrée qui ont cela comme ordinal.

Neil
la source
Les caractères de remplacement sont-ils une syntaxe valide?
Dannyu NDos
@DannyuNDos Il représente la valeur \xFFen octets dans la page de codes de Charcoal.
Neil