Ja, im Grunde bist du ein Romanizer, Baby , aber härter . wie viel schwieriger.
Koreanisch lernen ist hart. Zumindest für eine Person außerhalb Asiens. Aber sie haben wenigstens die Chance zu lernen, oder?
Was müssen Sie tun?
Sie erhalten eine koreanische Erklärung. Zum Beispiel 안녕하세요
. Sie müssen die Eingabe in die römische Aussprache konvertieren. Für das gegebene Beispiel kann die Ausgabe sein annyeonghaseyo
.
Jetzt wird es technisch
Ein koreanisches Zeichen besteht aus drei Teilen: Startkonsonant, Vokal und Endkonsonant. Der Endkonsonant darf im Charakter nicht vorhanden sein.
Zum Beispiel 아
ist ㅇ
(Startkonsonant) und ㅏ
(Vokal) und 손
ist ㅅ
(Startkonsonant), ㅗ
(Vokal) undㄴ
(Endkonsonant).
Evert Konsonant und Vokal hat seine Aussprache. Die Aussprache für jeden Konsonanten ist wie folgt.
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
(- bedeutet keine Aussprache oder nicht verwendet. Sie müssen nicht damit umgehen.)
und Aussprache für jeden Vokal ist wie folgt.
Hangul ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ
Romanization a ae ya yae eo e yeo ye o wa wae oe yo u wo we wi yu eu ui i
Jetzt ist es der wirklich schwierige Teil
Die Aussprache des Konsonanten ändert sich durch den Endkonsonanten in vor. Die Aussprache für jeden Start- / Endkonsonanten ist wie folgt. (Zwischen den Aussprachen muss kein Bindestrich eingefügt werden. Dies ist nicht erforderlich. Wenn eine Zelle zwei oder mehr Aussprachen enthält, wählen Sie eine aus. Wenn es keinen Endkonsonanten gibt, verwenden Sie die ursprüngliche Aussprache.)
Beispiele
Korean => English
안녕하세요 => annyeonghaseyo
나랏말싸미 듕귁에달아 => naranmalssami dyunggwigedara //See how the ㅅ in 랏 changes from 't' to 'n'
Beispielvorschlag begrüßt. Sie können Antworten auf Ihre eigene Eingänge bekommen hier . (Der in "Allgemeiner Text", Überarbeitet ist das, wonach ich bitte)
quelle
ㅎ
gefolgt vonㄱ, ㄷ, ㅈ
sind auch Sonderfälle (sie werden angesaugtㅋ, ㅌ, ㅈ
(k, t, j)) sollten diese auch hervorheben.Antworten:
Python 3.6,
400394 BytesEdit: Danke an RootTwo für -6 Bytes.
Dies ist meine erste Einsendung bei CodeGolf, daher bin ich mir ziemlich sicher, dass es bessere Möglichkeiten zum Golfen gibt, aber ich dachte, ich würde sie trotzdem posten, da noch niemand die Schlüsselidee erwähnt hat und diese immer noch deutlich kürzer ist als bei anderen Lösungen .
Wie es funktioniert
Die Lösung versucht, die Tatsache auszunutzen (die ich aus der ursprünglichen japanischen Romanisierung gelernt habe), dass romanisierte Zeichennamen über Pythons Unicode-Datenmodul zugänglich sind. Für die koreanische Sprache haben sie die Form von
HANGUL SYLLABLE <NAME>
. Leider erfordert die Verarbeitung dieser Namen, um die angegebene Spezifikation zu erfüllen und alle Silbenkombinationsszenarien abzudecken, immer noch einiges an Aufwand (und Bytes).Die erhaltenen Charakternamen listen alle Konsonanten in ihrer stimmhaften Form irgendwo in der Silbe auf, zB
GGAGG
für깎
,R/L
werden wie beabsichtigt transkribiert (AnfangR
, EndeL
) undCH
wie angegebenC
(dies erspart uns tatsächlich ein bisschen Kopfschmerzen).Zuerst
HANGUL SYLLABLE
entfernen wir den Teil (die ersten 16 Zeichen) und markieren die Silbengrenzen mit-
entfernen und wenden dann eine Reihe von RegEx'es an, um die Konvertierungen durchzuführen.Der erste RegEx sieht besonders böse aus. Was es im Grunde tut, ist die Umwandlung von Anfangskonsonanten in ihre Endäquivalente (auch das Entfernen des zusätzlichen Buchstabens im Falle von Doppelkonsonanten), wenn ihnen kein Vokal folgt oder für einige Buchstaben - wenn ihnen ein vorangestellt ist
h
. Das(?<!n)
Lookbehind verhindert das Matching,g
das Teil von istng
, und(?!\\1)
Lookahead stellt sicher, dass wir nicht konvertieren, z . B.ssa
nachtsa
.Die nächsten RegEx konvertieren ausgehende Doppelkonsonanten in ihre stimmlosen Äquivalente. Hier
-
bieten sich auch Trennzeichen an, um Grenzkollisionen (g-g
) von Doppelkonsonanten (gg
) zu unterscheiden. Jetzt können sie auch entfernt werden.Als nächstes behandeln wir die verbleibenden
h+consonant
Kombinationen,l->r
vor Vokalen und anderen Sonderfällen.Schließlich restaurieren wir
c
aufch
, und einige andere Besonderheiten unserer eingehenden char Namen auflösen, wieyi
stattui
undweo
stattwo
.Ich bin kein Experte für Koreanisch und kann nicht viel mehr dazu sagen, aber dies scheint alle Tests zu bestehen, die in der Aufgabe und auf Github veröffentlicht wurden. Offensichtlich könnten ein paar Bytes mehr abgeschnitten werden, wenn die Ausgabe in Großbuchstaben akzeptabel ist, da wir dies von der Namensfunktion erhalten.
quelle
m[0]
ist es dasselbe wiem.group(0)
; Einsparung von 6 Bytes.JavaScript (ES6), 480 Byte (WIP)
Dies ist ein früher Versuch, der auf den aktuellen Spezifikationen basiert, um den Ball ins Rollen zu bringen. Möglicherweise ist eine Korrektur erforderlich, wenn die Fragen in den Kommentaren beantwortet werden.
Testfälle
Code-Snippet anzeigen
Wie?
Nach dem Dekomprimieren enthält das Array V die folgenden Daten:
Wir teilen jeden Hangul-Charakter in Anfangskonsonanten, Vokale und Endkonsonanten auf. Wir hängen an das Ergebnis an:
V[80 + substitution] + V[vowel]
wenn es einen austausch gibtV[40 + previousEndingConsonant] + V[21 + startingConsonant] + V[vowel]
Andernfallsquelle
'!'
nicht sein33
?c
ist kein Byte. Es ist eine 1-stellige Zeichenfolge. Das heißt , wenn eine arithmetische Operation angewendet wird, wird ein Leerzeichen gezwungen,0
während andere nicht-stellige Zeichen gezwungen werdenNaN
. Was bedeutet, dassc<1
das eigentlich wie erwartet funktionieren sollte. (Undc<33
würde auch für nicht-stellige Zeichen funktionieren, obwohl dies irgendwie zufällig ist.)c<1
wäre auch wahr"0"
(was wahrscheinlich in Ordnung ist, wenn die Eingabe garantiert keine arabische Ziffer enthält.)Tcl, 529 Bytes
Algorithmus
Dieser Algorithmus wird zum Zweck der Herausforderung zerkleinert. der Kompromiss ist , dass der Eingang angenommen wird , nicht enthalten keine lateinischen Buchstaben, noch Zeichen außerhalb des U + AC00 Hangul - Block zu verwenden , wie in der Herausforderung beschrieben. Wäre dies der richtige Code, würde ich alle Transformationen in Jamo bis zum letzten Durchgang beibehalten.
Ich nehme an, ich könnte noch ein bisschen mehr Geisteskraft aufbringen, um diese Vokale und einige der Wiederholungen in der Nachschlagetabelle zu knacken, aber das ist so gut, wie es heute von mir kommt.
Testen
Stellen Sie sicher, dass Sie den Tcl-Interpreter mit UTF-8-Eingaben versorgen können. Dies wird am einfachsten mit einer einfachen UTF-8-Textdatei erreicht. Leider ist Tcl immer noch nicht standardmäßig auf UTF-8 eingestellt. das hat mich 33 bytes gekostet.
Hier ist meine (derzeit erbärmliche) Testdatei:
Anmerkungen
Ich weiß nichts über die koreanische Sprache (außer dem, was ich hier noch nicht gelernt habe). Dies ist ein erster Versuch, der aufgrund von Aktualisierungen in der Fragenspezifikation möglicherweise überarbeitet werden muss.
Darüber sind einige zusätzliche Informationen hilfreich. Insbesondere gibt es keine 1: 1-Entsprechung zwischen Lead- und Tail-Konsonanten, wie dies in der Herausforderung nahegelegt wird. Die folgenden beiden Websites halfen dabei, das immens herauszufinden:
• Wikipedia: Koreanische Sprache, Hangul
• Wikipedia: Hangul Jamo (Unicode-Block)
quelle