Да, это в основном ты романизатор, детка , но сложнее . как, намного сложнее.
Изучение корейского языка трудна. по крайней мере, для человека за пределами Азии. Но у них по крайней мере есть шанс учиться, верно?
Что ты должен сделать
Вы получите корейское заявление. Например, 안녕하세요
. Вы должны преобразовать ввод в его римское произношение. Для данного примера вывод может быть annyeonghaseyo
.
Теперь это становится техническим
Корейский символ состоит из трех частей: начальная согласная, гласная и конечная согласная. Конечная согласная может не существовать в символе.
Например, 아
есть ㅇ
(Начальная согласная) и ㅏ
(Гласный), и 손
есть ㅅ
(Начальная согласная), ㅗ
(Гласная) и ㄴ
(Конечная согласная).
Эверт согласный и гласный имеет свое произношение. Произношение для каждого согласного является следующим.
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
(- означает отсутствие произношения или не используется. Вы не должны обращаться с ними.)
Произношение для каждой гласной звучит следующим образом.
Hangul ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ
Romanization a ae ya yae eo e yeo ye o wa wae oe yo u wo we wi yu eu ui i
Теперь это самая сложная часть
Произношение согласного изменяется перед согласным в конце. Произношение для каждого начального / конечного согласного выглядит следующим образом. (Вам не нужно вводить дефис между произношениями. Это не нужно. Если в ячейке есть два или более произношения, выберите одно. Если нет конечного согласного, используйте оригинальное произношение.)
Примеры
Korean => English
안녕하세요 => annyeonghaseyo
나랏말싸미 듕귁에달아 => naranmalssami dyunggwigedara //See how the ㅅ in 랏 changes from 't' to 'n'
Пример предложения приветствуется. Вы можете получить ответы на свои вопросы здесь . (То, что в «Общем тексте», пересмотрено - это то, что я прошу)
источник
ㅎ
за нимиㄱ, ㄷ, ㅈ
следуют также особые случаи (они обозначаются какㅋ, ㅌ, ㅈ
(k, t, j)), которые также должны быть выделены.Ответы:
Python 3.6,
400394 байтаИзменить: Спасибо RootTwo за -6 байт.
Это моя первая заявка на CodeGolf, так что я уверен, что есть лучшие способы сыграть в гольф, но я подумал, что все же опубликую ее, так как никто еще не упомянул ключевую идею, и она все еще значительно короче, чем другие решения. ,
Как это устроено
Решение пытается использовать тот факт (который я узнал из оригинальной японской задачи латинизации), что имена латиноамериканских символов доступны через модуль unicodedata Python. Для корейского языка они принимают форму
HANGUL SYLLABLE <NAME>
. К сожалению, обработка этих имен для соответствия предоставленной спецификации и для охвата всех сценариев комбинации слогов все еще требует немалых усилий (и байтов).Полученные имена символов перечисляют все согласные в их озвученной форме в любом месте слога, например,
GGAGG
для깎
,R/L
транскрибируются как предназначено (началоR
, конецL
), иCH
задается какC
(это на самом деле избавляет нас от головной боли).Прежде всего, мы снимаем
HANGUL SYLLABLE
часть (первые 16 символов), помечаем границы слогов-
, а затем применяем серию регулярных выражений для выполнения преобразований.Первый RegEx выглядит особенно противно. По сути, это преобразование начальных согласных в их конечные эквиваленты (также удаление лишних букв в случае двойных согласных), когда за ними не следует гласная, или для некоторых букв - когда им предшествует
h
.(?<!n)
Назад ' предотвращает соответствия ,g
который является частьюng
, и(?!\\1)
касательно последующего гарантирует , что мы не конвертировать, например,ssa
кtsa
.Следующие несколько RegEx'ов конвертируют начальные двойные согласные в их невокализованные эквиваленты. Вот где
-
разделители также пригодятся, поскольку они помогают отличить граничные столкновения (g-g
) от двойных согласных (gg
). Теперь они также могут быть удалены.Далее мы обрабатываем оставшиеся
h+consonant
комбинацииl->r
перед гласными и другими частными случаями.Наконец, мы восстанавливаем
c
кch
, и решить некоторые другие особенности наших входящих имен полукокса, например,yi
вместо того , чтобыui
иweo
вместоwo
.Я не специалист по корейскому языку и не могу комментировать намного больше, но, похоже, он прошел все тесты, опубликованные в задании и на Github. Очевидно, что еще несколько байтов могут быть сброшены, если выходные данные допустимы в верхнем регистре, поскольку это то, что мы получаем из функции name.
источник
m[0]
это то же самое, что иm.group(0)
; экономия 6 байт.JavaScript (ES6), 480 байт (WIP)
Это ранняя попытка, основанная на текущих спецификациях, чтобы запустить мяч. Это может потребовать некоторого исправления при рассмотрении вопросов в комментариях.
Контрольные примеры
Показать фрагмент кода
Как?
После распаковки массив V содержит следующие данные:
Мы разделяем каждого персонажа хангул на начальный согласный, гласный и конечный согласный. Добавляем к результату:
V[80 + substitution] + V[vowel]
если есть заменаV[40 + previousEndingConsonant] + V[21 + startingConsonant] + V[vowel]
в противном случаеисточник
'!'
может быть33
?c
- это не байт. Это строка из 1 символа. Тем не менее , при применении арифметической операции вводится пробел,0
а другие нецифровые символы приводятся кNaN
. Что означает, что наc<1
самом деле должно работать как ожидалось. (Иc<33
также будет работать для нецифровых символов, хотя это довольно случайно.)c<1
также будет правдой для"0"
(что, вероятно, нормально, если входные данные гарантированно не содержат арабских цифр.)Tcl, 529 байт
Алгоритм
Этот алгоритм хруст для целей задачи; компромисс заключается в том, что предполагается, что входные данные не содержат латинских буквенных символов и не используют символы вне блока Hangul U + AC00, как описано в задании. Если бы это был настоящий код, я бы сохранил все преобразования в Jamo до последнего прохода.
Полагаю, я мог бы потратить немного больше сил на то, чтобы разбить эти гласные и некоторые повторения в справочной таблице, но это так же хорошо, как это получается от меня сегодня.
тестирование
Убедитесь, что вы можете предоставить UTF-8 вход для интерпретатора Tcl. Это легче всего сделать с помощью простого текстового файла UTF-8. Увы, Tcl по-прежнему не использует UTF-8 по умолчанию; это стоило мне 33 байта.
Вот мой (в настоящее время жалкий) тестовый файл:
Примечания
Я ничего не знаю о корейском языке (кроме того, что мало я выучил здесь). Это первая попытка, ожидающая возможного пересмотра из-за обновлений в спецификации вопроса.
И, об этом, некоторая дополнительная информация полезна. В частности, нет соответствия 1: 1 между ведущими и хвостовыми согласными, как кажется, предлагается в задаче. Следующие два сайта помогли мне во многом это выяснить:
• Википедия: корейский язык, хангыль
• Википедия: хангыль джамо (блок Unicode)
источник