Thứ tự từ điển Bắc Triều Tiên


9

Mục tiêu

Đưa ra một chuỗi các âm tiết Hangul, sắp xếp các ký tự theo thứ tự từ điển của Bắc Triều Tiên.

Giới thiệu về âm tiết Hangul

Hangul (한글) là hệ thống chữ viết của Hàn Quốc được phát minh bởi Sejong Đại đế. Các âm tiết Hangul được phân bổ theo điểm Unicode U + AC00 - U + D7A3. Một âm tiết Hangul bao gồm một phụ âm đầu tiên, một nguyên âm và một phụ âm cuối tùy chọn.

Các phụ âm đầu tiên là:

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

Nguyên âm là:

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

Phụ âm cuối cùng là:

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

Ví dụ, có phụ âm đầu , nguyên âm và phụ âm cuối .

Từ điển tiếng Hàn

Các phụ âm và nguyên âm ở trên được sắp xếp theo thứ tự từ điển của Hàn Quốc. Các âm tiết được sắp xếp trước tiên bởi các phụ âm đầu tiên, thứ hai là nguyên âm và cuối cùng là phụ âm cuối (tùy chọn).

Khối Unicode cho các âm tiết Hangul chứa mọi kết hợp phụ âm / nguyên âm và hoàn toàn được sắp xếp theo thứ tự từ điển của Hàn Quốc.

Khối Unicode có thể được nhìn thấy ở đây và 256 ký tự đầu tiên được hiển thị cho mục đích minh họa:

가각 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 갂 걣걤 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 걥걦 계곅 곆곇 곈곉 곊곋 곌곍 곎곏 곐곑 곒곓 곔곕 곖곗 곘곙 곚곛 곜곝 고곡 곢곣 곤곥

Ví dụ: câu sau (không có dấu cách và dấu chấm câu):

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

được sắp xếp để:

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

Trong C ++, nếu chuỗi nằm trong std::wstring, việc sắp xếp ở trên là đơn giản std::sort.

Thứ tự từ điển Bắc Triều Tiên

Từ điển Bắc Triều Tiên có thứ tự phụ âm / nguyên âm khác nhau.

Các phụ âm đầu tiên được sắp xếp như sau:

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

Các nguyên âm được sắp xếp như sau:

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

Các phụ âm cuối được sắp xếp như sau:

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

Giống như Nam, các âm tiết được sắp xếp trước tiên bởi các phụ âm đầu tiên, thứ hai là nguyên âm và cuối cùng là phụ âm cuối (tùy chọn).

Nếu câu trên được đưa ra, đầu ra phải là:

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

Quy tắc

  1. Nếu đầu vào chứa một ký tự không nằm trong U + AC00 - U + D7A3, nó sẽ rơi vào tình huống không quan tâm .

  2. Vì đây là môn đánh gôn, mã ngắn nhất tính bằng byte sẽ thắng.



Nếu điều đó hợp lý, tôi khuyên bạn nên thêm một trường hợp thử nghiệm trong đó các ký tự được sắp xếp khác nhau vì chỉ có phụ âm cuối (sử dụng ㄲ hoặc ㅆ với cùng một phụ âm đầu và cùng một nguyên âm).
Arnauld

(Nói chung hơn, thêm một vài trường hợp thử nghiệm sẽ rất tuyệt.)
Arnauld

Các trường hợp kiểm tra được đề xuất: 가까나다따라마바빠사싸아자짜차카타파(tất cả các phụ âm đầu tiên), 가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기(tất cả các nguyên âm), 가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛(tất cả các phụ âm kéo dài).
Grimmy

1
Chà, rất nhiều cho ... 86 bộ sưu tập SQL Hàn Quốc khác nhau; tất cả đều sắp xếp theo kiểu "Hàn Quốc". Câu hỏi hay (khó).
BradC

Câu trả lời:


1

05AB1E , 47 45 38 byte

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

Hãy thử trực tuyến!

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

Đã lưu 10 byte nhờ @Grimy

I / O: mảng các ký tự.

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

Hãy thử trực tuyến!

Tách âm tiết Hangul

nTôiVF

Tôi= =n588, V= =n28mod21, F= =nmod28

Đã bình luận

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

Than , 80 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải thích: Hoạt động bằng cách tạo tất cả 11172 âm tiết Hangul theo thứ tự từ điển của Bắc Triều Tiên và kiểm tra xem cái nào có trong đầu vào (vì vậy tất cả các ký tự khác sẽ bị xóa; cũng hơi chậm: mất 18 giây trên TIO). Giải trình:

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

Vòng qua chuỗi nén acdfghjmopqrsbeiknl. Điều này thể hiện danh sách các phụ âm đầu tiên của Hàn Quốc (được đánh số bằng bảng chữ cái viết thường của phương Tây) theo thứ tự từ điển của Bắc Triều Tiên.

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

Vòng qua chuỗi nén 02468cdhik1357bgj9eaf. Điều này thể hiện danh sách các nguyên âm Hàn Quốc (được đánh số bằng chữ số ASCII và bảng chữ cái viết thường) theo thứ tự từ điển của Bắc Triều Tiên.

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

Vòng qua chuỗi nén 013456789abcdefghijlmnopqr2k. Điều này thể hiện danh sách các phụ âm cuối của Hàn Quốc (sử dụng cách đánh số giống như nguyên âm) theo thứ tự từ điển của Bắc Triều Tiên.

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

Ghép nguyên âm và phụ âm cuối và giải mã thành số cơ sở 28, sau đó thêm vào 588 lần nguyên âm ban đầu và 0xAC00. In tất cả các ký tự từ đầu vào có thứ tự là thứ tự của chúng.


Là các ký tự thay thế cú pháp hợp lệ?
Danielu NDos

@DannyuNDos Nó đại diện cho giá trị byte \xFFtrong trang mã của Char than.
Neil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.