Sim, é basicamente você é um romanizador, querida , mas mais difícil . tipo, muito mais difícil.
Aprender coreano é DURO. pelo menos para uma pessoa fora da Ásia. Mas eles pelo menos têm a chance de aprender, certo?
O que você deve fazer
Você receberá uma declaração em coreano. Por exemplo 안녕하세요
,. Você deve converter a entrada em sua pronúncia romana. Para o exemplo dado, a saída pode ser annyeonghaseyo
.
Agora fica técnico
Um caractere coreano possui três partes: consoante inicial, vogal e consoante final. A consoante final pode não existir no personagem.
Por exemplo, 아
é ㅇ
(consoante inicial) e ㅏ
(vogal) e 손
é ㅅ
(consoante inicial), ㅗ
(vogal) e ㄴ
(consoante final).
Evitar consoante e vogal tem sua pronúncia. A pronúncia para cada consoante é a seguinte.
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
(- significa sem pronúncia ou não usado. você não precisa lidar com elas.)
e Pronúncia para cada vogal é a seguinte.
Hangul ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ
Romanization a ae ya yae eo e yeo ye o wa wae oe yo u wo we wi yu eu ui i
Agora é a verdadeira parte difícil
A pronúncia da consoante é alterada pela consoante Final antes. A pronúncia para cada consoante inicial / final é a seguinte imagem. (Você não precisa fazer o hífen entre as pronúncias. Não é necessário. Se uma célula tiver duas ou mais pronúncias, escolha uma. Se não houver consoante final, use a pronúncia original.)
Exemplos
Korean => English
안녕하세요 => annyeonghaseyo
나랏말싸미 듕귁에달아 => naranmalssami dyunggwigedara //See how the ㅅ in 랏 changes from 't' to 'n'
Sugestão de exemplo bem-vinda. Você pode obter respostas para suas próprias entradas aqui . (Aquele em "Texto geral", Revisado, é o que estou pedindo)
fonte
ㅎ
seguidos porㄱ, ㄷ, ㅈ
também são casos especiais (eles aspiram aㅋ, ㅌ, ㅈ
(k, t, j)) também devem destacá-los.Respostas:
Python 3.6,
400394 bytesEdit: Graças ao RootTwo por -6 bytes.
Esta é a minha primeira submissão ao CodeGolf, por isso tenho certeza de que existem maneiras melhores de jogar golfe, mas pensei em publicá-la, pois ninguém mencionou a ideia principal ainda, e isso ainda é significativamente mais curto do que outras soluções .
Como funciona
A solução tenta explorar o fato (que aprendi com o desafio original da romanização em japonês) de que nomes de caracteres romanizados são acessíveis através do módulo unicodedata do Python. Para o idioma coreano, eles assumem a forma de
HANGUL SYLLABLE <NAME>
. Infelizmente, o processamento desses nomes para atender às especificações fornecidas e para cobrir todos os cenários de combinação de sílabas ainda requer bastante esforço (e bytes).Os nomes dos caracteres obtidos listam todas as consoantes em sua forma sonora em qualquer lugar da sílaba, por exemplo,
GGAGG
para깎
,R/L
são transcritas conforme pretendido (inícioR
, finalL
) eCH
são dadas comoC
(isso realmente nos deixa um pouco de dor de cabeça).Primeiro, removemos a
HANGUL SYLLABLE
peça (primeiros 16 caracteres), marcamos os limites da sílaba-
e, em seguida, aplicamos uma série de expressões regulares para fazer as conversões.O primeiro RegEx parece particularmente desagradável. O que basicamente faz é a conversão de consoantes iniciais em seus equivalentes finais (também removendo a letra extra no caso de consoantes duplas), quando elas não são seguidas por uma vogal ou para algumas letras - quando são precedidas por
h
. O(?<!n)
lookbehind impede a correspondência dag
qual faz parteng
, e o(?!\\1)
lookahead garante que não convertemos, por exemplo,ssa
emtsa
.Os próximos RegEx convertem consoantes duplas iniciais em seus equivalentes não sonoros. Aqui é onde os
-
separadores também são úteis, pois ajudam a discernir colisões de limites (g-g
) de consoantes duplas (gg
). Agora eles também podem ser removidos.Em seguida, lidamos com as
h+consonant
combinações restantes ,l->r
antes das vogais e outros casos especiais.Finalmente, restaurar
c
ach
, e resolver algumas outras peculiaridades dos nossos nomes de char de entrada, comoyi
em vez deui
eweo
em vez dewo
.Eu não sou especialista em coreano e não posso comentar muito mais, mas isso parece passar em todos os testes publicados na tarefa e no Github. Obviamente, mais alguns bytes podem ser eliminados, se a saída for aceitável em maiúsculas, pois é isso que obtemos da função name.
fonte
m[0]
é o mesmo quem.group(0)
; economizando 6 bytes.JavaScript (ES6), 480 bytes (WIP)
Esta é uma tentativa inicial, com base nas especificações atuais, de fazer a bola rolar. Pode exigir alguma correção quando as perguntas nos comentários forem abordadas.
Casos de teste
Mostrar snippet de código
Quão?
Uma vez descompactado, a matriz V contém os seguintes dados:
Dividimos cada caractere Hangul em consoante inicial, vogal e consoante final. Anexamos ao resultado:
V[80 + substitution] + V[vowel]
se houver uma substituiçãoV[40 + previousEndingConsonant] + V[21 + startingConsonant] + V[vowel]
de outra formafonte
'!'
ser33
?c
não é um byte. É uma cadeia de 1 caractere. Dito isto , ao aplicar uma operação aritmética, um espaço é coagido0
enquanto outros caracteres que não são dígitos são coagidosNaN
. O que significa quec<1
deve realmente funcionar como esperado. (Ec<33
também funcionaria para caracteres não-dígito, embora isto é uma espécie de fortuito.)c<1
Também seria truthy para"0"
(que é provavelmente OK se a entrada é a garantia de não conter qualquer algarismo arábico.)Tcl, 529 bytes
Algoritmo
Esse algoritmo é triturado para fins do desafio; o trade-off é que se supõe que a entrada não contenha caracteres alfabéticos latinos, nem use caracteres fora do bloco Hangul do U + AC00, conforme descrito no desafio. Se esse código fosse real, eu manteria todas as transformações em Jamo até a passagem final.
Suponho que eu poderia ter um pouco mais de capacidade de raciocinar sobre as vogais e algumas das repetições na tabela de pesquisa, mas isso é tão bom quanto é possível hoje.
Teste
Certifique-se de fornecer entrada UTF-8 ao interpretador Tcl. Isso é realizado com mais facilidade com um simples arquivo de texto UTF-8. Infelizmente, Tcl ainda não é o padrão para UTF-8 por padrão; isso me custou 33 bytes.
Aqui está o meu arquivo de teste (atualmente patético):
Notas
Não sei nada sobre o idioma coreano (exceto o pouco que aprendi aqui). Esta é uma primeira tentativa, com revisão potencial pendente devido a atualizações na especificação da pergunta.
E, sobre isso, algumas informações adicionais são úteis. Em particular, não há uma correspondência 1: 1 entre consoantes de chumbo e cauda, como parece sugerido no desafio. Os dois sites a seguir ajudaram bastante a descobrir isso:
• Wikipedia: idioma coreano, Hangul
• Wikipedia: Hangul Jamo (bloco Unicode)
fonte