A romanização do japonês está convertendo o texto japonês em caracteres latinos. Neste desafio, você receberá uma sequência de caracteres japoneses como entrada e espera-se convertê-los na sequência ASCII correta.
O que você precisa saber
O idioma japonês possui três sistemas de escrita: hiragana (o curvy usado para palavras curtas), katakana (o ângulo y usado para sons e palavras emprestados de outras línguas) e kanji (os caracteres densos originalmente do chinês). Neste desafio, apenas nos preocuparemos com hiragana.
Existem 46 caracteres no silabário hiragana. Cada personagem representa uma sílaba. Os caracteres são organizados por primeiro som (consoante) e segundo som (vogal). As colunas em ordem são aiueo
.
: あいうえお
k: かきくけこ
s: さしすせそ
t: たちつてと
n: なにぬねの
h: はひふへほ
m: まみむめも
y: や ゆ よ
r: らりるれろ
w: わ を
N: ん
(se você copiar e colar esta tabela, observe que usei os espaços ideográficos U + 3000 para espaçar y e w)
Então, por exemplo, あ と め deve produzir uma saída de atome
. O primeiro caractere é a
, o segundo é to
e o terceiro é me
.
Exceções
Como qualquer bom idioma, o japonês tem exceções às suas regras, e a tabela hiragana possui várias. Esses caracteres são pronunciados de maneira ligeiramente diferente do que sua localização na tabela implicaria:
し: shi
, não si
ち: chi
, não ti
つ: tsu
, não tu
ふ: fu
, nãohu
Dakuten ゛
A palavra 'dakuten' significa 'marca enlameada': o dakuten transforma sons em seus equivalentes sonoros (geralmente); por exemplo, か se ka
transforma em か ゛ga
. Uma lista completa das alterações:
k
→ g
s
→ z
t
→ d
h
→b
As exceções também mudam: し ゛: ji
(ou zhi
), não zi
゛ ゛: ji
, não di
つ ゛: dzu
, not du
(ふ ゛ age como você esperaria; não é uma exceção)
O handakuten é um caractere adicional゜ que se aplica à h
linha. Se colocado após um personagem, ele altera o som do personagem para em p
vez de b
.
Tanto o dakuten quanto o handakuten serão dados como caracteres individuais. Você não precisará lidar com os formulários pré-compostos ou os caracteres combinados.
Personagens pequenos
Finalmente, existem pequenas versões de alguns dos personagens. Eles modificam caracteres que vêm antes ou depois deles.
ゃ ゅ ょ
Estas são as pequenas formas de ya
, yu
e yo
. Eles são colocados somente após sons na i
coluna-; eles removem i
e adicionam seu som. Então, や や se transforma kiya
; ゃ ゃ se transforma kya
.
Se colocado após chi
ou shi
(ou suas formas dakuten-ed), o também y
será removido. ゆ ゆ é shiyu
; ゅ é shu
.
A última coisa com a qual você terá que lidar é com as pequenas tsu
. っ duplica a consoante que vem depois, não importa o quê; não faz mais nada. Por exemplo, き た é kita
; た っ た é kitta
.
Resumo, Entrada e Saída
Seu programa deve ser capaz de transliterar: os 46 hiragana básicos, suas formas de dakuten e handakuten e suas combinações com caracteres pequenos.
O comportamento indefinido inclui: pequeno ya
, yu
e yo
não após um caractere com i
, pequeno tsu
no final de uma string, dakuten em um personagem não afetado, handakuten em um não p
caractere e qualquer outra coisa não mencionada na especificação / introdução acima.
Você pode assumir que todas as entradas são válidas e contêm apenas os caracteres japoneses mencionados acima.
Case não importa na saída; você também pode substituir r
por l
ou solitário n
por m
. A saída pode ter um espaço entre cada sílaba ou nenhum espaço.
Este é o código-golfe : o código mais curto em bytes vence.
Casos de teste
Muitos casos de teste para cada parte individual são fornecidos nas especificações. Alguns casos adicionais:
ひ ら か ゛ な → hiragana
な た か な → katakana
た ゛ い き ゛ く て ん さ い は ゛ → daigyakutensaiban
ふ ゜ ろ く ゛ み ん く は ゜ す ゛ こ う と ゛ ふ → puroguramingupazurucoudogorufu
か ゛ ん ほ ゛ っ → ganbatte
Notas
Não sei muito japonês além do que escrevi aqui. Informe-me se cometi algum erro.
Originalmente, eu planejava incluir katakana também (para que meu caso de teste de transliteração em inglês pudesse ser um pouco mais preciso), mas isso seria demais para um desafio de golfe com código.
Os nomes Unicode incluem a transliteração de cada caractere individualmente, mas sem as exceções. Isso pode ou não ser útil para você.
Obrigado ao squeamishossifrage por corrigir dois erros de digitação!
Me desculpe se isso for muito longo; Tentei encaixar a maioria das peculiaridades da hiragana no desafio, mas algumas coisas (como hiragana apenas com vogais pequenas, alterar n para m na frente de algumas consoantes e a marca de repetição) tiveram que ser cortadas para manter o desafio administrável.
Não sinto muito pelo título. É uma obra-prima.
fonte
きっった
?っし
sersshi
oushshi
?I'm not at all sorry for the title. It's a masterpiece.
DownvotedRespostas:
Python 2, 638 bytes
Recebe a entrada como uma string unicode.
Teste no Ideone
fonte
print ''.join(R)
paraprint''.join(R)
Python 2, 447 bytes
Isso leva a entrada Unicode diretamente, o que me fez perder alguns bytes por causa do,
decode('utf-8')
mas acho que está mais no espírito do desafio.Comecei substituindo cada personagem pelos dois últimos caracteres de seu nome unicode, conforme sugerido nas notas do quebra-cabeça. Infelizmente, isso não faz distinção entre versões alternativas do mesmo personagem, então tive que fazer um truque feio para adicionar um 'x' antes dos caracteres pequenos e do handakuten.
O restante dos loops for está apenas corrigindo exceções, em ordem:
Eu gostaria de poder ter combinado mais etapas, mas, em alguns casos, as etapas precisam ser executadas para evitar conflitos.
Experimente online! (uma versão multilinha com mais exemplos pode ser encontrada aqui ).
fonte
for b in'AEIOU'
em uma guia ou um único espaço para economizar 3 bytes. Você também pode usarfrom unicodedata import*
para salvar alguns bytes - não tenho certeza.Swift 3,
6764 caracteresdeixe r = {(s: String) em s.applyingTransform (.toLatin, reverse: false)}fonte
s:String)
e.toLatin,
?Foundation
tem.Python 3 , 259 bytes
Experimente online!
Explicação
Estamos com sorte com este formato de entrada! Veja o que acontece se eu passar a entrada pela normalização do NFKC :
O dakuten é substituído por um espaço e um dakuten combinado. Agora esse espaço é tudo o que separa o は do seu dakuten. Então nos livramos e normalizamos novamente :
Bingo. A quinta linha transforma a entrada em algo como
Em seguida, aplicamos 9 substituições regex chatas
r
, e terminamos:(Jonathan French salvou 4 bytes, escrevendo em
import re,unicodedata as u
vez deimport re;from unicodedata import*
. Obrigado!)fonte
import re,unicodedata as u
como em Kirill L., a resposta a um desafio relacionado economiza 4 bytes .