Kolejność słowników w Korei Północnej

9

Cel

Biorąc pod uwagę ciąg sylab Hangul, posortuj znaki w północno-koreańskiej słowniku.

Wprowadzenie do sylab Hangul

Hangul (한글) to koreański system pisania wymyślony przez Sejonga Wielkiego. Sylaby Hangul są przydzielane w punkcie Unicode U + AC00 - U + D7A3. Sylaba Hangul składa się z początkowej spółgłoski, samogłoski i opcjonalnej końcowej spółgłoski.

Początkowe spółgłoski to:

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

Samogłoski to:

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

Końcowe spółgłoski to:

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

Na przykład ma początkową spółgłoskę , samogłoskę i końcową spółgłoskę .

Porządek słownika Korei Południowej

Spółgłoski i samogłoski powyżej są posortowane w kolejności w słowniku Korei Południowej. Sylaby są najpierw sortowane według początkowych spółgłosek, następnie według samogłosek, a na końcu (opcjonalnie) spółgłosek spółgłosek.

Blok Unicode dla sylab Hangul zawiera wszystkie kombinacje spółgłoska / samogłoska i jest całkowicie posortowany w kolejności słownikowej w Korei Południowej.

Blok Unicode można zobaczyć tutaj, a pierwsze 256 znaków pokazano w celach ilustracyjnych:

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

Na przykład następujące zdanie (bez spacji i interpunkcji):

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

jest posortowane do:

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

W C ++, jeśli łańcuch jest w std::wstring, powyższe sortowanie jest prostestd::sort .

Kolejność słowników w Korei Północnej

Słownik Korei Północnej ma inną kolejność spółgłosek / samogłosek.

Początkowe spółgłosek są sortowane w następujący sposób:

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

Samogłoski są sortowane w następujący sposób:

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

Końcowe spółgłosek są sortowane w następujący sposób:

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

Podobnie jak South, sylaby są najpierw sortowane według początkowych spółgłosek, następnie według samogłosek, a na końcu (opcjonalnie) spółgłosek spółgłosek.

Jeśli podano powyższe zdanie, wynikiem musi być:

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

Zasady

  1. Jeśli dane wejściowe zawierają znak spoza U + AC00 - U + D7A3, to nie ma znaczenia .

  2. Ponieważ jest to golfowy kod, wygrywa najkrótszy kod w bajtach.

Dannyu NDos
źródło
Jeśli ma to sens, sugerowałbym dodanie przypadku testowego, w którym znaki są sortowane inaczej wyłącznie ze względu na końcową spółgłoskę (używając ㄲ lub ㅆ z tą samą spółgłoską początkową i tą samą samogłoską).
Arnauld
(Mówiąc bardziej ogólnie, dodanie kilku kolejnych przypadków testowych byłoby świetne.)
Arnauld
Sugerowane przypadki testowe: 가까나다따라마바빠사싸아자짜차카타파(wszystkie spółgłoski początkowe), 가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기(wszystkie samogłosek), 가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛(wszystkie spółgłoski końcowe).
Grimmy,
1
Cóż, tyle za to ... 86 różnych koreańskich zestawień SQL; wszystkie z nich sortowane są w sposób „południowokoreański”. Ładne (trudne) pytanie.
BradC,

Odpowiedzi:

1

05AB1E , 47 45 38 bajtów

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

Wypróbuj online!

Σ                        # 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)
Ponury
źródło
7

JavaScript (ES6),  150 148  137 bajtów

Zaoszczędź 10 bajtów dzięki @Grimy

I / O: tablice znaków.

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

Wypróbuj online!

Dzielenie sylab Hangul

Biorąc pod uwagę znak Hangul o punkcie kodowym 0xAC00 + n, początkowa spółgłoska jasamogłoska V. i ostatnia spółgłoska fa są podawane przez:

ja=n588, V.=n28mod21, fa=nmod28

Skomentował

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
źródło
1

Węgiel drzewny , 80 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Objaśnienie: Działa poprzez wygenerowanie wszystkich 11172 sylab Hangul w kolejności słownikowej w Korei Północnej i sprawdzenie, które z nich są obecne na wejściu (więc wszystkie inne znaki są usuwane; również nieco wolniej: zajmuje 18 sekund na TIO). Wyjaśnienie:

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

Pętla nad skompresowanym łańcuchem acdfghjmopqrsbeiknl. Jest to lista początkowych spółgłosek południowokoreańskich (numerowanych za pomocą zachodniego alfabetu) w kolejności w słowniku północnokoreańskim.

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

Pętla nad skompresowanym łańcuchem 02468cdhik1357bgj9eaf . Reprezentuje listę samogłosek południowokoreańskich (numerowanych za pomocą cyfr ASCII i małych liter) w kolejności słownikowej w Korei Północnej.

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

Pętla nad skompresowanym łańcuchem 013456789abcdefghijlmnopqr2k . Jest to lista końcowych spółgłosek południowokoreańskich (wykorzystujących tę samą numerację co samogłoski) w kolejności słownikowej w Korei Północnej.

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

Połącz samogłoskę i ostatnią spółgłoskę i zdekoduj jako podstawową liczbę 28, a następnie dodaj 588 razy początkową samogłoskę i 0xAC00. Wydrukuj wszystkie znaki z danych wejściowych, które mają tę liczbę porządkową.

Neil
źródło
Czy zastępowane znaki są poprawną składnią?
Dannyu NDos
@DannyuNDos Reprezentuje wartość bajtów \xFFna stronie kodowej Charcoal.
Neil