La romanisation du japonais consiste à convertir du texte japonais en caractères latins. Dans ce défi, vous recevrez une chaîne de caractères japonais en entrée et vous demanderez de les convertir en chaîne ASCII correcte.
Ce que vous aurez besoin de savoir
Le japonais a trois systèmes d'écriture: hiragana (le curvy utilisé pour les mots courts), katakana (l'angle utilisé pour les sons et les mots empruntés à d'autres langues), et le kanji (les caractères denses d'origine chinoise). Dans ce défi, nous ne nous préoccuperons que de l'hiragana.
Le syllabaire hiragana comporte 46 caractères. Chaque caractère représente une syllabe. Les caractères sont organisés par premier son (consonne) et second son (voyelle). Les colonnes dans l'ordre sont aiueo
.
: あいうえお
k: かきくけこ
s: さしすせそ
t: たちつてと
n: なにぬねの
h: はひふへほ
m: まみむめも
y: や ゆ よ
r: らりるれろ
w: わ を
N: ん
(si vous copiez et collez ce tableau, notez que j'ai utilisé des espaces idéographiques U + 3000 pour espacer y et w)
Ainsi, par exemple, と め devrait produire une sortie de atome
. Le premier caractère est a
, le second est to
et le troisième estme
.
Exceptions
Comme toute bonne langue, le japonais a des exceptions à ses règles, et la table hiragana en a plusieurs. Ces caractères sont prononcés légèrement différemment que leur emplacement dans le tableau impliquerait:
: shi
, Pas si
ち: chi
, pas ti
つ: tsu
, pas tu
ふ: fu
, pashu
Dakuten
Le mot «dakuten» signifie «marque boueuse»: le dakuten transforme les sons en leurs équivalents exprimés (généralement); par exemple, かka
se transforme en かga
. Une liste complète des changements:
k
→ g
s
→ z
t
→ d
h
→b
Les exceptions changent aussi: し ゛: ji
(ou zhi
), pas zi
ち ゛: ji
, pas di
:, dzu
notdu
(゛ agit comme vous le voudriez; ce n'est pas une exception)
Le handakuten est un caractère supplémentaire qui s'applique à la h
ligne. Si placé après un caractère, il change le son du caractère p
plutôt queb
.
Le dakuten et le handakuten seront donnés individuellement. Vous n'aurez pas besoin de vous occuper des formes précomposées ni des caractères combinés.
Petits personnages
Enfin, il existe des versions réduites de certains personnages. Ils modifient les caractères qui viennent avant ou après eux.
ゅ ょ
Ce sont les petites formes de ya
, yu
et yo
. Ils sont seulement placés après les sons dans la i
colonne; ils enlèvent le i
et ajoutent leur son. Alors, や や se transforme en kiya
; ゃ se transforme enkya
.
Si placé après chi
ou shi
(ou leurs formes dakuten-ed), le y
est également supprimé. ゆ est shiyu
; ゅ estshu
.
La dernière chose à laquelle vous devez faire face est la petite tsu
. っ double la consonne qui vient après, quoi qu'il arrive; ça ne fait rien d'autre. Par exemple, est kita
; っ た estkitta
.
Résumé, entrée et sortie
Votre programme doit être capable de translittérer: les 46 hiragana de base, leurs formes dakuten et handakuten et leurs combinaisons avec des petits caractères.
Le comportement non défini inclut: petit ya
, yu
et yo
pas après un caractère avec i
, petit tsu
à la fin d'une chaîne, dakuten sur un caractère non affecté, handakuten sur un nonp
caractère et tout autre élément non mentionné dans les spécifications / introduction ci-dessus.
Vous pouvez supposer que toutes les entrées sont valides et ne contiennent que les caractères japonais mentionnés ci-dessus.
La casse n'a pas d'importance en sortie; vous pouvez également remplacer r
avec l
ou un seul n
avec m
. La sortie peut avoir un espace entre chaque syllabe ou aucun espace.
C'est code-golf : le code le plus court en octets gagne.
Cas de test
De nombreux cas de test pour chaque pièce individuelle sont donnés dans la spécification. Quelques cas supplémentaires:
か ゛ な → hiragana
た か な → katakana
ん ん ん → daigyakutensaiban
ろ → puroguramingupazurucoudogorufu
ん て → ganbatte
Remarques
Je ne connais pas beaucoup de japonais à part ce que j'ai écrit ici. S'il vous plaît laissez-moi savoir si j'ai commis des erreurs.
Au départ, je comptais aussi inclure katakana (mon cas de test de translittération en anglais pourrait être légèrement plus précis), mais ce serait trop pour un défi de golf de code.
Les noms Unicode incluent la translittération de chaque caractère individuellement, mais sans les exceptions. Cela peut ou peut ne pas vous être utile.
Merci à squeamishossifrage pour avoir corrigé deux fautes de frappe!
Je suis désolé si c'est trop long. J’ai essayé d’intégrer la plupart des bizarreries de hiragana au défi, mais certaines choses (comme une petite hiragana réservée aux voyelles, changer n en m devant certaines consonnes et la marque de répétition) ont dû être supprimées pour que le défi reste gérable.
Je ne suis pas du tout désolé pour le titre. C'est un chef d'oeuvre.
la source
きっった
?っし
êtresshi
oushshi
?I'm not at all sorry for the title. It's a masterpiece.
DownvotedRéponses:
Python 2, 638 octets
Prend l'entrée en tant que chaîne unicode.
Testez-le sur Ideone
la source
print ''.join(R)
deprint''.join(R)
Python 2, 447 octets
Cela prend directement l'entrée Unicode, ce qui m'a fait perdre quelques octets à cause de la
decode('utf-8')
mais je pense que c'est plus dans l'esprit du défi.J'ai commencé par remplacer chaque caractère par les deux derniers caractères de son nom unicode, comme suggéré dans les notes du puzzle. Malheureusement, cela ne fait pas la différence entre les versions alternatives du même personnage, j'ai donc dû faire un bidouillage laid pour ajouter un 'x' avant les petits caractères et le handakuten.
Les autres boucles for ne sont que des corrections d’exceptions, dans l’ordre:
J'aurais aimé pouvoir combiner plus d'étapes, mais dans certains cas, ces étapes doivent être exécutées afin d'éviter les conflits.
Essayez-le en ligne! (une version multiligne avec plus d'exemples peut être trouvée ici ).
la source
for b in'AEIOU'
en un onglet ou un seul espace pour économiser 3 octets. Vous pourrez peut-être aussi utiliserfrom unicodedata import*
pour sauvegarder des octets - pas sûr.Swift 3,
6764 caractèresSoit r = {(s: String) dans s.applyingTransform (.toLatin, reverse: false)}la source
s:String)
et.toLatin,
?Foundation
a.Python 3 , 259 octets
Essayez-le en ligne!
Explication
Nous avons de la chance avec ce format d'entrée! Regardez ce qui se passe si je passe l'entrée via la normalisation NFKC :
Le dakuten est remplacé par un espace et un dakuten combinant. Maintenant, cet espace est tout ce qui sépare le de son dakuten. Donc nous nous en débarrassons et normalisons à nouveau :
Bingo La cinquième ligne transforme l’entrée en quelque chose comme
Ensuite, nous appliquons 9 substitutions ennuyeuses de regex entassées
r
et nous avons terminé:(Jonathan French a sauvegardé 4 octets, en écrivant
import re,unicodedata as u
place deimport re;from unicodedata import*
. Merci!)la source
import re,unicodedata as u
comme dans Kirill L. répondre à un défi connexe économise 4 octets .