Вступ
Це дещо схоже на розкладку клавіатури DVORAK , але МНОГО складніше.
Давайте спочатку поговоримо про корейську клавіатуру. Як ви бачите у Вікіпедії , для корекції між корейською та англійською клавішами є клавіша Kor / Eng.
Колись корейці вводять неправильно: вони намагаються писати по-корейськи на клавіатурі qwerty або англійською мовою на двонабірній клавіатурі.
Отже, ось проблема: якщо задано корейські символи, введені на двох клавіатурах, перетворіть їх на алфавітні символи, набрані на клавіатурі qwerty. Якщо введено алфавітні символи, введені qwerty, змініть його на двонабірну клавіатуру.
Клавіатура з двома наборами
Ось розкладка клавіатури з двома наборами:
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
ㅋㅌㅊㅍㅠㅜㅡ
і з клавішею Shift:
ㅃㅉㄸㄲㅆㅛㅕㅑㅒㅖ
просто змінюється верхній ряд, а інші - ні.
Про корейських персонажів
якби це закінчилося тут, це може бути легко, але ні. Коли ви вводите текст
dkssud, tprP!
вихід не відображається таким чином:
ㅇㅏㄴㄴㅕㅇ, ㅅㅔㄱㅖ!
але таким чином:
안녕, 세계!(means Hello, World!)
і це значно ускладнює.
Корейські символи розділяються на три частини: "Choseong (приголосний)", "Jungseong (голосний)" та "Jongseong (приголосний у кінці складу: може бути порожнім)", і ви повинні розділити його.
На щастя, є спосіб це зробити.
Як відокремити
Є 19 Choseong, 21 Jungseong та 28 Jongseong (з порожнім), а 0xAC00 - "가", перший символ корейських символів. Використовуючи це, ми можемо розділити корейські символи на три частини. Ось порядок кожного та його положення на двонабірній клавіатурі.
Вибір на замовлення:
ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
r R s e E f a q Q t T d w W c z x v g
наказ jungseong:
ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ
k o i O j p u P h hk ho hl y n nj np nl b m ml l
замовлення 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
Скажімо Давайте (unicode value of some character) - 0xAC00
є Korean_code
, і індекс ЧОСОН, Юнсон, Jongseong є Cho
, Jung
, Jong
.
Тоді, Korean_code
є(Cho * 21 * 28) + Jung * 28 + Jong
Ось код JavaScript, який відокремлює корейський символ від цього корейського веб-сайту, для вашої зручності.
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]);
При зборі
- Слід зазначити , що
ㅘ
,ㅙ
,ㅚ
,ㅝ
,ㅞ
,ㅟ
,ㅢ
являє собою поєднання інших jungseongs.
ㅗ+ㅏ=ㅘ, ㅗ+ㅐ=ㅙ, ㅗ+ㅣ=ㅚ, ㅜ+ㅓ=ㅝ, ㅜ+ㅔ=ㅞ, ㅜ+ㅣ=ㅟ, ㅡ+ㅣ=ㅢ
- Чосонг необхідний. Це означає, що якщо
frk
це дано, що єㄹㄱㅏ
, воно може змінитися двома способами:ㄺㅏ
іㄹ가
. Тоді вам доведеться перетворити його у спосіб, який обрав довгі. Якщоjjjrjr
дано, що єㅓㅓㅓㄱㅓㄱ
, то у ведучихㅓ
s немає нічого, що можна вибрати довгі, але четвертеㅓ
,ㄱ
що може бути вибранеong, тож воно буде змінено наㅓㅓㅓ걱
.
Інший приклад: 세계
( tprP
). Його можна змінити на 섹ㅖ
( (ㅅㅔㄱ)(ㅖ)
), але, оскільки вибрав необхідний, він зміниться на 세계
( (ㅅㅔ)(ㄱㅖ)
)
Приклади
вхід 1
안녕하세요
вихід 1
dkssudgktpdy
вхід 2
input 2
вихід 2
ㅑㅞㅕㅅ 2
вхід 3
힘ㄴㄴ
вихід 3
glass
вхід 4
아희(Aheui) is esolang which you can program with pure Korean characters.
вихід 4
dkgml(모뎌ㅑ) ㅑㄴ ㄷ내ㅣ뭏 조ㅑ초 ㅛㅐㅕ ㅊ무 ㅔ갷ㄱ므 쟈소 ㅔㅕㄱㄷ ㅏㅐㄱㄷ무 촘ㄱㅁㅊㅅㄷㄱㄴ.
вхід 5
dkssud, tprP!
вихід 5
안녕, 세계!
вхід 6
ㅗ디ㅣㅐ, 째깅! Hello, World!
вихід 6
hello, World! ㅗ디ㅣㅐ, 째깅!
Найкоротший код виграє. (у байтах)
Нове для вас правило
Ви можете відхиляти символи, у A
яких немає його аналога, на двонабірній клавіатурі. так Aheui
що Aㅗ뎌ㅑ
гаразд. Але, якщо ви перейдете Aheui
на 모뎌ㅑ
, ви можете отримати -5 балів, тож можете заробити 5 байт.
Ви можете виділити два jungseongs (як ㅘ
в ㅗ+ㅏ
). як rhk
до 고ㅏ
, або how
до ㅗㅐㅈ
. Але якщо комбінувати його (як rhk
до 과
чи how
до ㅙㅈ
), ви можете заробити додаткові -5 балів.
fjfau
можна інтерпретувати як 럶ㅕ
або 럴며
. Як ми вирішуємо це?
tprP
тестового випадку 5: це перетворюється на ㅅㅔㄱㅖ
, де ㅅ
є вибранг, ㅔ
є джунгсон і ㄱ
є джонсенг. Так чи не повинно це перетворюватися на 섷ㅖ
(згруповане подібне (ㅅㅔㄱ)(ㅖ)
) замість 세계
(згруповане як (ㅅㅔ)(ㄱㅖ)
)? У попередньому коментарі ви заявляєте, що це інтерпретується введенням тексту, тому я б розраховував ㅅㅔㄱ
перетворитися на 섷
. Або корейська набирає справа наліво, а не зліва направо?
l
післяml
для корейського символуㅣ
.