Oui, c'est fondamentalement tu es un romaniseur, bébé , mais plus dur . comme, beaucoup plus dur.
Apprendre le coréen est difficile. au moins pour une personne en dehors de l'Asie. Mais ils ont au moins la chance d'apprendre, non?
Ce que vous devez faire
Vous recevrez une déclaration coréenne. Par exemple 안녕하세요
,. Vous devez convertir l'entrée en sa prononciation romaine. Pour l'exemple donné, la sortie peut être annyeonghaseyo
.
Maintenant ça devient technique
Un caractère coréen comporte trois parties, la consonne de départ, la voyelle et la consonne de fin. La consonne de fin peut ne pas exister dans le caractère.
Par exemple, 아
est ㅇ
(Consonne de départ) et ㅏ
(Voyelle), et 손
est ㅅ
(Consonne de départ), ㅗ
(Voyelle) et ㄴ
(Consonne de fin).
Evert consonne et voyelle a sa prononciation. La prononciation de chaque consonne est la suivante.
Korean ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ
Romanization Starting g kk n d tt r m b pp s ss – j jj ch k t p h
Ending k k n t – l m p – t t ng t – t k t p h
(- signifie pas de prononciation ou non utilisé. vous n'avez pas à les gérer.)
et la prononciation de chaque voyelles est la suivante.
Hangul ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ
Romanization a ae ya yae eo e yeo ye o wa wae oe yo u wo we wi yu eu ui i
Maintenant c'est la vraie partie difficile
La prononciation de la consonne change par la consonne de fin en avant. La prononciation de chaque consonne de début / fin est la suivante. (Vous n'avez pas besoin de faire le trait d'union entre les prononciations. Ce n'est pas nécessaire. Si une cellule a deux prononciations ou plus, choisissez-en une. S'il n'y a pas de consonne de fin, utilisez la prononciation originale.)
Exemples
Korean => English
안녕하세요 => annyeonghaseyo
나랏말싸미 듕귁에달아 => naranmalssami dyunggwigedara //See how the ㅅ in 랏 changes from 't' to 'n'
Exemple de suggestion bienvenu. Vous pouvez obtenir des réponses pour vos propres contributions ici . (Celui du "texte général", révisé est ce que je demande)
la source
ㅎ
suiviㄱ, ㄷ, ㅈ
sont également des cas particuliers (ils deviennent aspirés àㅋ, ㅌ, ㅈ
(k, t, j)) devrait mettre en évidence ceux qui sont trop.Réponses:
Python 3.6,
400394 octetsEdit: Merci à RootTwo pour -6 octets.
Ceci est ma première soumission sur CodeGolf, donc je suis presque sûr qu'il existe de meilleures façons de jouer au golf, mais je pensais que je le posterais, car personne n'a encore mentionné l'idée clé, et cela est encore beaucoup plus court que les autres solutions. .
Comment ça fonctionne
La solution tente d'exploiter le fait (que j'ai appris du défi de romanisation japonais d'origine) que les noms de caractères romanisés sont accessibles via le module unicodedata de Python. Pour la langue coréenne, ils prennent la forme de
HANGUL SYLLABLE <NAME>
. Malheureusement, le traitement de ces noms pour répondre aux spécifications fournies et pour couvrir tous les scénarios de combinaison de syllabes nécessite encore pas mal d'efforts (et d'octets).Les noms de caractères obtenus répertorient toutes les consonnes sous leur forme vocale n'importe où dans la syllabe, par exemple
GGAGG
pour깎
,R/L
sont transcrites comme prévu (débutR
, finL
) etCH
sont données commeC
(cela nous évite en fait un peu de mal de tête).Tout d'abord, nous supprimons la
HANGUL SYLLABLE
partie (les 16 premiers caractères), marquons les limites des syllabes avec-
, puis appliquons une série de RegEx'es pour effectuer les conversions.Le premier RegEx a l'air particulièrement méchant. Ce qu'il fait essentiellement, c'est la conversion des consonnes de départ en leurs équivalents finaux (en supprimant également la lettre supplémentaire en cas de doubles consonnes), lorsqu'elles ne sont pas suivies d'une voyelle, ou pour certaines lettres - lorsqu'elles sont précédées de
h
. Le(?<!n)
lookbehind empêche la correspondanceg
qui fait partie deng
, et(?!\\1)
lookahead garantit que nous ne convertissons pas, par exemple,ssa
entsa
.Les prochains RegEx'es convertissent les doubles consonnes de départ en leurs équivalents non vocaux. Voici où les
-
séparateurs sont également utiles car ils aident à discerner les collisions aux limites (g-g
) des consonnes doubles (gg
). Maintenant, ils peuvent également être supprimés.Ensuite, nous traitons les
h+consonant
combinaisons restantes ,l->r
avant les voyelles, et d'autres cas spéciaux.Enfin, nous rétablissons
c
àch
et résoudre quelques autres particularités de nos noms char entrants, comme auyi
lieu deui
et auweo
lieu dewo
.Je ne suis pas un expert en coréen et je ne peux pas en dire plus, mais cela semble passer tous les tests publiés dans la tâche et sur Github. Évidemment, quelques octets supplémentaires pourraient être supprimés, si la sortie est acceptable en majuscules, car c'est ce que nous obtenons de la fonction de nom.
la source
m[0]
est identique àm.group(0)
; économiser 6 octets.JavaScript (ES6), 480 octets (WIP)
Il s'agit d'une première tentative basée sur les spécifications actuelles pour faire rouler la balle. Cela peut nécessiter une correction lorsque les questions dans les commentaires sont traitées.
Cas de test
Afficher l'extrait de code
Comment?
Une fois décompressé, le tableau V contient les données suivantes:
Nous divisons chaque caractère Hangul en consonne de départ, voyelle et consonne de fin. On ajoute au résultat:
V[80 + substitution] + V[vowel]
s'il y a une substitutionV[40 + previousEndingConsonant] + V[21 + startingConsonant] + V[vowel]
autrementla source
'!'
pas l'être33
?c
n'est pas un octet. C'est une chaîne de 1 caractère. Cela dit , lors de l'application d'une opération arithmétique, un espace est contraint0
tandis que d'autres caractères non numériques sont contraintsNaN
. Ce qui signifie que celac<1
devrait réellement fonctionner comme prévu. (Etc<33
cela fonctionnerait également pour les caractères non numériques, bien que ce soit un peu fortuit.)c<1
serait également vrai pour"0"
(ce qui est probablement OK si l'entrée est garantie de ne contenir aucun chiffre arabe.)Tcl, 529 octets
Algorithme
Cet algorithme est resserré aux fins du défi; le compromis étant que l'entrée est supposée ne contenir aucun caractère alphabétique latin, ni utiliser des caractères en dehors du bloc Hangul U + AC00 comme décrit dans le défi. Si c'était ce vrai code, je garderais toutes les transformations dans Jamo jusqu'à la passe finale.
Je suppose que je pourrais jeter un peu plus de cervelle à croquer ces voyelles et certaines des répétitions dans la table de recherche, mais c'est aussi bon que ce que je reçois de moi aujourd'hui.
Essai
Assurez-vous que vous pouvez fournir une entrée UTF-8 à l'interpréteur Tcl. Cela est plus facile à réaliser avec un simple fichier texte UTF-8. Hélas, Tcl n'est toujours pas par défaut UTF-8 par défaut; cela m'a coûté 33 octets.
Voici mon fichier de test (actuellement pathétique):
Remarques
Je ne connais rien à la langue coréenne (sauf le peu que j'ai appris ici). Il s'agit d'une première tentative, en attendant une éventuelle révision en raison de mises à jour de la spécification de la question.
Et, à ce sujet, quelques informations supplémentaires sont utiles. En particulier, il n'y a pas de correspondance 1: 1 entre les consonnes de tête et de queue, comme semble le suggérer le défi. Les deux sites suivants ont énormément aidé à comprendre cela:
• Wikipedia: langue coréenne, Hangul
• Wikipedia: Hangul Jamo (bloc Unicode)
la source