Einführung
Es ist ein bisschen wie das DVORAK-Tastaturlayout , aber VIEL schwerer.
Lassen Sie uns zuerst über die koreanische Tastatur sprechen. Wie Sie in Wikipedia sehen können , gibt es einen Kor / Eng-Schlüssel, mit dem Sie zwischen koreanischen und englischen Schlüsselsätzen wechseln können.
Koreaner tippen manchmal falsch: Sie versuchen, auf einer QWERTY-Tastatur auf Koreanisch oder auf einer Tastatur mit zwei Sätzen auf Englisch zu schreiben.
Also, hier ist das Problem: Wenn Sie koreanische Zeichen in einer Tastatur mit zwei Tastensätzen eingegeben haben, konvertieren Sie diese in alphabetische Zeichen, die in einer QWERTY-Tastatur eingegeben wurden. Wenn Sie in qwerty eingegebene alphabetische Zeichen haben, ändern Sie diese in eine Tastatur mit zwei Sätzen.
Tastatur mit zwei Sätzen
Hier ist das Tastaturlayout mit zwei Sätzen:
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
ㅋㅌㅊㅍㅠㅜㅡ
und mit Shift-Taste:
ㅃㅉㄸㄲㅆㅛㅕㅑㅒㅖ
Nur die oberste Reihe ändert sich, die anderen nicht.
Über koreanische Schriftzeichen
wenn es hier endete, könnte es einfach sein, aber nein. Wenn Sie tippen
dkssud, tprP!
Die Ausgabe wird nicht wie folgt angezeigt:
ㅇㅏㄴㄴㅕㅇ, ㅅㅔㄱㅖ!
aber so:
안녕, 세계!(means Hello, World!)
und es macht die Dinge viel schwieriger.
Koreanische Zeichen teilen sich in drei Teile: 'Choseong (Konsonant)', 'Jungseong (Vokal)' und 'Jongseong (Konsonant am Ende der Silbe: kann leer sein)', und Sie müssen es trennen.
Glücklicherweise gibt es dafür einen Weg.
Wie trenne ich mich?
Es gibt 19 Choseong, 21 Jungseong und 28 Jongseong (mit Leerzeichen) und 0xAC00 ist '가', das erste Zeichen der koreanischen Zeichen. Auf diese Weise können wir koreanische Zeichen in drei Teile unterteilen. Hier ist die Reihenfolge von jedem und seiner Position in Tastatur mit zwei Sätzen.
wähle eine Reihenfolge:
ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
r R s e E f a q Q t T d w W c z x v g
jungseong Bestellung:
ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ
k o i O j p u P h hk ho hl y n nj np nl b m ml l
jongseong Bestellung:
()ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ
()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
Lassen Sie uns sagen (unicode value of some character) - 0xAC00
ist Korean_code
, und der Index von Choseong, Jungseong, Jongseong ist Cho
, Jung
, Jong
.
Dann Korean_code
ist(Cho * 21 * 28) + Jung * 28 + Jong
Hier ist der JavaScript - Code , die koreanischen Zeichen trennen von dieser koreanischen Website, für Ihre Bequemlichkeit.
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]);
Im zusammengebauten Zustand
- Beachten Sie, dass
ㅘ
,ㅙ
,ㅚ
,ㅝ
,ㅞ
,ㅟ
,ㅢ
ist eine Kombination aus anderen jungseongs.
ㅗ+ㅏ=ㅘ, ㅗ+ㅐ=ㅙ, ㅗ+ㅣ=ㅚ, ㅜ+ㅓ=ㅝ, ㅜ+ㅔ=ㅞ, ㅜ+ㅣ=ㅟ, ㅡ+ㅣ=ㅢ
- Choseong ist notwendig. Das heißt, wenn
frk
gegeben ist, was istㄹㄱㅏ
, kann es sich auf zwei Arten ändern:ㄺㅏ
undㄹ가
. Dann müssen Sie es in einen Weg umwandeln, der Choseong hat. Wennjjjrjr
gegeben,ㅓㅓㅓㄱㅓㄱ
haben führendeㅓ
s nichts, was gewählt werden kann, aber das vierteㅓ
hatㄱ
, was gewählt werden kann, also wird es in geändertㅓㅓㅓ걱
.
Ein weiteres Beispiel: 세계
( tprP
). Es kann in 섹ㅖ
( (ㅅㅔㄱ)(ㅖ)
) geändert werden , aber da Choseong erforderlich ist, wird es in 세계
( (ㅅㅔ)(ㄱㅖ)
) geändert.
Beispiele
Eingang 1
안녕하세요
Ausgang 1
dkssudgktpdy
Eingang 2
input 2
Ausgang 2
ㅑㅞㅕㅅ 2
eingang 3
힘ㄴㄴ
Ausgang 3
glass
eingang 4
아희(Aheui) is esolang which you can program with pure Korean characters.
Ausgang 4
dkgml(모뎌ㅑ) ㅑㄴ ㄷ내ㅣ뭏 조ㅑ초 ㅛㅐㅕ ㅊ무 ㅔ갷ㄱ므 쟈소 ㅔㅕㄱㄷ ㅏㅐㄱㄷ무 촘ㄱㅁㅊㅅㄷㄱㄴ.
eingang 5
dkssud, tprP!
Ausgang 5
안녕, 세계!
eingang 6
ㅗ디ㅣㅐ, 째깅! Hello, World!
Ausgang 6
hello, World! ㅗ디ㅣㅐ, 째깅!
Kürzester Code gewinnt. (in Bytes)
Neue Regel für Sie Bequemlichkeit
Sie können Zeichen A
, die nicht das Gegenstück zu einer Tastatur mit zwei Sätzen haben, verwerfen . so Aheui
zu Aㅗ뎌ㅑ
ist OK. Aber, wenn Sie ändern Aheui
zu 모뎌ㅑ
können Sie erhalten -5 Punkt, so dass Sie 5 Byte verdienen.
Sie können zwei jungseongs trennen (wie ㅘ
zu ㅗ+ㅏ
). wie rhk
auf 고ㅏ
oder how
zu ㅗㅐㅈ
. Aber wenn man es kombinieren (wie rhk
auf 과
oder how
zu ㅙㅈ
), können Sie zusätzliche -5 Punkte.
l
danachml
für das koreanische Symbol zu fehlenㅣ
.fjfau
könnte als럶ㅕ
oder interpretiert werden럴며
. Wie lösen wir das?tprP
im Testfall 5: Dies wandelt sich inㅅㅔㄱㅖ
, woㅅ
ein Choseong ist,ㅔ
ist ein Jungseong undㄱ
ist ein Jongseong. So should't verwandeln diese in섷ㅖ
(gruppiert wie(ㅅㅔㄱ)(ㅖ)
) statt세계
(gruppiert wie(ㅅㅔ)(ㄱㅖ)
)? In einem früheren Kommentar geben Sie an, dass es durch Tippen interpretiert wird, also würde ich erwartenㅅㅔㄱ
, dass es sich in verwandelt섷
. Oder tippt Koreanisch von rechts nach links statt von links nach rechts?가
) bis D7AF (힣
).Antworten:
Jelly ,
296264 BytesProbieren Sie es online!
Ein vollständiges Programm, das eine Zeichenfolge als Argument verwendet und eine Zeichenfolge zurückgibt (die implizit gedruckt wird). Dies funktioniert in drei Schritten: Zuerst werden alle koreanischen Zeichen in Codepunktlisten für die lateinischen Buchstaben konvertiert. Anschließend werden die zusammengesetzten koreanischen Zeichen identifiziert und erstellt. Schließlich werden alle verbleibenden lateinischen Streubuchstaben dem koreanischen Äquivalent zugeordnet. Beachten Sie, dass andere Zeichen und lateinische Buchstaben, die nicht in der Spezifikation enthalten sind (z. B.
A
), in Ruhe gelassen werden.Wenn eine Konvertierung von Großbuchstaben außerhalb der Spezifikation in Kleinbuchstaben erforderlich ist, kann dies gegen einen Aufpreis von zusätzlichen 10 Byte erfolgen .
Erläuterung
Hilfslink 1 : dyadischer Link mit den Argumenten x und y. x ist eine Liste von Paaren von Unterlisten zum Suchen und Ersetzen. y lässt jede Such-Unterliste durch die entsprechende Ersetzungs-Unterliste ersetzen
Hilfslink 2 : Liste der lateinischen Zeichen / Zeichenpaare in der Reihenfolge, die der Unicode-Reihenfolge der koreanischen Zeichen entspricht
Hilfslink 3 : Listen lateinischer Zeichen, die für Choseong, Jungseong und Jongseong verwendet werden
Hilfslink 4 : Über Listen von lateinischen Zeichen, die in absteigender Reihenfolge der Länge aufgelistet und sortiert sind
Hauptlink : Monade, die eine Jelly-Zeichenfolge als Argument verwendet und die übersetzte Jelly-Zeichenfolge zurückgibt
Abschnitt 1 : Konvertieren Sie morphemische Blöcke in die Unicode-Codepunkte der entsprechenden lateinischen Zeichen
Abschnitt 1.1 : Liste der lateinischen Zeichen abrufen, die zum Erstellen der Blöcke erforderlich sind
Abschnitt 1.2 : Erstellen Sie alle Kombinationen dieser Buchstaben (19 × 21 × 28 = 11.172 Kombinationen in der entsprechenden lexikalischen Reihenfolge)
Abschnitt 1.3 : Koppeln Sie die Unicode-Codepunkte der Blöcke mit der entsprechenden Liste lateinischer Zeichen und verwenden Sie diese, um die morphemischen Blöcke in der Eingabezeichenfolge zu übersetzen
Abschnitt 2 : Konvertieren Sie die einzelnen koreanischen Zeichen in der Ausgabe von Abschnitt 1 in die Codepunkte des lateinischen Äquivalents
Abschnitt 3 : Nicht übersetzte Zeichen in der Ausgabe von Abschnitt 2 aufräumen (funktioniert, weil alles, was aus dem Koreanischen übersetzt wurde, jetzt in einer Unterliste enthalten ist und die Tiefe 1 hat)
Abschnitt 4 : Konvertieren von Morphemblöcken aus lateinischen Zeichen in Koreanisch
Abschnitt 4.1 : Holen Sie sich alle möglichen Kombinationen von Choseong und Jungseong
Abschnitt 4.2 : Beschriften Sie jede Kombination mit dem Unicode-Codepunkt für den Basismorphemieblock (dh ohne Jongseong)
Abschnitt 4.3 : Ersetzen Sie diese Zeichenfolgen aus lateinischen Zeichen in der Ausgabe von Abschnitt 3 durch die Unicode-Codepunkte des Basis-Morphemblocks
Abschnitt 4.4: Identifizieren Sie, ob es einen Jongseong als Teil jedes Morphemblocks gibt
Abschnitt 5 : Behandeln Sie verbleibende lateinische Zeichen, die mit koreanischen Zeichen übereinstimmen, jedoch nicht Teil eines Morphemuc-Blocks sind
quelle
책
, habe ich ausgenommencor
, aber es gabcBor
. Und es ändert sich nichtc
zuㅊ
.can
musste konvertiert inㅊ무
, aber es konvertiert inc무
. Und ich habe auch große Zeichen, die nicht in der Spezifikation erscheinen, dekapitalisiert, aber es kann in Ordnung sein.A
als Platzhalter für das zweite Zeichen eines einzelnen Zeichens verwendet, und aus irgendeinem Grund kam das folgende Zeichenc
alsB
. Die Umstellung auf Kleinbuchstaben anderer Buchstaben könnte erfolgen, ist jedoch eine unnötige Komplikation für die ohnehin schwierige Aufgabe.JavaScript (Node.js) ,
587582575569557554550549 Bytestfw das wusstest du nicht
string.charCodeAt() == string.charCodeAt(0)
.Probieren Sie es online!
547, wenn Zeichen außerhalb von Alphabeten und koreanischen Jamos ignoriert werden können.
Okay, ich hatte so lange Mühe, das zu schreiben, aber das sollte funktionieren.
Es wird kein koreanisches Jamo / keine koreanische Silbe verwendet, da sie zu teuer sind (3 Bytes pro Verwendung).Wird im regulären Ausdruck zum Speichern von Bytes verwendet.quelle
Wolfram Language (Mathematica) ,
405401400 BytesProbieren Sie es online!
Leicht ungolfed
Um dies in Mathematica zu testen, ersetzen Sie einfach
alphabet
mitAlphabet
; TIO unterstützt jedoch nicht die Wolfram Cloud, die ich definiert habeAlphabet["Korean"]
im Header .Wir zerlegen zuerst alle Hangul-Silben in das Hangul-Alphabet, tauschen dann die lateinischen und Hangul-Zeichen aus und setzen dann die Silben neu zusammen.
quelle
input 2
inㅑㅜㅔㅕㅅ 2
stattㅑㅞㅕㅅ 2
in Ihrem TIO. Obwohl das gleiche in der Lösung passiert, an der ich gearbeitet habe, da beideㅜ
undㅔ
jungseong sind, und ich den Eindruck hatte, dass nur Choseong + Jungseong + Jongseong oder Choseong + Jungseong + Leer kombiniert werden würden. Ich bat OP um Überprüfung, warumㅜㅔ
wurdeㅞ
.fnpfa
sollte es sich um ein einzelnes Zeichen handeln뤪
, das stattdessen als루ㅔㄹㅁ
Java 19,
113311261133 BytesAusgaben mit Großbuchstaben
ASDFGHJKLZXCVBNM
unverändert, da.toLowerCase()
mehr als der -5 Bonus kostet.Back +7 Bytes als Bugfix für nicht-koreanische Zeichen über Unicode-Wert 20.000 (danke @NickKennedy für das Bemerken).
Probieren Sie es online aus.
Erläuterung:
quelle
44032 + 19×21×28 - 1