introduction
C'est un peu comme la disposition du clavier DVORAK , mais BEAUCOUP plus difficile.
Parlons d'abord du clavier coréen. Comme vous pouvez le voir sur Wikipedia , il existe une clé Kor / Eng pour basculer entre les jeux de clés coréens et anglais.
Les Coréens tapent parfois mal: ils essaient d'écrire en coréen sur un clavier qwerty ou en anglais sur un clavier à deux jeux.
Donc, voici le problème: si des caractères coréens donnés sont saisis sur un clavier à deux jeux, convertissez-les en caractères alphabétiques tapés sur le clavier qwerty. Si des caractères alphabétiques donnés sont saisis dans qwerty, remplacez-le par un clavier à deux jeux.
Clavier à deux jeux
Voici la disposition du clavier à deux ensembles:
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
ㅋㅌㅊㅍㅠㅜㅡ
et avec la touche shift:
ㅃㅉㄸㄲㅆㅛㅕㅑㅒㅖ
seule la rangée du haut change tandis que les autres ne le font pas.
À propos des caractères coréens
si ça se terminait ici, ça pourrait être facile, mais non. Lorsque vous tapez
dkssud, tprP!
la sortie n'est pas affichée de cette manière:
ㅇㅏㄴㄴㅕㅇ, ㅅㅔㄱㅖ!
mais de cette façon:
안녕, 세계!(means Hello, World!)
et cela rend les choses beaucoup plus difficiles.
Les caractères coréens sont séparés en trois parties: «Choseong (consonne)», «Jungseong (voyelle)» et «Jongseong (consonne à la fin de la syllabe: peut être vide)», et vous devez le séparer.
Heureusement, il existe un moyen de le faire.
Comment se séparer
Il y a 19 Choseong, 21 Jungseong et 28 Jongseong (avec blanc), et 0xAC00 est '가', premier caractère des caractères coréens. En utilisant cela, nous pouvons séparer les caractères coréens en trois parties. Voici l'ordre de chacun et sa position sur un clavier à deux jeux.
ordre choisi:
ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
r R s e E f a q Q t T d w W c z x v g
ordre jungseong:
ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ
k o i O j p u P h hk ho hl y n nj np nl b m ml l
ordre de jongseong:
()ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ
()r R rt s sw sg e f fr fa fq ft fx fv fg a q qt t T d w c z x v g
Let dire l' (unicode value of some character) - 0xAC00
est Korean_code
, et l' indice de TCH'ÔSONG, djoungsong, Jongseong est Cho
, Jung
, Jong
.
Alors, Korean_code
est(Cho * 21 * 28) + Jung * 28 + Jong
Voici le code javascript qui sépare le caractère coréen de ce site Web coréen, pour votre commodité.
var rCho = [ "ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ" ];
var rJung =[ "ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ" ];
var rJong = [ "", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ","ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ" ];
var cho, jung, jong;
var sTest = "탱";
var nTmp = sTest.charCodeAt(0) - 0xAC00;
jong = nTmp % 28; // Jeongseong
jung = ((nTmp - jong) / 28 ) % 21 // Jungseong
cho = ( ( (nTmp - jong) / 28 ) - jung ) / 21 // Choseong
alert("Choseong:" + rCho[cho] + "\n" + "Jungseong:" + rJung[jung] + "\n" + "Jongseong:" + rJong[jong]);
Une fois assemblé
- Notez que
ㅘ
,ㅙ
,ㅚ
,ㅝ
,ㅞ
,ㅟ
,ㅢ
est une combinaison d'autres jungseongs.
ㅗ+ㅏ=ㅘ, ㅗ+ㅐ=ㅙ, ㅗ+ㅣ=ㅚ, ㅜ+ㅓ=ㅝ, ㅜ+ㅔ=ㅞ, ㅜ+ㅣ=ㅟ, ㅡ+ㅣ=ㅢ
- Choseong est nécessaire. Cela signifie que si
frk
est donné, ce qui signifieㄹㄱㅏ
qu'il peut changer de deux manières:ㄺㅏ
etㄹ가
. Ensuite, vous devez le convertir d'une manière qui a choisiong. S'ils sontjjjrjr
donnés, c'est-à-direㅓㅓㅓㄱㅓㄱ
, les principauxㅓ
n'ont rien qui puisse être choisi, mais le quatrièmeㅓ
aㄱ
qui peut être choisi, alors c'est changé enㅓㅓㅓ걱
.
Un autre exemple: 세계
( tprP
). Il peut être changé en 섹ㅖ
( (ㅅㅔㄱ)(ㅖ)
), mais comme chose est nécessaire, il est changé en 세계
( (ㅅㅔ)(ㄱㅖ)
)
Exemples
entrée 1
안녕하세요
sortie 1
dkssudgktpdy
entrée 2
input 2
sortie 2
ㅑㅞㅕㅅ 2
entrée 3
힘ㄴㄴ
sortie 3
glass
entrée 4
아희(Aheui) is esolang which you can program with pure Korean characters.
sortie 4
dkgml(모뎌ㅑ) ㅑㄴ ㄷ내ㅣ뭏 조ㅑ초 ㅛㅐㅕ ㅊ무 ㅔ갷ㄱ므 쟈소 ㅔㅕㄱㄷ ㅏㅐㄱㄷ무 촘ㄱㅁㅊㅅㄷㄱㄴ.
entrée 5
dkssud, tprP!
sortie 5
안녕, 세계!
entrée 6
ㅗ디ㅣㅐ, 째깅! Hello, World!
sortie 6
hello, World! ㅗ디ㅣㅐ, 째깅!
Le code le plus court gagne. (en octets)
Nouvelle règle pour votre commodité
Vous pouvez ignorer des caractères comme ceux A
qui n'ont pas d'équivalent dans un clavier à deux jeux. donc Aheui
à Aㅗ뎌ㅑ
est OK. Mais, si vous passez Aheui
à 모뎌ㅑ
, vous pouvez obtenir -5 points, vous pouvez donc gagner 5 octets.
Vous pouvez séparer deux jungseongs (comme ㅘ
pour ㅗ+ㅏ
). comme rhk
à 고ㅏ
, ou how
à ㅗㅐㅈ
. Mais si vous le combinez (comme rhk
à 과
ou how
à ㅙㅈ
), vous pouvez gagner -5 points supplémentaires.
l
aprèsml
pour le symbole coréenㅣ
.fjfau
pourrait être interprété comme럶ㅕ
ou럴며
. Comment résolvons-nous cela?tprP
dans le cas de test 5: cela se transforme enㅅㅔㄱㅖ
, oùㅅ
est un chose choisie,ㅔ
est une jungseong etㄱ
est une jongseong. Donc, cela ne devrait-il pas se transformer en섷ㅖ
(groupé comme(ㅅㅔㄱ)(ㅖ)
) au lieu de세계
(groupé comme(ㅅㅔ)(ㄱㅖ)
)? Dans un commentaire précédent, vous déclarez qu'il s'agit d'interpréter en tapant, donc je m'attendraisㅅㅔㄱ
à le transformer en섷
. Ou le coréen tape-t-il de droite à gauche au lieu de gauche à droite?가
) à D7AF (힣
).Réponses:
Gelée ,
296264 octetsEssayez-le en ligne!
Un programme complet qui prend une chaîne comme argument et renvoie une chaîne (qui est implicitement imprimée). Cela fonctionne en trois passes: tout d'abord, il convertit tous les caractères coréens en listes de points de code pour les lettres latines. Ensuite, il identifie et construit les caractères coréens composés. Enfin, il transforme toutes les lettres latines errantes restantes en équivalent coréen. Notez que les autres caractères et lettres latines qui n'apparaissent pas dans la spécification (par exemple
A
) sont laissés seuls.Si une conversion en minuscules des majuscules en dehors des spécifications est nécessaire, cela peut être fait au coût de 10 octets supplémentaires .
Explication
Lien auxiliaire 1 : lien dyadique avec les arguments x et y. x est une liste de paires de recherche et de remplacement de sous-listes. y aura chaque sous-liste de recherche remplacée par la sous-liste de remplacement correspondante
Lien d'assistance 2 : Liste des caractères latins / paires de caractères dans l'ordre qui correspond à l'ordre Unicode des caractères coréens
Lien Aide 3 : Listes des caractères latins utilisés pour TCH'ÔSONG, djoungsong et Jongseong
Lien d'assistance 4 : listes ci-dessus de caractères latins énumérés et triés par ordre décroissant de longueur
Lien principal : Monade qui prend une chaîne Jelly comme argument et renvoie la chaîne Jelly traduite
Section 1 : Convertir les blocs morphémiques en points de code Unicode des caractères latins correspondants
Section 1.1 : Obtenez la liste des caractères latins nécessaires pour créer les blocs
Section 1.2 : Créez toutes les combinaisons de ces lettres (19 × 21 × 28 = 11 172 combinaisons dans l'ordre lexical approprié)
Section 1.3 : Associez les points de code Unicode des blocs avec la liste correspondante de caractères latins et utilisez-les pour traduire les blocs morphémiques dans la chaîne d'entrée
Section 2 : convertir les caractères coréens individuels dans la sortie de la section 1 en points de code de l'équivalent latin
Section 3 : Ranger les caractères non traduits dans la sortie de la section 2 (fonctionne parce que tout ce qui est traduit du coréen sera maintenant dans une sous-liste et aura donc la profondeur 1)
Section 4 : Convertir des blocs morphémiques de caractères latins en coréen
Section 4.1 : Obtenez toutes les combinaisons possibles de Choseong et Jungseong
Section 4.2 : Étiquetez chaque combinaison avec le point de code Unicode pour le bloc morphémique de base (c'est-à-dire sans Jongseong)
Section 4.3 : Remplacez ces chaînes de caractères latins dans la sortie de la section 3 par les points de code Unicode du bloc morphémique de base
Section 4.4: Identifier s'il existe un Jongseong dans chaque bloc morphémique
Section 5 : Gérer les caractères latins restants qui correspondent aux caractères coréens mais ne font pas partie d'un bloc morphemuc
la source
책
, j'exceptecor
, mais ça donnecBor
. Et cela ne changec
pasㅊ
.can
a dû se convertir enㅊ무
, mais il s'est converti enc무
. Et j'ai également excepté que les gros caractères qui n'apparaissent pas dans les spécifications seraient décapitalisés, mais cela peut être bien.A
comme espace réservé pour le deuxième caractère des caractères simples, et pour une raison quelconque, celui qui suivaitc
était unB
. La conversion en minuscules d'autres lettres pourrait être effectuée, mais ressemble à une complication inutile de ce qui est déjà un défi difficile.JavaScript (Node.js) ,
587582575569557554550549 octetstfw vous ne le saviez pas
string.charCodeAt() == string.charCodeAt(0)
.Essayez-le en ligne!
547 si les caractères en dehors des alphabets et des jamos coréens peuvent être ignorés.
D'accord, j'ai lutté si longtemps pour écrire ceci, mais cela devrait fonctionner.
Aucun jamo / syllabe coréen n'est utilisé car ils sont trop chers (3 octets par utilisation).Utilisé dans l'expression régulière pour enregistrer les octets.la source
Wolfram Language (Mathematica) ,
405401400 octetsEssayez-le en ligne!
Légèrement non golfé
Pour tester cela dans Mathematica, remplacez simplement
alphabet
parAlphabet
; cependant, TIO ne prend pas en charge Wolfram Cloud, je l'ai donc définiAlphabet["Korean"]
dans l'en-tête.Nous décomposons d'abord toutes les syllabes Hangul en alphabet Hangul, puis échangeons les caractères latins et Hangul, puis recomposons les syllabes.
la source
input 2
aboutit à laㅑㅜㅔㅕㅅ 2
place deㅑㅞㅕㅅ 2
votre TIO. Bien que la même chose se produise dans la solution sur laquelle je travaillais, car les deuxㅜ
etㅔ
sont jungseong, et j'avais l'impression que seuls choseong + jungseong + jongseong ou choseong + jungseong + vide seraient combinés. J'ai demandé pourquoi OP pour la vérificationㅜㅔ
est devenuㅞ
.fnpfa
devrait s'agir d'un seul personnage,뤪
mais finit par devenir루ㅔㄹㅁ
Java 19,
113311261133 octetsSorties avec majuscules
ASDFGHJKLZXCVBNM
inchangées, car.toLowerCase()
coûtent plus que le bonus -5.Retour +7 octets comme correction de bogue pour les caractères non coréens au-dessus de la valeur unicode 20 000 (merci @NickKennedy pour l'avoir remarqué).
Essayez-le en ligne.
Explication:
la source
44032 + 19×21×28 - 1