Nordkoreanische Wörterbuchreihenfolge

9

Das Ziel

Sortieren Sie die Zeichen anhand einer Reihe von Hangul-Silben in der nordkoreanischen Wörterbuchreihenfolge.

Einführung in Hangul-Silben

Hangul (한글) ist das koreanische Schriftsystem, das von Sejong dem Großen erfunden wurde. Hangul-Silben werden im Unicode-Punkt U + AC00 - U + D7A3 zugeordnet. Eine Hangul-Silbe besteht aus einem Anfangskonsonanten, einem Vokal und einem optionalen Endkonsonanten.

Die Anfangskonsonanten sind:

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

Die Vokale sind:

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

Die Endkonsonanten sind:

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

Zum Beispiel hat Anfangskonsonant , Vokal und Endkonsonant .

Südkoreanische Wörterbuchreihenfolge

Die Konsonanten und Vokale oben sind in der Reihenfolge des südkoreanischen Wörterbuchs sortiert. Die Silben werden erstens nach Anfangskonsonanten, zweitens nach Vokalen und schließlich nach (optionalen) Endkonsonanten sortiert.

Der Unicode-Block für Hangul-Silben enthält alle Konsonanten / Vokal-Kombinationen und ist vollständig in der südkoreanischen Wörterbuchreihenfolge sortiert.

Der Unicode-Block ist hier zu sehen , und die ersten 256 Zeichen werden zur Veranschaulichung gezeigt:

가각 갂 갃간 갅갆 갇갈 갉갊 갋갌 갍갎 갏감 갑값 갓갔 강갖 갗갘 같갚 갛개 객갞 갟갠 갡갢 갣갤 갥갦 갩갪 갫갬 갭갮 갱갲 갳갴 갵갶 갷갸 갹갺 갻갼 갿걀 걡걢 걡걢 걡걢 걡걢 걡걢 걣걤 걥걦 걧걨 걩걪 걫걬 걭걮 걯거 걱걲 걳건 걵걶 걷걸 걹걺 걻걼 걽걾 걿검 겁겂 것 겄겅 겆겇 겈겉 게겍 겎겏 겐겑 겒겓 겔겕 겖겗 겘겙 겜겝 겞겟 겢겣 겤겥 곂곃 겨격 겪겫 곂곃 계곅 곆곇 곈곉 곊곋 곌곍 곎곏 곐곑 곒곓 곔곕 곖곗 곘곙 곚곛 곜곝 곞곟 고곡 곢곣 곤곥 곦곧 골곩 곪곫 곬곭 곬곭 곰곱 곲곳

Zum Beispiel der folgende Satz (ohne Leerzeichen und Satzzeichen):

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

ist sortiert nach:

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

Wenn sich die Zeichenfolge in C ++ befindet std::wstring, ist die obige Sortierung einfach std::sort.

Nordkoreanische Wörterbuchreihenfolge

Das nordkoreanische Wörterbuch hat eine andere Konsonanten- / Vokalreihenfolge.

Die Anfangskonsonanten sind wie folgt sortiert:

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

Die Vokale sind wie folgt sortiert:

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

Die Endkonsonanten sind wie folgt sortiert:

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

Wie im Süden werden die Silben erstens nach Anfangskonsonanten, zweitens nach Vokalen und schließlich nach (optionalen) Endkonsonanten sortiert.

Wenn der obige Satz gegeben ist, muss die Ausgabe sein:

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

Regeln

  1. Wenn die Eingabe ein Zeichen enthält, das nicht in U + AC00 - U + D7A3 enthalten ist, ist dies nicht der Fall .

  2. Da dies ein Code-Golf ist, gewinnt der kürzeste Code in Bytes.

Dannyu NDos
quelle
Teilweise verwandt .
Arnauld
Wenn dies sinnvoll ist, würde ich vorschlagen, einen Testfall hinzuzufügen, in dem die Zeichen ausschließlich aufgrund des Endkonsonanten unterschiedlich sortiert sind (unter Verwendung von ㄲ oder ㅆ mit demselben Anfangskonsonanten und demselben Vokal).
Arnauld
(Im Allgemeinen wäre es großartig, ein paar weitere Testfälle hinzuzufügen.)
Arnauld
Vorgeschlagene Testfälle: 가까나다따라마바빠사싸아자짜차카타파(alle Anfangskonsonanten), 가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기(alle Vokale), 가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛(alle nachfolgenden Konsonanten).
Grimmy
1
So viel dazu ... 86 verschiedene koreanische SQL-Kollatierungen; alle sortieren auf "südkoreanische" Weise. Schöne (schwierige) Frage.
BradC

Antworten:

1

05AB1E , 47 45 38 Bytes

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

Probieren Sie es online aus!

Σ                        # 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
quelle
7

JavaScript (ES6),  150 148  137 Byte

10 Bytes dank @Grimy gespeichert

E / A: Arrays von Zeichen.

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

Probieren Sie es online aus!

Hangul-Silben teilen

nichV.F.

ich=n588, V.=n28mod21, F.=nmod28

Kommentiert

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
quelle
1

Holzkohle , 80 Bytes

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

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung: Generiert alle 11172 Hangul-Silben in nordkoreanischer Wörterbuchreihenfolge und überprüft, welche in der Eingabe vorhanden sind (damit alle anderen Zeichen gelöscht werden; auch etwas langsam: dauert bei TIO 18 Sekunden). Erläuterung:

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

Schleife über die komprimierte Zeichenfolge acdfghjmopqrsbeiknl. Dies ist die Liste der südkoreanischen Anfangskonsonanten (nummeriert mit dem westlichen Kleinbuchstaben) in nordkoreanischer Wörterbuchreihenfolge.

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

Schleife über die komprimierte Zeichenfolge 02468cdhik1357bgj9eaf. Dies ist die Liste der südkoreanischen Vokale (nummeriert mit ASCII-Ziffern und Kleinbuchstaben) in nordkoreanischer Wörterbuchreihenfolge.

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

Schleife über die komprimierte Zeichenfolge 013456789abcdefghijlmnopqr2k. Dies ist die Liste der südkoreanischen Endkonsonanten (mit derselben Nummerierung wie die Vokale) in der nordkoreanischen Wörterbuchreihenfolge.

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

Verketten Sie den Vokal und den Endkonsonanten und dekodieren Sie ihn als Basiszahl 28, und addieren Sie dann das 588-fache des Anfangsvokals und 0xAC00. Drucken Sie alle Zeichen aus der Eingabe aus, deren Ordnungszahl dies ist.

Neil
quelle
Sind die Ersatzzeichen eine gültige Syntax?
Dannyu NDos
@DannyuNDos Es repräsentiert den Bytewert \xFFin der Codepage von Charcoal.
Neil