Urutan kamus Korea Utara

9

Objektif

Diberikan string suku kata Hangul, urutkan karakter dalam urutan kamus Korea Utara.

Pengantar suku kata Hangul

Hangul (한글) adalah sistem penulisan Korea yang diciptakan oleh Sejong the Great. Suku kata Hangul dialokasikan dalam titik Unicode U + AC00 - U + D7A3. Suku kata Hangul terdiri dari konsonan awal, vokal, dan konsonan akhir opsional.

Konsonan awal adalah:

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

Vokal adalah:

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

Konsonan terakhir adalah:

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

Misalnya, memiliki konsonan awal , vokal , dan konsonan akhir .

Urutan kamus Korea Selatan

Konsonan dan vokal di atas diurutkan dalam urutan kamus Korea Selatan. Suku kata pertama diurutkan berdasarkan konsonan awal, kedua oleh vokal, dan akhirnya oleh konsonan akhir (opsional).

Blok Unicode untuk suku kata Hangul berisi setiap kombinasi konsonan / vokal, dan seluruhnya diurutkan dalam urutan kamus Korea Selatan.

Blok Unicode dapat dilihat di sini, dan 256 karakter pertama ditampilkan untuk tujuan ilustrasi:

가각 갂 갃간 갅갆 갇갈 갋갌 갋갌 갍갎 갏감 갑값 갓갔 강갖 갗갘 같갚 갛개 객갞 객갞 갡갢 갣갤 갩갪 갩갪 갫갬 갫갬 갫갬 갯갰 갱갲 갱갲 갱갲 갹갺 갿걀 갿걀 갿걀 걁걂 걍걎 걍걎 걍걎 걏걐 걡걢 걛걜 걛걜 걛걜 걛걜 걛걜 걛걜 걛걜 걛걜 걛걜 걛걜 걕걖 걕걖 걛걜 걛걜 걕걖 걕걖 걣걤 걥걦 걧걨 걩걪 걫걬 걭걮 걯거 걱걲 걳건 걵걶 걷걸 걹걺 걻걼 걽걾 걿검 겁겂 겁겂 겄겅 겆겇 게겍 게겍 게겍 겎겏 겎겏 겒겓 겔겕 겔겕 겔겕 겔겕 겢겣 겢겣 겢겣 겤겥 겦겧 결겱 결겱 결겱 겶겷 겾겿 겼경 겼경 겼경 겼경 겼경 겼경 겼경 겼경 겼경 겼경 겼경 겼경 겼경 계곅 곆곇 곈곉 곊곋 곌곍 곎곏 곐곑 곒곓 곒곓 곔곕 곖곗 곘곙 곚곛 곞곟 고곡 고곡 곢곣 곢곣 곤곥 골곩 골곩 곮곯 곮곯 곮곯 곰곱 곰곱 곲곳 곴공 곴공 곶곷 곶곷 곶곷 과 과 곽 곾곿 곾곿

Misalnya, kalimat berikut (tanpa spasi dan tanda baca):

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

diurutkan ke:

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

Dalam C ++, jika string dalam std::wstring, penyortiran atas adalah polos std::sort.

Urutan kamus Korea Utara

Kamus Korea Utara memiliki urutan konsonan / vokal yang berbeda.

Konsonan awal diurutkan seperti:

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

Vokal diurutkan seperti:

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

Konsonan akhir diurutkan seperti:

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

Seperti Selatan, suku kata diurutkan berdasarkan konsonan awal, kedua oleh vokal, dan akhirnya oleh konsonan akhir (opsional).

Jika kalimat di atas diberikan, hasilnya harus:

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

Aturan

  1. Jika input berisi karakter yang tidak dalam U + AC00 - U + D7A3, itu jatuh dalam situasi tidak peduli .

  2. Karena ini adalah kode-golf, kode terpendek dalam byte akan menang.

Dannyu NDos
sumber
Sebagian terkait .
Arnauld
Jika itu masuk akal, saya sarankan untuk menambahkan test case di mana karakter diurutkan secara berbeda karena konsonan akhir secara eksklusif (menggunakan ㄲ atau ㅆ dengan konsonan awal yang sama dan vokal yang sama).
Arnauld
(Secara umum, menambah beberapa kasus uji akan lebih baik.)
Arnauld
Kasus uji yang disarankan: 가까나다따라마바빠사싸아자짜차카타파(semua konsonan awal), 가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기(semua vokal), 가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛(semua konsonan tertinggal).
Grimmy
1
Ya, sangat banyak untuk itu ... 86 kumpulan SQL Korea yang berbeda; semuanya memilah dengan cara "Korea Selatan". Pertanyaan bagus (sulit).
BradC

Jawaban:

1

05AB1E , 47 45 38 byte

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

Cobalah 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)
Grimmy
sumber
7

JavaScript (ES6),  150 148  137 byte

Disimpan 10 byte berkat @Grimy

I / O: array karakter.

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

Cobalah online!

Memisahkan suku kata Hangul

nsayaVF

saya=n588, V=n28mod21, F=nmod28

Berkomentar

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

Arang , 80 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan: Bekerja dengan menghasilkan semua 11172 suku kata Hangul dalam urutan kamus Korea Utara dan memeriksa untuk melihat mana yang ada dalam input (sehingga semua karakter lain dihapus; juga agak lambat: membutuhkan 18 detik pada TIO). Penjelasan:

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

Lingkarkan di atas string yang dikompresi acdfghjmopqrsbeiknl. Ini mewakili daftar konsonan awal Korea Selatan (diberi nomor menggunakan huruf kecil Barat) dalam urutan kamus Korea Utara.

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

Lingkarkan di atas string yang dikompresi 02468cdhik1357bgj9eaf. Ini mewakili daftar vokal Korea Selatan (diberi nomor menggunakan angka ASCII dan huruf kecil) dalam urutan kamus Korea Utara.

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

Lingkarkan di atas string yang dikompresi 013456789abcdefghijlmnopqr2k. Ini mewakili daftar konsonan akhir Korea Selatan (menggunakan penomoran yang sama dengan vokal) dalam urutan kamus Korea Utara.

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

Gabungkan vokal dan konsonan terakhir dan decode sebagai angka dasar 28, kemudian tambahkan 588 kali vokal awal dan 0xAC00. Cetak semua karakter dari input yang memilikinya sebagai urutan.

Neil
sumber
Apakah karakter pengganti sintaks yang valid?
Dannyu NDos
@DannyuNDos Ini mewakili nilai byte \xFFdi halaman kode Charcoal.
Neil