तुम एक रोमन, बेबी हो


38

जापानी का रोमनकरण जापानी पाठ को लैटिन वर्णों में परिवर्तित कर रहा है। इस चुनौती में, आपको इनपुट के रूप में जापानी पात्रों की एक स्ट्रिंग दी जाएगी और उन्हें ASCII स्ट्रिंग को सही में बदलने की उम्मीद है।

आपको क्या जानना होगा

जापानी भाषा में तीन लेखन प्रणालियाँ हैं: हीरागाना (छोटे शब्दों के लिए इस्तेमाल किया जाने वाला सुडौल), कटकाना (अन्य भाषाओं से उधार ली गई ध्वनियों और शब्दों के लिए इस्तेमाल किया जाने वाला कोण-वाई), और कांजी (मूल रूप से चीनी से सघन)। इस चुनौती में हम केवल हिरागाना की चिंता करेंगे।

हीरागाना पाठ्यक्रम में 46 वर्ण हैं। प्रत्येक वर्ण एक शब्दांश का प्रतिनिधित्व करता है। पात्रों को पहले ध्वनि (व्यंजन) और दूसरी ध्वनि (स्वर) द्वारा व्यवस्थित किया जाता है। क्रम में स्तंभ हैं aiueo

 : あいうえお
k: かきくけこ
s: さしすせそ
t: たちつてと
n: なにぬねの
h: はひふへほ
m: まみむめも
y: や ゆ よ
r: らりるれろ
w: わ   を
N: ん

(यदि आप इस तालिका नोट को कॉपी और पेस्ट करते हैं जो मैंने वैचारिक रिक्त स्थान U + 3000 का उपयोग किया है तो y और w को बाहर निकालने के लिए)

इसलिए, उदाहरण के लिए, あ あ for का उत्पादन करना चाहिए atome। पहला पात्र है a, दूसरा है toऔर तीसरा है me

अपवाद

किसी भी अच्छी भाषा की तरह, जापानी के पास इसके नियमों के अपवाद हैं, और हीरागाना तालिका में कई हैं। इन वर्णों को तालिका में उनके स्थान की तुलना में थोड़ा अलग उच्चारण किया जाता है:

し: shi, नहीं si
ち: chi, नहीं ti
つ: tsu, नहीं tu
ふ: fuनहीं,hu

डकुटेन ゛

'डकुटेन' शब्द का अर्थ 'मैला निशान' होता है: डकुटेन ध्वनियों को उनके आवाज वाले समकक्षों (आमतौर पर) में बदल देता है; उदाहरण के लिए, かkaか ゛ में बदल जाता है ga। परिवर्तनों की पूरी सूची:

kg
sz
td
hb

अपवाद भी बदलते हैं: ゛:: ji(या zhi), zi
゛:: ji, नहीं di
つ ふ: dzu, नहीं du
( , as कृत्यों के रूप में आप अपेक्षा करेंगे; यह एक अपवाद नहीं है)

हथकुटेन एक अतिरिक्त वर्ण is है जो hपंक्ति पर लागू होता है । यदि एक चरित्र के बाद रखा जाता है, तो यह चरित्र की ध्वनि को pबदलने के बजाय बदल देता है b

डकुटेन और हैंडकुटेन दोनों को अलग-अलग पात्रों के रूप में दिया जा रहा है। आपको पूर्वगामी रूपों या संयोजन वर्णों से निपटने की आवश्यकता नहीं होगी।

छोटे अक्षर

अंत में, कुछ पात्रों के छोटे संस्करण हैं। वे उन पात्रों को संशोधित करते हैं जो उनके पहले या बाद में आते हैं।

ゃ ゅ ょ

ये , और ya, के छोटे रूप हैं । वे केवल इन- कॉलम में ध्वनियों के बाद रखे गए हैं ; वे अपनी आवाज़ निकालते हैं और जोड़ते हैं। तो, や, में बदल जाता है ; Into into में बदल जाता है ।yuyoiikiyakya

