Kuzey Korece sözlük sırası


9

Amaç

Hangul heceleri dizisi verildiğinde, karakterleri Kuzey Kore sözlük sırasına göre sıralayın.

Hangul hecelerine giriş

Hangul (한글) Büyük Sejong tarafından icat edilen Kore yazı sistemidir. Hangul heceleri Unicode U + AC00 - U + D7A3 noktalarına tahsis edilir. Hangul hecesi bir başlangıç ​​ünsüz, bir sesli harf ve isteğe bağlı bir nihai ünsüzden oluşur.

İlk ünsüzler:

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

Ünlüler:

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

Son ünsüzler:

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

Örneğin , ilk ünsüz , ünlü ve son ünsüz vardır .

Güney Korece sözlük sırası

Yukarıdaki ünsüzler ve ünlüler Güney Korece sözlük sırasına göre sıralanmıştır. Heceler ilk önce başlangıç ​​ünsüzlerine, ikinci olarak sesli harflere ve son olarak (isteğe bağlı) son ünsüzlere göre sıralanır.

Hangul heceleri için Unicode bloğu her ünsüz / sesli harf kombinasyonunu içerir ve tamamen Güney Korece sözlük sırasına göre sıralanır.

Unicode bloğu burada görülebilir ve ilk 256 karakter açıklama amacıyla gösterilmiştir:

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

Örneğin, aşağıdaki cümle (boşluk ve noktalama işaretleri olmadan):

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

şu şekilde sıralandı:

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

C ++ 'da, dize varsa, std::wstringyukarıdaki sıralama düzdür std::sort.

Kuzey Korece sözlük sırası

Kuzey Korece sözlükte farklı ünsüz / sesli harf sırası vardır.

İlk ünsüzler şu şekilde sıralanır:

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

Ünlüler şöyle sıralanır:

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

Son ünsüzler şöyle sıralanır:

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

Güney gibi, heceler ilk olarak başlangıç ​​ünsüzlerine, ikinci olarak ünlülere ve son olarak (isteğe bağlı) son ünsüzlere göre sıralanır.

Yukarıdaki cümle verilirse, çıktı:

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

kurallar

  1. Giriş U + AC00 - U + D7A3 içinde olmayan bir karakter içeriyorsa, umurumda değil .

  2. Bu bir kod golf olduğundan, bayttaki en kısa kod kazanır.



Bu mantıklıysa, yalnızca son ünsüz nedeniyle karakterlerin farklı sıralandığı bir test durumu eklemenizi öneririm (aynı başlangıç ​​ünsüz ve aynı sesli harfle ㄲ veya using kullanarak).
Arnauld

(Daha genel olarak konuşursak, birkaç test örneği daha eklemek harika olurdu.)
Arnauld

Önerilen test senaryoları: 가까나다따라마바빠사싸아자짜차카타파(tüm başlangıç ​​ünsüzleri), 가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기(tüm sesli harfleri), 가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛(tüm sondaki ünsüzler).
Grimmy

1
Bunun için çok fazla ... 86 farklı Kore SQL harmanlaması; hepsi "Güney Kore" tarzındadır. Güzel (zor) bir soru.
BradC

Yanıtlar:


1

05AB1E , 47 45 38 bayt

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

Çevrimiçi deneyin!

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

7

JavaScript (ES6),  150 148  137 bayt

@Grimy sayesinde 10 bayt kaydedildi

I / O: karakter dizileri.

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

Çevrimiçi deneyin!

Hangul hecelerini bölmek

0xAC00 + kod noktasının Hangul karakteri verildi n, ilk ünsüz ben, sesli harf V ve son ünsüz F tarafından verilen:

ben=n588, V=n28şık21, F=nşık28

Yorumlananlar

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

1

Kömür , 80 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama: Kuzey Kore sözlük sırasına göre 11172 Hangul hecelerinin tümünü oluşturarak ve girdide hangilerinin bulunduğunu kontrol ederek çalışır (böylece diğer tüm karakterler silinir; ayrıca biraz yavaş: TIO'da 18 saniye sürer). Açıklama:

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

Sıkıştırılmış dize üzerinden döngü acdfghjmopqrsbeiknl. Bu, Kuzey Kore sözlük düzenindeki Güney Koreli ilk ünsüzlerin (Batı küçük harfli alfabe kullanılarak numaralandırılmış) listesini temsil eder.

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

Sıkıştırılmış dize üzerinden döngü 02468cdhik1357bgj9eaf. Bu, Kuzey Kore sözlük sıralamasında Güney Koreli ünlülerin (ASCII rakamları ve küçük harfli alfabe kullanılarak numaralandırılmış) listesini temsil eder.

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

Sıkıştırılmış dize üzerinden döngü 013456789abcdefghijlmnopqr2k. Bu, Kuzey Kore sözlük düzenindeki Güney Koreli son ünsüzlerin (ünlülerle aynı numaralandırmayı kullanarak) listesini temsil eder.

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

Sesli harf ve son ünsüzü birleştirin ve bir temel 28 numarası olarak kodunu çözün, sonra başlangıç ​​sesli harfinin ve 0xAC00'ün 588 katı ekleyin. Girdiden sıralı olan tüm karakterleri yazdırın.


Değiştirilen karakterler geçerli sözdizimi mi?
Dannyu NDos

@DannyuNDos Kömürün \xFFkod sayfasındaki bayt değerini temsil eder .
Neil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.