Вступление
Это немного похоже на раскладку DVORAK Keyboard , но НАМНОГО сложнее.
Давайте сначала поговорим о корейской клавиатуре. Как вы можете видеть в Википедии , есть ключ Kor / Eng для переключения между корейским и английским наборами ключей.
Корейцы иногда пишут неправильно: они пытаются писать на корейском языке с помощью qwerty-клавиатуры или на английском языке с помощью двухкомпонентной клавиатуры.
Итак, вот в чем проблема: если заданные корейские символы набраны на клавиатуре с двумя наборами, преобразуйте ее в буквенные символы, набранные на клавиатуре qwerty. Если даны буквенные символы, набранные в qwerty, измените его на клавиатуру с двумя наборами.
Клавиатура с двумя наборами
Вот две раскладки клавиатуры:
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
ㅋㅌㅊㅍㅠㅜㅡ
и с клавишей Shift:
ㅃㅉㄸㄲㅆㅛㅕㅑㅒㅖ
меняется только верхний ряд, а остальные нет.
О корейских персонажах
если это закончится здесь, это может быть легко, но нет. Когда вы печатаете
dkssud, tprP!
вывод не показан таким образом:
ㅇㅏㄴㄴㅕㅇ, ㅅㅔㄱㅖ!
но так:
안녕, 세계!(means Hello, World!)
и это делает вещи намного сложнее.
Корейские символы разделены на три части: «Чосонг (согласный)», «Чунгсон (гласный)» и «Чонсонг (согласный в конце слога: может быть пустым)», и вы должны разделить его.
К счастью, есть способ сделать это.
Как отделить
Есть 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.
ㅗ+ㅏ=ㅘ, ㅗ+ㅐ=ㅙ, ㅗ+ㅣ=ㅚ, ㅜ+ㅓ=ㅝ, ㅜ+ㅔ=ㅞ, ㅜ+ㅣ=ㅟ, ㅡ+ㅣ=ㅢ
- Choseong необходимо. Это означает, что если
frk
дано, то естьㄹㄱㅏ
, оно может измениться двумя способами:ㄺㅏ
иㄹ가
. Затем вы должны преобразовать его в способ, который выбрал. Еслиjjjrjr
дано, то естьㅓㅓㅓㄱㅓㄱ
ведущиеㅓ
s не имеют ничего, что можно выбрать, но четвертоеㅓ
имеетㄱ
то, что можно выбрать, поэтому оно заменено наㅓㅓㅓ걱
.
Другой пример: 세계
( tprP
). Это может быть изменено на 섹ㅖ
( (ㅅㅔㄱ)(ㅖ)
), но так как необходимо выбратьong, оно заменено на 세계
( (ㅅㅔ)(ㄱㅖ)
)
Примеры
вход 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 баллов.
l
послеml
корейского символаㅣ
.fjfau
можно интерпретировать как럶ㅕ
или럴며
. Как мы решаем это?tprP
в тестовом примере 5: он трансформируется вㅅㅔㄱㅖ
, гдеㅅ
есть selectedong,ㅔ
jungseong иㄱ
jongseong. Так не должно ли это преобразоваться в섷ㅖ
(сгруппированные как(ㅅㅔㄱ)(ㅖ)
) вместо세계
(сгруппированные как(ㅅㅔ)(ㄱㅖ)
)? В более раннем комментарии вы утверждаете, что он интерпретируется путем ввода текста, поэтому я ожидалㅅㅔㄱ
бы преобразоваться в섷
. Или корейский печатает справа налево, а не слева направо?가
) - D7AF (힣
).Ответы:
Желе ,
296264 байтаПопробуйте онлайн!
Полная программа, которая принимает строку в качестве аргумента и возвращает строку (которая неявно печатается). Это работает в три этапа: сначала он преобразует все корейские символы в списки кодовых точек для латинских букв. Затем он идентифицирует и создает составные корейские символы. Наконец, он превращает любые оставшиеся латинские буквы в корейский эквивалент. Обратите внимание, что другие символы и латинские буквы, которые не появляются в спецификации (например
A
), остаются одни.Если необходимо преобразовать заглавные буквы в нижний регистр вне спецификации, это можно сделать за счет дополнительных 10 байтов .
объяснение
Вспомогательная ссылка 1 : двоичная ссылка с аргументами x и y. x - это список пар поиска и замены подсписков. у будет заменен каждый подсписок поиска на соответствующий подсписок замены
Вспомогательная ссылка 2 : Список латинских пар символов / символов в порядке, соответствующем порядку Unicode корейских символов
Вспомогательная ссылка 3 : Списки латинских символов, используемых для Чосонга, Чонсонга и Чонсона
Вспомогательная ссылка 4 : перечисленные выше списки латинских символов в порядке убывания длины
Основная ссылка : Монада, которая принимает строку Jelly в качестве аргумента и возвращает переведенную строку Jelly
Раздел 1. Преобразование морфемных блоков в кодовые точки Unicode соответствующих латинских символов
Раздел 1.1 : Получить список латинских символов, необходимых для создания блоков
Раздел 1.2 : Создайте все комбинации этих букв (19 × 21 × 28 = 11 172 комбинации в соответствующем лексическом порядке)
Раздел 1.3 : Соедините кодовые точки Unicode блоков с соответствующим списком латинских символов и используйте их для перевода морфемных блоков во входной строке
Раздел 2. Преобразование отдельных корейских символов в выводе из раздела 1 в кодовые точки латинского эквивалента
Раздел 3 : привести в порядок непереведенные символы в выводе из раздела 2 (работает, потому что все, что переведено с корейского языка, теперь будет в подсписке и будет иметь глубину 1)
Раздел 4. Преобразование морфемных блоков латинских букв в корейский.
Раздел 4.1 : Получить все возможные комбинации Choseong и Jungseong
Раздел 4.2 : Маркируйте каждую комбинацию с помощью кодовой точки Unicode для основного морфемного блока (т.е. без Jongseong)
Раздел 4.3 : Заменить эти строки латинских символов в выводе из раздела 3 на кодовые точки Unicode базового морфемного блока
Раздел 4.4: Определите, есть ли Jongseong как часть каждого морфемного блока
Раздел 5 : Обработка оставшихся латинских символов, которые соответствуют корейским, но не являются частью блока morphemuc
источник
책
, я исключалcor
, но это давалоcBor
. И это не меняетсяc
наㅊ
.can
должен был быть преобразован вㅊ무
, но он преобразован вc무
. И я также исключил, что большие символы, которые не указаны в спецификации, будут декапитализированы, но это может быть хорошо.A
в качестве заполнителя для второго символа отдельных символов, и по какой-то причине тот, что после,c
получился какB
. Преобразование других букв в нижний регистр может быть выполнено, но кажется ненужным осложнением того, что уже является сложной задачей.JavaScript (Node.js) ,
587582575569557554550549 байтты не знал этого
string.charCodeAt() == string.charCodeAt(0)
.Попробуйте онлайн!
547, если символы за пределами алфавитов и корейских джамо могут быть проигнорированы.
Хорошо, я так долго боролся, чтобы написать это, но это должно сработать.
Корейский джамо / слог не используется, потому что они слишком дороги (3 байта за использование).Используется в регулярном выражении для сохранения байтов.источник
Wolfram Language (Mathematica) ,
405401400 байтПопробуйте онлайн!
Слегка разгульный
Чтобы проверить это в Mathematica, просто замените
alphabet
наAlphabet
; однако TIO не поддерживает Wolfram Cloud, поэтому я определилAlphabet["Korean"]
в шапке.Сначала мы разлагаем все слоги хангыль на алфавит хангул, затем меняем символы латинского и хангульского языков, а затем восстанавливаем слоги.
источник
input 2
Результат тестаㅑㅜㅔㅕㅅ 2
вместоㅑㅞㅕㅅ 2
вашего TIO. Хотя то же самое происходит с решением, над которым я работал, поскольку обаㅜ
иㅔ
jungseong, и у меня сложилось впечатление, что будут выбраны только комбинацияong + jungseong + jongseong или selectedong + jungseong + empty. Я спросил ОП для проверки, почемуㅜㅔ
сталㅞ
.fnpfa
должен быть один символ,뤪
но вместо этого заканчивается как루ㅔㄹㅁ
Ява 19,
113311261133 байтаВыводы с заглавными буквами не
ASDFGHJKLZXCVBNM
изменяются, так как.toLowerCase()
стоит больше, чем бонус -5.Возвращение +7 байт в качестве исправления ошибки для некорейских символов со значением, превышающим юникод 20 000 (спасибо @NickKennedy за то, что заметил).
Попробуйте онлайн.
Объяснение:
источник
44032 + 19×21×28 - 1