Ordem do dicionário norte-coreano

9

O objetivo

Dada uma sequência de sílabas Hangul, classifique os caracteres na ordem do dicionário norte-coreano.

Introdução às sílabas Hangul

Hangul (한글) é o sistema de escrita coreano inventado por Sejong, o Grande. As sílabas de Hangul são alocadas no ponto Unicode U + AC00 - U + D7A3. Uma sílaba Hangul consiste em uma consoante inicial, uma vogal e uma consoante final opcional.

As consoantes iniciais são:

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

As vogais são:

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

As consoantes finais são:

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

Por exemplo, tem consoante inicial , vogal e consoante final .

Ordem de dicionário da Coréia do Sul

As consoantes e vogais acima são classificadas na ordem do dicionário sul-coreano. As sílabas são primeiramente classificadas por consoantes iniciais, segundo por vogais e, finalmente, por consoantes finais (opcionais).

O bloco Unicode para sílabas Hangul contém todas as combinações consoante / vogal e é inteiramente classificado na ordem do dicionário sul-coreano.

O bloco Unicode pode ser visto aqui, e os primeiros 256 caracteres são mostrados para fins ilustrativos:

가각 갂 갃간 갅갆 갇갈 갓갔 강갖 갗갘 같갚 객갞 갟갠 갡갢 갣갤 갥갦 갧갨 갩갪 갫갬 갭갮 갯갰 갱갲 갵갶 갵갶 갷갸 갹갺 갻갼 갽갾 걁걂 걁걂 걁걂 걅걆 걝걞 걁걂 걗걘 걙걚 걝걞 걗걘 걗걘 걗걘 걝걞 걗걘 걗걘 걗걘 걗걘 걗걘 걣걤 걥걦 걧걨 걩걪 걫걬 걷걸 걹걺 걻걼 걽걾 겁겂 것 겄겅 겆겇 겈겉 겊겋 게겍 겎겏 겐겑 겒겓 겔겕 겘겙 겘겙 겚겛 겜겝 겞겟 겠겡 겤겥 겤겥 겤겥 겤겥 겤겥 겦겧 겪겫 결겱 겤겥 겦겧 겼경 곀곁 겺겻 겺겻 겼경 곀곁 겺겻 계곅 곆곇 곈곉 곊곋 곌곍 곐곑 곒곓 곔곕 곘곙 곚곛 곜곝 고곡 곢곣 곤곥 곦곧 골곩 곪곫 곬곭 곮곯 곰곱 곲곳 곴공 곶곷 곰곱 곲곳 곴공 곶곷 곰곱 곲곳 곲곳 곾곿 곰곱 곾곿

Por exemplo, a seguinte frase (sem espaços e pontuações):

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

está classificado para:

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

No C ++, se a string estiver inserida std::wstring, a classificação acima será simples std::sort.

Ordem do dicionário norte-coreano

O dicionário norte-coreano tem uma ordem consoante / vogal diferente.

As consoantes iniciais são classificadas como:

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

As vogais são classificadas como:

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

As consoantes finais são classificadas como:

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

Como o sul, as sílabas são primeiramente classificadas por consoantes iniciais, segundo por vogais e, finalmente, por consoantes finais (opcionais).

Se a frase acima for dada, a saída deve ser:

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

Regras

  1. Se a entrada contiver um caractere que não esteja em U + AC00 - U + D7A3, ela se encaixa na situação de não se importar .

  2. Como este é um código-golfe, o código mais curto em bytes vence.

Dannyu NDos
fonte
Se isso fizer sentido, sugiro adicionar um caso de teste em que os caracteres sejam classificados de maneira diferente por causa da consoante final exclusivamente (usando ㄲ ou ㅆ com a mesma consoante inicial e a mesma vogal).
Arnauld
(De um modo geral, acrescentando mais alguns casos de teste seria ótimo.)
Arnauld
Casos de teste sugeridos: 가까나다따라마바빠사싸아자짜차카타파(todas as consoantes iniciais), 가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기(todas as vogais), 가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛(todas as consoantes finais).
Grimmy #
11
Bem, muito por isso ... 86 diferentes agrupamentos SQL coreanos; todos eles se classificam da maneira "sul-coreana". Boa pergunta (difícil).
BradC 07/10/19

Respostas:

1

05AB1E , 47 45 38 bytes

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

Experimente 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
fonte
7

JavaScript (ES6),  150 148137  bytes

Guardado 10 bytes graças a @Grimy

E / S: matrizes de caracteres.

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

Experimente online!

Divisão de sílabas Hangul

nIVF

I=n588, V=n28mod21, F=nmod28

Comentado

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

Carvão , 80 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação: Funciona gerando todas as sílabas 11172 Hangul na ordem do dicionário norte-coreano e verificando quais estão presentes na entrada (para que todos os outros caracteres sejam excluídos; também um pouco lento: leva 18 segundos no TIO). Explicação:

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

Loop sobre a seqüência de caracteres compactada acdfghjmopqrsbeiknl. Isso representa a lista de consoantes iniciais da Coréia do Sul (numeradas usando o alfabeto minúsculo ocidental) na ordem do dicionário da Coréia do Norte.

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

Loop sobre a sequência compactada 02468cdhik1357bgj9eaf . Isso representa a lista de vogais sul-coreanas (numeradas usando dígitos ASCII e alfabeto minúsculo) na ordem do dicionário norte-coreano.

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

Loop sobre a sequência compactada 013456789abcdefghijlmnopqr2k . Isso representa a lista de consoantes finais sul-coreanas (usando a mesma numeração que as vogais) na ordem do dicionário norte-coreano.

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

Concatene a vogal e a consoante final e decodifique como um número 28 base, depois adicione 588 vezes a vogal inicial e 0xAC00. Imprima todos os caracteres da entrada que tenham isso como ordinal.

Neil
fonte
Os caracteres de substituição são sintaxe válida?
Dannyu NDos 14/10/19
@DannyuNDos Representa o valor de bytes \xFFna página de códigos do carvão vegetal.
Neil