Romanizacja języka japońskiego polega na konwersji japońskiego tekstu na znaki łacińskie. W tym wyzwaniu otrzymasz ciąg znaków japońskich jako dane wejściowe i będziesz musiał przekonwertować je na prawidłowy ciąg ASCII.
Co musisz wiedzieć
Język japoński ma trzy systemy pisania: hiragana (krzywoliniowy używany do krótkich słów), katakana (kąt-y używany do dźwięków i słów zapożyczonych z innych języków) oraz kanji (gęste postacie pierwotnie z chińskiego). W tym wyzwaniu będziemy się martwić tylko hiraganą.
W sylabie hiragana jest 46 znaków. Każda postać reprezentuje sylabę. Znaki są uporządkowane według pierwszego dźwięku (spółgłoski) i drugiego dźwięku (samogłoski). Kolumny w kolejności są aiueo
.
: あいうえお
k: かきくけこ
s: さしすせそ
t: たちつてと
n: なにぬねの
h: はひふへほ
m: まみむめも
y: や ゆ よ
r: らりるれろ
w: わ を
N: ん
(jeśli skopiujesz i wkleisz tę tabelę, zauważ, że użyłem spacji ideograficznych U + 3000 do spacji y i w)
Na przykład あ と め powinien dać wynik atome
. Pierwszym znakiem jest a
, drugim jest to
, a trzecim jest me
.
Wyjątki
Jak każdy dobry język, japoński ma wyjątki od swoich zasad, a tabela hiragana ma kilka. Te znaki są wymawiane nieco inaczej niż ich położenie w tabeli oznaczałoby:
し: shi
, nie si
ち: chi
, nie ti
つ: tsu
, nie tu
ふ: fu
, niehu
Dakuten ゛
Słowo „dakuten” oznacza „zabłocony znak”: dakuten zamienia dźwięki w ich dźwięczne odpowiedniki (zwykle); na przykład かka
zmienia się w か ゛ga
. Pełna lista zmian:
k
→ g
s
→ z
t
→ d
h
→b
Zmieniają się także wyjątki: し ゛: ji
(lub zhi
), nie zi
ち ゛: ji
, nie di
つ ゛: dzu
, nie du
(ふ ゛ działa tak, jak można się spodziewać; nie jest wyjątkiem)
Handakuten to dodatkowy znak ゜, który dotyczy h
wiersza. Umieszczony za postacią zmienia dźwięk postaci na p
zamiast b
.
Zarówno dakuten, jak i handakuten zostaną podane jako indywidualne postacie. Nie będziesz musiał radzić sobie ze wstępnie złożonymi formami lub łączącymi się postaciami.
Małe postacie
Wreszcie istnieją małe wersje niektórych postaci. Modyfikują postacie, które pojawiają się przed nimi lub po nich.
ゃ ゅ ょ
Są to małe formy ya
, yu
oraz yo
. Są one umieszczane tylko po dźwiękach w i
kolumnie -kolumna; usuwają i
i dodają dźwięk. Tak więc き や zamienia się w kiya
; き ゃ zamienia się w kya
.
Jeśli zostanie umieszczony po chi
lub shi
(lub w ich postaciach dakutenowych), również y
zostanie usunięty. し ゆ oznacza shiyu
; し ゅ jest shu
.
Ostatnią rzeczą, z którą musisz się zmierzyć, jest mała tsu
. っ podwaja spółgłoskę, która następuje po nim, bez względu na wszystko; nic więcej nie robi. Na przykład き た jest kita
; き っ た jest kitta
.
Podsumowanie, dane wejściowe i dane wyjściowe
Twój program musi mieć umiejętność transliteracji: 46 podstawowych hiraganów, ich formy dakuten i handakuten oraz kombinacje z małymi postaciami.
Nieokreślone zachowanie obejmuje: mały ya
, yu
a yo
nie po znaku z i
, mały tsu
na końcu łańcucha, dakuten na nietkniętym znaku, handakuten na niebędącym p
postacią i wszystko inne nie wymienione w powyższej specyfikacji / wprowadzeniu.
Możesz założyć, że wszystkie dane wejściowe są prawidłowe i zawierają tylko znaki japońskie wymienione powyżej.
Wielkość liter nie ma znaczenia; można również wymienić r
się l
lub samotny n
z m
. Dane wyjściowe mogą zawierać jedną spację między każdą sylabą lub nie zawierać spacji.
To jest code-golf : wygrywa najkrótszy kod w bajtach.
Przypadki testowe
Wiele przypadków testowych dla każdej części podano w specyfikacji. Niektóre dodatkowe przypadki:
ひ ら か ゛ な → hiragana
か た か な → katakana
た ゛ い き ゛ ゃ く て ん さ い は ゛ ん → daigyakutensaiban
ふ ゜ ろ く ゛ ら み ん く ゛ は ゜ す ゛ る こ う と ゛ こ ゛ る ふ → puroguramingupazurucoudogorufu
か ゛ ん ほ ゛ っ て → ganbatte
Notatki
Poza tym, co tu napisałem, niewiele znam japońskiego. Daj mi znać, jeśli popełniłem jakieś błędy.
Początkowo planowałem również dołączyć katakana (więc mój test na angielską transliterację może być nieco dokładniejszy), ale byłoby to zbyt wiele dla wyzwania golfowego.
Nazwy Unicode obejmują transliterację każdego znaku osobno, ale bez wyjątków. To może, ale nie musi być pomocne.
Dziękujemy za pisanie o poprawianiu dwóch literówek!
Przepraszam, jeśli to jest za długie; Próbowałem dopasować większość dziwactw hiragana do wyzwania, ale niektóre rzeczy (takie jak mała hiragana tylko samogłoska, zmiana n na m przed niektórymi spółgłosek i znak powtórzenia) musiały zostać wycięte, aby wyzwanie było wykonalne.
W ogóle nie jest mi przykro z powodu tytułu. To arcydzieło.
źródło
きっった
?っし
byćsshi
lubshshi
?I'm not at all sorry for the title. It's a masterpiece.
DownvotedOdpowiedzi:
Python 2, 638 bajtów
Pobiera dane wejściowe jako ciąg znaków Unicode.
Przetestuj na Ideone
źródło
print ''.join(R)
naprint''.join(R)
Python 2, 447 bajtów
To bezpośrednio pobiera dane Unicode, co spowodowało, że straciłem kilka bajtów,
decode('utf-8')
ale myślę, że jest bardziej w duchu wyzwania.Zacząłem od zastąpienia każdej postaci dwoma ostatnimi znakami o jej nazwie Unicode, jak sugerowano w notatkach do układanki. Niestety, to nie rozróżnia alternatywnych wersji tej samej postaci, więc musiałem zrobić brzydki hack, aby dodać „x” przed małymi postaciami i handakutenem.
Reszta pętli for tylko naprawia wyjątki, w celu:
Chciałbym móc połączyć więcej kroków, ale w niektórych przypadkach kroki muszą być wykonane, aby uniknąć konfliktów.
Wypróbuj online! (wersja wieloliniowa z większą liczbą przykładów można znaleźć tutaj ).
źródło
for b in'AEIOU'
tabulatorem lub pojedynczym spacją, aby zaoszczędzić 3 bajty. Możesz także użyćfrom unicodedata import*
do zapisania niektórych bajtów - nie jestem pewien.Swift 3,
6764 znakówniech r = {(s: String) w s.applyingTransform (.toLatin, reverse: false)}źródło
s:String)
i.toLatin,
?Foundation
has.Python 3 , 259 bajtów
Wypróbuj online!
Wyjaśnienie
Mamy szczęście z tym formatem wejściowym! Zobacz, co się stanie, jeśli przekażę dane wejściowe przez normalizację NFKC :
Dakuten zostaje zastąpiony spacją i łączącym dakutenem. Teraz ta przestrzeń oddziela は od dakutenu. Pozbywamy się tego i normalizujemy ponownie :
Bingo Piąta linia zmienia dane wejściowe w coś podobnego
Następnie stosujemy 9 nudnych podstawień wyrażeń regularnych wciśniętych
r
i gotowe:(Jonathan French zapisał 4 bajty,
import re,unicodedata as u
zamiast pisaćimport re;from unicodedata import*
. Dzięki!)źródło
import re,unicodedata as u
tak jak w Kirill L. odpowiedź na powiązane wyzwanie oszczędza 4 bajty .