Wprowadzenie
Jest trochę podobny do układu klawiatury DVORAK , ale DUŻO trudniejszy.
Porozmawiajmy najpierw o koreańskiej klawiaturze. Jak widać w Wikipedii , istnieje klucz Kor / Eng do zmiany między zestawami kluczy koreańskiego i angielskiego.
Koreańczycy czasami źle wpisują: próbują pisać po koreańsku na klawiaturze qwerty lub po angielsku na dwuczęściowej klawiaturze.
Oto problem: jeśli podano koreańskie znaki wpisywane na dwuczęściowej klawiaturze, przekonwertuj je na znaki alfabetyczne wpisane na klawiaturze qwerty. Jeśli podano znaki alfabetyczne wpisane w qwerty, zmień je na klawiaturę z dwoma zestawami.
Dwuczęściowa klawiatura
Oto dwuczęściowy układ klawiatury:
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
ㅋㅌㅊㅍㅠㅜㅡ
i klawiszem Shift:
ㅃㅉㄸㄲㅆㅛㅕㅑㅒㅖ
zmienia się tylko górny wiersz, a inne nie.
O koreańskich znakach
jeśli to się tu skończy, może być łatwo, ale nie. Kiedy piszesz
dkssud, tprP!
dane wyjściowe nie są wyświetlane w ten sposób:
ㅇㅏㄴㄴㅕㅇ, ㅅㅔㄱㅖ!
ale w ten sposób:
안녕, 세계!(means Hello, World!)
i to znacznie utrudnia.
Koreańskie znaki dzielą się na trzy części: „Choseong (spółgłoska)”, „Jungseong (samogłoska)” i „Jongseong (spółgłoska na końcu sylaby: może być pusta)”, i trzeba to rozdzielić.
Na szczęście jest na to sposób.
Jak oddzielić
Jest 19 Choseong, 21 Jungseong i 28 Jongseong (z pustym miejscem), a 0xAC00 to „가”, pierwszy znak koreańskich znaków. Korzystając z tego, możemy podzielić koreańskie znaki na trzy części. Oto kolejność każdego z nich i jego pozycja na dwuczęściowej klawiaturze.
wybierz zamówienie:
ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
r R s e E f a q Q t T d w W c z x v g
zamówienie jungseong:
ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ
k o i O j p u P h hk ho hl y n nj np nl b m ml l
zamówienie 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
Powiedzmy Chodźmy (unicode value of some character) - 0xAC00
jest Korean_code
, a indeks CHOSEONG, Jungseong, Jongseong jest Cho
, Jung
, Jong
.
Więc Korean_code
jest(Cho * 21 * 28) + Jung * 28 + Jong
Oto kod javascript, który oddziela koreański znak od tej koreańskiej witryny, dla Twojej wygody.
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]);
Po zmontowaniu
- Należy zauważyć, że
ㅘ
,ㅙ
,ㅚ
,ㅝ
,ㅞ
,ㅟ
,ㅢ
jest kombinacją innych jungseongs.
ㅗ+ㅏ=ㅘ, ㅗ+ㅐ=ㅙ, ㅗ+ㅣ=ㅚ, ㅜ+ㅓ=ㅝ, ㅜ+ㅔ=ㅞ, ㅜ+ㅣ=ㅟ, ㅡ+ㅣ=ㅢ
- Choseong jest konieczny. Oznacza to, że jeśli
frk
zostanie podany, toㄹㄱㅏ
znaczy może się zmienić na dwa sposoby:ㄺㅏ
iㄹ가
. Następnie musisz przekształcić go w sposób, który wybrał. Jeślijjjrjr
podano, to znaczyㅓㅓㅓㄱㅓㄱ
, że wiodącyㅓ
nie mają niczego, co można by wybrać, ale czwartyㅓ
maㄱ
to, co można wybrać, więc zostało zmienione naㅓㅓㅓ걱
.
Kolejny przykład: 세계
( tprP
). Można go zmienić na 섹ㅖ
( (ㅅㅔㄱ)(ㅖ)
), ale ponieważ wybranie opcji jest konieczne, zmieniono na 세계
( (ㅅㅔ)(ㄱㅖ)
)
Przykłady
wejście 1
안녕하세요
wyjście 1
dkssudgktpdy
wejście 2
input 2
wyjście 2
ㅑㅞㅕㅅ 2
wejście 3
힘ㄴㄴ
wyjście 3
glass
wejście 4
아희(Aheui) is esolang which you can program with pure Korean characters.
wyjście 4
dkgml(모뎌ㅑ) ㅑㄴ ㄷ내ㅣ뭏 조ㅑ초 ㅛㅐㅕ ㅊ무 ㅔ갷ㄱ므 쟈소 ㅔㅕㄱㄷ ㅏㅐㄱㄷ무 촘ㄱㅁㅊㅅㄷㄱㄴ.
wejście 5
dkssud, tprP!
wyjście 5
안녕, 세계!
wejście 6
ㅗ디ㅣㅐ, 째깅! Hello, World!
wyjście 6
hello, World! ㅗ디ㅣㅐ, 째깅!
Najkrótszy kod wygrywa. (w bajtach)
Nowa zasada dla Twojej wygody
Możesz odrzucić znaki, A
które nie mają swojego odpowiednika na dwuczęściowej klawiaturze. tak Aheui
aby Aㅗ뎌ㅑ
jest OK. Ale jeśli zmienisz Aheui
na 모뎌ㅑ
, możesz uzyskać -5 punktów, dzięki czemu możesz zarobić 5 bajtów.
Możesz oddzielić dwa jungseongi (lubię ㅘ
to ㅗ+ㅏ
). jak rhk
do 고ㅏ
, lub how
do ㅗㅐㅈ
. Ale jeśli połączyć je (jak rhk
na 과
lub how
do ㅙㅈ
), można zarobić dodatkowe -5 punktów.
l
poml
koreańskim symboluㅣ
.fjfau
może być interpretowany jako럶ㅕ
lub럴며
. Jak to rozwiązać?tprP
w przypadku testowym 5: przekształca się wㅅㅔㄱㅖ
, gdzieㅅ
jest choseong,ㅔ
jest jungseong iㄱ
jest jongseong. Czy to nie powinno przekształcić się w섷ㅖ
(zgrupowane jak(ㅅㅔㄱ)(ㅖ)
) zamiast세계
(zgrupowane jak(ㅅㅔ)(ㄱㅖ)
)? We wcześniejszym komentarzu stwierdzasz, że jest on interpretowany przez pisanie na klawiaturze, więc spodziewałbymㅅㅔㄱ
się, że przekształcę się w섷
. A może koreański pisze od prawej do lewej zamiast od lewej do prawej?가
) do D7AF (힣
).Odpowiedzi:
Galaretka ,
296264 bajtówWypróbuj online!
Pełny program, który pobiera ciąg znaków jako argument i zwraca ciąg znaków (który jest domyślnie drukowany). Działa to w trzech przebiegach: najpierw konwertuje wszystkie koreańskie znaki na listy punktów kodowych dla liter łacińskich. Następnie identyfikuje i buduje złożone znaki koreańskie. Na koniec zamienia wszystkie pozostałe zbłąkane litery łacińskie na koreański odpowiednik. Zauważ, że inne znaki i litery łacińskie, które nie pojawiają się w specyfikacji (np.
A
) Są pozostawione same sobie.Jeśli konieczna jest konwersja na małe litery wielkich liter poza specyfikacją, można to zrobić kosztem dodatkowych 10 bajtów .
Wyjaśnienie
Łącze pomocnicze 1 : ogniwo diademowe z argumentami x i y. x to lista par wyszukiwania i zamień listy podrzędne. y będzie zamieniać każdą podlistę wyszukiwania na odpowiednią podlistę zastępczą
Łącze pomocnicze 2 : Lista znaków łacińskich / par znaków w kolejności odpowiadającej kolejności znaków koreańskich w Unicode
Łącze pomocnicze 3 : Listy znaków łacińskich używanych w Choseong, Jungseong i Jongseong
Łącze pomocnicze 4 : Powyższe listy znaków łacińskich wyliczone i posortowane w kolejności malejącej długości
Główny link : Monada, która przyjmuje argument Jelly jako argument i zwraca przetłumaczony ciąg Jelly
Część 1 : Konwertuj bloki morfemiczne na punkty kodowe Unicode odpowiednich znaków łacińskich
Sekcja 1.1 : Uzyskaj listę łacińskich znaków potrzebnych do wykonania bloków
Sekcja 1.2 : Utwórz wszystkie kombinacje tych liter (19 × 21 × 28 = 11172 kombinacji w odpowiedniej kolejności leksykalnej)
Sekcja 1.3 : Sparuj punkty kodu Unicode bloków z odpowiednią listą znaków łacińskich i użyj ich do przetłumaczenia bloków morfemicznych w ciągu wejściowym
Część 2 : Konwertuj poszczególne znaki koreańskie w danych wyjściowych z sekcji 1 na punkty kodowe odpowiednika łacińskiego
Część 3 : Uporządkuj nieprzetłumaczone znaki w danych wyjściowych z sekcji 2 (działa, ponieważ wszystko przetłumaczone z języka koreańskiego będzie teraz na liście podrzędnej, a zatem będzie miało głębokość 1)
Część 4 : Konwertuj morfemiczne bloki znaków łacińskich na koreański
Sekcja 4.1 : Uzyskaj wszystkie możliwe kombinacje Choseong i Jungseong
Sekcja 4.2 : Oznacz każdą kombinację punktem kodu Unicode dla podstawowego bloku morfemicznego (tj. Bez Jongseong)
Sekcja 4.3 : Zamień te ciągi znaków łacińskich w danych wyjściowych z sekcji 3 na punkty kodu Unicode podstawowego bloku morfemicznego
Sekcja 4.4: Ustal, czy istnieje Jongseong jako część każdego bloku morfemicznego
Część 5 : Postępuj z pozostałymi znakami łacińskimi, które pasują do koreańskich, ale nie są częścią bloku morphemuc
źródło
책
wstawiłemcor
, wyjątek , ale dałcBor
. I nie zmienia sięc
naㅊ
.can
musiał przekształcić się wㅊ무
, ale przekształcił się wc무
. I poza tym duże litery, które nie pojawiają się w specyfikacji, zostałyby zdekapitalizowane, ale może być w porządku.A
jako symbolu zastępczego dla drugiej postaci pojedynczych znaków iz jakiegoś powoduc
następny pojawił się jakoB
. Można zamienić małe litery na inne litery, ale wydaje się to niepotrzebną komplikacją tego, co już jest trudnym wyzwaniem.JavaScript (Node.js) ,
587582575569557554550549 bajtównie wiedziałeś tego
string.charCodeAt() == string.charCodeAt(0)
.Wypróbuj online!
547, jeśli znaki spoza alfabetu i koreańskiego jamos można zignorować.
Ok, tak długo walczyłem, żeby to napisać, ale to powinno zadziałać.
Nie używa się koreańskiego jamo / sylaby, ponieważ są one zbyt drogie (3 bajty na użycie).Używany w wyrażeniu regularnym do zapisywania bajtów.źródło
Wolfram Language (Mathematica) ,
405401400 bajtówWypróbuj online!
Nieco golfa
Aby przetestować ten w Mathematica prostu zastąpić
alphabet
zAlphabet
; jednak TIO nie obsługuje chmury Wolfram, więc zdefiniowałem toAlphabet["Korean"]
w nagłówku.Najpierw rozkładamy wszystkie sylaby Hangul na alfabet Hangul, następnie zamieniamy znaki łacińskie i Hangul, a następnie ponownie komponujemy sylaby.
źródło
input 2
Wyniki przypadku testowegoㅑㅜㅔㅕㅅ 2
zamiastㅑㅞㅕㅅ 2
w TIO. Mimo, że to samo ma miejsce w roztworze ja w pracy, ponieważ zarównoㅜ
iㅔ
są Jungseong, i wrażenie, tylko CHOSEONG + Jungseong + jongseong lub CHOSEONG + Jungseong + pusty będzie osobno. Poprosiłem OP o weryfikację, dlaczego sięㅜㅔ
stałoㅞ
.fnpfa
powinna być pojedyncza postać,뤪
ale zamiast tego kończy się jako루ㅔㄹㅁ
Java 19,
113311261133 bajtówWyjścia z wielkimi literami
ASDFGHJKLZXCVBNM
bez zmian, ponieważ.toLowerCase()
kosztują więcej niż premia -5.Wstecz +7 bajtów jako poprawka błędu dla znaków innych niż koreańskie powyżej wartości Unicode powyżej 20 000 (podziękowania @NickKennedy za zauważenie).
Wypróbuj online.
Wyjaśnienie:
źródło
44032 + 19×21×28 - 1