के बाद chiया shi(या उनके dakuten- एड रूपों) रखा गया है , तो yभी हटा दिया जाता है। ゆ ゆ है shiyu; ゅ ゅ है shu

आखिरी चीज जो आपको निपटानी होगी वह छोटी है tsu। っ इसके बाद आने वाले व्यंजन को दोगुना कर देता है, चाहे जो भी हो; यह और कुछ नहीं करता है। उदाहरण के लिए, き き है kita; た た た है kitta

सारांश, इनपुट और आउटपुट

आपका कार्यक्रम ट्रांसलेट करने में सक्षम होना चाहिए: 46 मूल हिरागाना, उनके डकुटेन और हैंडकुटेन रूप, और छोटे पात्रों के साथ उनका संयोजन।

अपरिभाषित व्यवहार में शामिल हैं: छोटा ya, yuऔर yoन कि एक चरित्र के साथ i, tsuएक स्ट्रिंग के अंत में छोटा , एक अप्रभावित चरित्र पर डैकुटेन, एक गैर- pचरित्र पर हथकड़ी , और उपरोक्त कल्पना / परिचय में उल्लेखित कुछ और नहीं।

आप मान सकते हैं कि सभी इनपुट मान्य हैं और इसमें केवल ऊपर वर्णित जापानी वर्ण हैं।

आउटपुट में मामला मायने नहीं रखता; आप के rसाथ lया एक अकेला के nसाथ भी बदल सकते हैं m। आउटपुट में प्रत्येक शब्दांश के बीच या तो एक स्थान हो सकता है या कोई स्थान नहीं हो सकता है।

यह : बाइट्स जीत में सबसे छोटा कोड।

परीक्षण के मामलों

प्रत्येक व्यक्तिगत भाग के कई परीक्षण मामलों को युक्ति में दिया गया है। कुछ अतिरिक्त मामले:

か か ひ ゛ な → hiragana

か か か か → katakana

い い い い い い い い い い い → → daigyakutensaiban

ろ ろ ろ ろ ろ ろ ろ ろ ろ ろ ろ ろ → ろ ろ → puroguramingupazurucoudogorufu

ん っ か ん ん か। → ganbatte

टिप्पणियाँ

  • मैं बहुत जापानी नहीं जानता इसके अलावा मैंने यहाँ क्या लिखा है। कृपया मुझे बताएं कि क्या मैंने कोई गलती की है।

  • मैं मूल रूप से कटकाना को शामिल करने की योजना बना रहा था (इसलिए मेरा अंग्रेजी लिप्यंतरण परीक्षण मामला थोड़ा अधिक सटीक हो सकता है ), लेकिन यह एक कोड गोल्फ चुनौती के लिए बहुत अधिक होगा।

  • यूनिकोड के नामों में व्यक्तिगत रूप से प्रत्येक वर्ण का लिप्यंतरण शामिल है, लेकिन अपवाद के बिना। यह आपके लिए सहायक हो भी सकता है और नहीं भी।

  • दो टाइपो को ठीक करने के लिए स्क्वीमिशोसेफ्रेग के लिए धन्यवाद!

  • मुझे खेद है अगर यह बहुत लंबा है; मैंने हिरागाना के अधिकांश क्वार्क्स को चुनौती में फिट करने का प्रयास किया लेकिन कुछ चीजें (जैसे छोटे स्वर-केवल हिरागाना, कुछ व्यंजन के सामने n से m में बदलना, और पुनरावृत्ति चिह्न) को चुनौती को प्रबंधनीय रखने के लिए काटना पड़ा।

  • मुझे इस उपाधि के लिए खेद नहीं है। यह एक उत्कृष्ट कृति है।


1
के लिए आउटपुट क्या होना चाहिए きっった?
21

@ थोमस: यह एक अमान्य इनपुट है। आउटपुट आप जो चाहें कर सकते हैं।
देउसोवी

1
होना っしचाहिए sshiया shshi?
२०:१

