Introdução
É um pouco como o layout do teclado DVORAK , mas muito mais difícil.
Vamos falar sobre o teclado coreano primeiro. Como você pode ver na Wikipedia , existe uma chave Kor / Eng para alternar entre os conjuntos de chaves coreano e inglês.
Às vezes, os coreanos digitam errado: eles tentam escrever em coreano em um teclado qwerty ou em inglês em um teclado de dois conjuntos.
Então, aqui está o problema: se os caracteres coreanos digitados no teclado de dois conjuntos forem convertidos para caracteres alfabéticos digitados no teclado qwerty. Se os caracteres alfabéticos digitados em qwerty forem alterados, mude para teclado de dois conjuntos.
Teclado de dois conjuntos
Aqui está o layout do teclado de dois conjuntos:
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
ㅋㅌㅊㅍㅠㅜㅡ
e com a tecla shift:
ㅃㅉㄸㄲㅆㅛㅕㅑㅒㅖ
apenas a linha superior muda enquanto as outras não.
Sobre caracteres coreanos
se terminasse aqui, poderia ser fácil, mas não. Quando você digita
dkssud, tprP!
a saída não é mostrada desta maneira:
ㅇㅏㄴㄴㅕㅇ, ㅅㅔㄱㅖ!
mas desta maneira:
안녕, 세계!(means Hello, World!)
e isso torna as coisas muito mais difíceis.
Os caracteres coreanos se separam em três partes: 'Choseong (consoante)', 'Jungseong (vogal)' e 'Jongseong (consoante no final da sílaba: pode ficar em branco)', e você deve separá-lo.
Felizmente, há uma maneira de fazer isso.
Como separar
Existem 19 Choseong, 21 Jungseong e 28 Jongseong (com espaço em branco), e 0xAC00 é '가', primeiro caractere dos caracteres coreanos. Usando isso, podemos separar caracteres coreanos em três partes. Aqui está a ordem de cada uma e sua posição no teclado de dois conjuntos.
ordem escolhida:
ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
r R s e E f a q Q t T d w W c z x v g
ordem do jungseong:
ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ
k o i O j p u P h hk ho hl y n nj np nl b m ml l
ordem 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
Vamos dizer (unicode value of some character) - 0xAC00
é Korean_code
, eo índice de choseong, jungseong, Jongseong é Cho
, Jung
,Jong
.
Então Korean_code
é(Cho * 21 * 28) + Jung * 28 + Jong
Aqui está o código javascript que separa o caractere coreano deste site coreano, para sua conveniência.
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]);
Quando montado
- Note-se que
ㅘ
,ㅙ
,ㅚ
,ㅝ
,ㅞ
,ㅟ
,ㅢ
é uma combinação de outros jungseongs.
ㅗ+ㅏ=ㅘ, ㅗ+ㅐ=ㅙ, ㅗ+ㅣ=ㅚ, ㅜ+ㅓ=ㅝ, ㅜ+ㅔ=ㅞ, ㅜ+ㅣ=ㅟ, ㅡ+ㅣ=ㅢ
- Choseong é necessário. Isso significa que, se
frk
for dado, ou sejaㄹㄱㅏ
, pode mudar de duas maneiras:ㄺㅏ
eㄹ가
. Então, você deve convertê-lo de uma maneira que escolheu. Sejjjrjr
dado, ou sejaㅓㅓㅓㄱㅓㄱ
, os líderesㅓ
não têm nada que possa ser escolhido, mas o quartoㅓ
temㄱ
que pode ser escolhido, então é transformado emㅓㅓㅓ걱
.
Outro exemplo: 세계
( tprP
). Pode ser alterado para 섹ㅖ
( (ㅅㅔㄱ)(ㅖ)
), mas, como é necessário escolher uma opção, ele é alterado para 세계
()(ㅅㅔ)(ㄱㅖ)
)
Exemplos
entrada 1
안녕하세요
saída 1
dkssudgktpdy
entrada 2
input 2
saída 2
ㅑㅞㅕㅅ 2
entrada 3
힘ㄴㄴ
saída 3
glass
entrada 4
아희(Aheui) is esolang which you can program with pure Korean characters.
saída 4
dkgml(모뎌ㅑ) ㅑㄴ ㄷ내ㅣ뭏 조ㅑ초 ㅛㅐㅕ ㅊ무 ㅔ갷ㄱ므 쟈소 ㅔㅕㄱㄷ ㅏㅐㄱㄷ무 촘ㄱㅁㅊㅅㄷㄱㄴ.
entrada 5
dkssud, tprP!
saída 5
안녕, 세계!
entrada 6
ㅗ디ㅣㅐ, 째깅! Hello, World!
saída 6
hello, World! ㅗ디ㅣㅐ, 째깅!
O menor código vence. (em bytes)
Nova regra para sua conveniência
Você pode descartar caracteres como os A
que não têm seu equivalente no teclado de dois conjuntos. de modo Aheui
que Aㅗ뎌ㅑ
é OK. Mas, se você mudar Aheui
para 모뎌ㅑ
, poderá obter -5 pontos e ganhar 5 bytes.
Você pode separar dois jungseongs (como ㅘ
a ㅗ+ㅏ
). gosta rhk
de 고ㅏ
ou how
para ㅗㅐㅈ
. Mas se você combiná-lo (como rhk
a 과
ou how
a ㅙㅈ
), você pode ganhar -5 pontos adicionais.
l
depoisml
para o símbolo coreanoㅣ
.fjfau
poderia ser interpretado como럶ㅕ
ou럴며
. Como resolvemos isso?tprP
no caso de teste 5: isso se transforma emㅅㅔㄱㅖ
, ondeㅅ
é umongo escolhido,ㅔ
é um jungseong eㄱ
é um jongseong. Então isso não deveria se transformar em섷ㅖ
(agrupado como(ㅅㅔㄱ)(ㅖ)
) em vez de세계
(agrupado como(ㅅㅔ)(ㄱㅖ)
)? Em um comentário anterior, você afirma que é interpretado digitando, então eu esperariaㅅㅔㄱ
me transformar em섷
. Ou o coreano está digitando da direita para a esquerda em vez da esquerda para a direita?가
) a D7AF (힣
).Respostas:
Jelly ,
296264 bytesExperimente online!
Um programa completo que usa uma string como argumento e retorna uma string (que é impressa implicitamente). Isso funciona em três passagens: primeiro, converte todos os caracteres coreanos em listas de pontos de código para as letras latinas. Em seguida, ele identifica e constrói os caracteres coreanos compostos. Finalmente, transforma todas as letras latinas perdidas restantes no equivalente coreano. Observe que outros caracteres e letras latinas que não aparecem na especificação (por exemplo
A
) são deixados em paz.Se for necessária a conversão para minúsculas de letras maiúsculas fora da especificação, isso pode ser feito a um custo de 10 bytes adicionais .
Explicação
Link auxiliar 1 : link diádico com argumentos x e y. x é uma lista de pares de pesquisa e substitui sublistas. y substituirá cada sublist de pesquisa pela sublist de substituir correspondente
Link auxiliar 2 : lista de caracteres latinos / pares de caracteres na ordem que corresponde à ordem Unicode dos caracteres coreanos
Link auxiliar 3 : listas de caracteres latinos usados para Choseong, Jungseong e Jongseong
Link auxiliar 4 : listas acima de caracteres latinos enumerados e classificados em ordem decrescente de comprimento
Link principal : Mônada que pega uma string Jelly como argumento e retorna a string Jelly traduzida
Seção 1 : Converter blocos morfêmicos nos pontos de código Unicode dos caracteres latinos correspondentes
Seção 1.1 : Obtenha a lista de caracteres em latim necessários para criar os blocos
Seção 1.2 : Crie todas as combinações dessas letras (19 × 21 × 28 = 11.172 combinações na ordem lexical apropriada)
Seção 1.3 : Emparelhe os pontos de código Unicode dos blocos com a lista correspondente de caracteres latinos e use-os para converter os blocos morfêmicos na string de entrada
Seção 2 : Converta os caracteres coreanos individuais na saída da seção 1 nos pontos de código do equivalente latino
Seção 3 : Arrume caracteres não traduzidos na saída da seção 2 (funciona porque qualquer coisa traduzida do coreano agora estará em uma sublist e, portanto, terá profundidade 1)
Seção 4 : Converter blocos morfêmicos de caracteres latinos em coreano
Seção 4.1 : obtenha todas as combinações possíveis de Choseong e Jungseong
Seção 4.2 : Rotule cada combinação com o ponto de código Unicode para o bloco morfêmico básico (ou seja, sem Jongseong)
Seção 4.3 : Substitua essas cadeias de caracteres latinos na saída da seção 3 pelos pontos de código Unicode do bloco morfêmico base
Seção 4.4: Identifique se existe um Jongseong como parte de cada bloco morfêmico
Seção 5 : Manuseie os caracteres latinos restantes que correspondem aos coreanos, mas não fazem parte de um bloco morfêmico
fonte
책
, excetocor
, mas deucBor
. E isso não mudac
paraㅊ
.can
teve que se converter emㅊ무
, mas se converteu emc무
. E também excluí que caracteres grandes que não aparecem nas especificações seriam decapitalizados, mas pode ser bom.A
como espaço reservado para o segundo caractere de caracteres únicos e, por algum motivo, o seguintec
foi lançado como aB
. A conversão para letras minúsculas de outras letras poderia ser feita, mas parece uma complicação desnecessária para o que já é um desafio difícil.JavaScript (Node.js) ,
587582575569557554550549 bytesSe você não sabia disso
string.charCodeAt() == string.charCodeAt(0)
.Experimente online!
547 se caracteres fora dos alfabetos e jamos coreanos puderem ser ignorados.
Ok, lutei por tanto tempo para escrever isso, mas isso deve funcionar.
Nenhum jamo / sílaba coreana é usado porque eles são muito caros (3 bytes por uso).Usado na expressão regular para salvar bytes.fonte
Wolfram Language (Mathematica) ,
405401400 bytesExperimente online!
Ligeiramente não-destruído
Para testar isso no Mathematica, basta substituir
alphabet
porAlphabet
; no entanto, o TIO não suporta a Wolfram Cloud, então eu definiAlphabet["Korean"]
no cabeçalho.Primeiro decompomos todas as sílabas Hangul no alfabeto Hangul, depois trocamos caracteres latinos e Hangul e recompomos as sílabas.
fonte
input 2
resulta emㅑㅜㅔㅕㅅ 2
vez deㅑㅞㅕㅅ 2
em seu TIO. Embora o mesmo acontece na solução eu estava a trabalhar, uma vez que ambosㅜ
eㅔ
são jungseong, e estava sob a impressão única CHOSEONG + jungseong + jongseong ou CHOSEONG + jungseong + vazio seria combinada. Eu pedi a OP para verificação por queㅜㅔ
se tornouㅞ
.fnpfa
deve ser um personagem único,뤪
mas acaba sendo:루ㅔㄹㅁ
Java 19,
113311261133 bytesSaídas com letras maiúsculas
ASDFGHJKLZXCVBNM
inalteradas, pois.toLowerCase()
custa mais que o bônus -5.Voltar +7 bytes como uma correção de bug para caracteres não coreanos acima do valor unicode 20.000 (obrigado @NickKennedy por perceber).
Experimente online.
Explicação:
fonte
44032 + 19×21×28 - 1