2
I'm not at all sorry for the title. It's a masterpiece.डाउनवोटेड
घातक

3
@ फैटलिफाई को अपने एंटी-ब्रिटनी पूर्वाग्रह को यहां लाने की कोई जरूरत नहीं है। भले ही मैं व्यक्तिगत रूप से एक जे-लो प्रशंसक हो सकता हूं, लेकिन मैं उस पर एक उत्कृष्ट पहेली को कम नहीं करने वाला हूं।
अर्द्ध-बहिर्मुखी

जवाबों:


7

पायथन 2, 638 बाइट्स

import unicodedata
s=input()
k=[0x309B,0x309C,0x3063]
m=[0x3083,0x3085,0x3087]
e={0x3057:'shi',0x3061:'chi',0x3064:'tsu',0x3075:'fu'}
d={0x3057:'ji',0x3061:'ji',0x3064:'dzu'}
D=dict(zip('ksth','gzdb'))
f=lambda c:unicodedata.name(c).split()[-1].lower()if ord(c)not in e else e[ord(c)]
g=lambda c:d[c]if c in d else D[f(c)[0]]+f(c)[1:]
R=[]
r=[]
t=[]
i=0
while i<len(s):
 c=ord(s[i])
 if c==k[0]:R[-1]=g(s[i-1])
 elif c==k[1]:R[-1]='p'+R[-1][1:]
 elif c in m:R[-1]=R[-1][:-1];n=f(s[i]);R+=[n[1:]]if r[-1]in[0x3057,0x3061]else[n];r+=[c]
 elif c==k[2]:t+=[len(R)]
 else:R+=[f(s[i])];r+=[c]
 i+=1
for i in t:R[i]=R[i][0]+R[i]
print ''.join(R)

यूनिकोड स्ट्रिंग के रूप में इनपुट लेता है।

Ideone पर इसका परीक्षण करें


1
आप एक मामूली बाई print ''.join(R)को print''.join(R)
बचाकर

6

पायथन 2, 447 बाइट्स

import unicodedata as u
r=str.replace
i=''.join('x'*('SM'in u.name(x)or ord(x)==12444)+u.name(x)[-2:].strip()for x in raw_input().decode('utf-8'))
for a,o in zip('KSTH','GZDB'):
    for b in'AEIOU':i=r(r(i,a+b+'xRK','P'+b),a+b+'RK',o+b)
for a,b,c,d in zip('STDZ',('SH','CH','J','J'),'TDHH',('TS','DZ','F','F')):i=r(r(i,a+'I',b+'I'),c+'U',d+'U')
for a in'CH','SH','J':i=r(i,a+'IxY',a)
for a in'BCDFGHJKMNPRSTWYZ':i=r(i,'xTSU'+a,a+a)
print r(i,'Ix','')

यह सीधे यूनिकोड इनपुट को लेता है, जिसने मुझे कुछ बाइट्स खो दिए क्योंकि decode('utf-8')मुझे लगता है कि चुनौती की भावना अधिक है।

मैंने हर किरदार को उसके यूनिकोड नाम के अंतिम दो पात्रों द्वारा प्रतिस्थापित करना शुरू किया, जैसा कि पहेली के नोट्स में बताया गया है। दुर्भाग्य से, यह एक ही चरित्र के वैकल्पिक संस्करणों के बीच अंतर नहीं करता है, इसलिए मुझे छोटे पात्रों और हथकड़ी से पहले एक 'x' जोड़ने के लिए एक बदसूरत हैक करना पड़ा।

बाकी छोरों के लिए सिर्फ अपवाद तय करना है, क्रम में:

  1. लूप के लिए पहला सही व्यंजन में डकुटेंस और हथकड़ी को बदल देता है;
  2. शि, ची, त्सू और फू के अपवादों के साथ पाश सौदों के लिए दूसरा;
  3. एक छोटे y- वर्ण (जैसे sha, jo) के पहले अपवादों से निपटने के लिए तीसरा;
  4. एक छोटे से tsu के बाद लूपिंग व्यंजन के साथ चौथा लूप डील करता है।
  5. अंतिम पंक्ति छोटे y- से संबंधित है।

काश, मैं और अधिक कदमों को मिला सकता था, लेकिन कुछ मामलों में संघर्षों से बचने के लिए कदमों का प्रदर्शन करना पड़ता है।

इसे ऑनलाइन आज़माएं! (अधिक उदाहरणों के साथ एक बहु-पंक्ति संस्करण यहां पाया जा सकता है )।



PPCG में आपका स्वागत है। बहुत अच्छा पहला समाधान :)
झबरा

for b in'AEIOU'3 बाइट्स को बचाने के लिए अपने चार स्थानों को टैब या एक सिंगल स्पेस के सामने मोड़ें। आप from unicodedata import*कुछ बाइट्स को बचाने के लिए उपयोग करने में सक्षम हो सकते हैं - निश्चित नहीं।
स्टीफन

4

स्विफ्ट 3, 67 64 अक्षर

Let r = {s (s: String) में s.applyingTransform (.toLatin, रिवर्स: गलत)}

let r={(s:String)in s.applyingTransform(.toLatin,reverse:false)}

3
एक बिल्टिन, वास्तव में, स्विफ्ट के लिए एक भवन है?
Zacharý

स्विफ्ट बिल्कुल नहीं जानते, लेकिन क्या आप व्हाट्सएप को काट सकते हैं s:String)और बाद में .toLatin,?
यति

@TuukkaX, अच्छी तरह से देखा!
आइडल

@ Zacharý, अच्छी तरह से Foundationहै।
आइडल

3

पायथन 3 , 259 बाइट्स

import re,unicodedata as u
s=re.sub
n=u.normalize
k,*r=r'NFKC DZU DU TSU TU \1\1 SM.{6}(.) \1 (CH|J|SH)Y \1 ISMALL.(Y.) CHI TI JI [ZD]I SHI SI FU HU'.split()
t=''.join(u.name(c)[16:]for c in n(k,s(' ','',n(k,input()))))
while r:t=s(r.pop(),r.pop(),t)
print(t)

इसे ऑनलाइन आज़माएं!

व्याख्या

हम इस इनपुट प्रारूप के साथ किस्मत में हैं! यदि मैं NFKC सामान्यीकरण के माध्यम से इनपुट पास करता हूं तो क्या होता है :

>>> nfkc = lambda x: u.normalize('NFKC', x)
>>> [u.name(c) for c in 'は゛']
['HIRAGANA LETTER HA', 'KATAKANA-HIRAGANA VOICED SOUND MARK']
>>> [u.name(c) for c in nfkc('は゛')]
['HIRAGANA LETTER HA', 'SPACE', 'COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK']

डकुटेन को एक स्थान और एक संयोजन डकुटेन द्वारा बदल दिया जाता है। अब वह स्थान वह है जो en को उसके डकुटेन से अलग कर रहा है। तो हम इससे छुटकारा पा लेते हैं और फिर से सामान्य हो जाते हैं :

>>> [u.name(c) for c in nfkc(nfkc('は゛').replace(' ', ''))]
['HIRAGANA LETTER BA']

बिंगो। पांचवीं पंक्ति इनपुट को कुछ इस तरह से बदल देती है

KONOSUBARASIISEKAINISISMALL YUKUHUKUWO

फिर हम 9 उबाऊ regex प्रतिस्थापन लागू rकरते हैं और हम कर रहे हैं:

KONOSUBARASHIISEKAINISHUKUFUKUWO

(जोनाथन फ्रेंच ने 4 बाइट्स बचाए, import re,unicodedata as uइसके बजाय लेखन import re;from unicodedata import*। धन्यवाद!)


मज़े और लाभ के लिए सामान्यीकरण का दुरुपयोग करना। वह सुंदर है।
टिम पेडेरिक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.