তুমি একজন রোমানাইজার, বেবি


38

জাপানিদের রোমানাইজেশন জাপানি পাঠ্যটিকে লাতিন অক্ষরে রূপান্তরিত করছে। এই চ্যালেঞ্জে আপনাকে জাপানী অক্ষরের একটি স্ট্রিং ইনপুট হিসাবে দেওয়া হবে এবং এগুলি সঠিক ASCII স্ট্রিংয়ে রূপান্তর করা হবে বলে আশা করা হচ্ছে।

আপনার যা জানা দরকার

জাপানি ভাষার তিনটি লেখার ব্যবস্থা রয়েছে: হিরাগানা (সংক্ষিপ্ত শব্দের জন্য ব্যবহৃত বক্র), কাতাকানা (অন্যান্য ল্যাঙ্গগুলি থেকে ধারিত শব্দ এবং শব্দের জন্য ব্যবহৃত কোণ-y), এবং কঞ্জি (মূলত চীনা ভাষার ঘন চরিত্রগুলি)। এই চ্যালেঞ্জে আমরা কেবল হীরাণা নিয়েই চিন্তিত হব।

হিরাগানা পাঠ্যক্রমটিতে 46 টি চরিত্র রয়েছে। প্রতিটি চরিত্র একটি উচ্চারণের প্রতিনিধিত্ব করে। অক্ষরগুলি প্রথম শব্দ (ব্যঞ্জনবর্ণ) এবং দ্বিতীয় শব্দ (স্বর) দ্বারা সংগঠিত হয়। কলামগুলি ক্রমে রয়েছে aiueo

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

(যদি আপনি এই টেবিলটি অনুলিপি করে আটকান তবে নোট করুন যে আমি y এবং ডাব্লু স্থান ফাঁকা করার জন্য আদর্শিক স্থান ইউ + 3000 ব্যবহার করেছি)

সুতরাং, উদাহরণস্বরূপ, あ と এর একটি আউটপুট উত্পাদন করা উচিত 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
(ふ you আপনার প্রত্যাশা অনুযায়ী কাজ করে; এটি ব্যতিক্রম নয়)

হ্যান্ডাকুট একটি অতিরিক্ত অক্ষর ゜ যা hসারিটির জন্য প্রযোজ্য । যদি কোনও অক্ষরের পরে স্থাপন করা হয় তবে এটি চরিত্রের শব্দটির pপরিবর্তে পরিবর্তিত হয় b

ডাকুটেন এবং হ্যান্ডাকুট উভয়ই পৃথক চরিত্র হিসাবে দেওয়া হতে চলেছে। আপনার পূর্বনির্ধারিত ফর্মগুলি বা সংমিশ্রিত অক্ষরগুলির সাথে ডিল করার প্রয়োজন হবে না।

ছোট অক্ষর

অবশেষে, কয়েকটি চরিত্রের ছোট সংস্করণ রয়েছে। তারা তাদের আগে বা পরে আসা অক্ষরগুলি সংশোধন করে।

ゃ ゅ ょ

এই ছোট ফর্ম ya, yuএবং yo। এগুলি কেবল- iকলামে শব্দের পরে স্থাপন করা হয় ; তারা তাদের সরান iএবং তাদের শব্দ যোগ করুন। সুতরাং, き into পরিণত হয় kiya; き into পরিণত হয় kya

তাহলে পরে স্থাপন chiবা shi(বা তাদের dakuten এড ফর্ম), yখুব মুছে ফেলা হবে। し ゆ হয় shiyu; しshu

আপনার সাথে শেষ জিনিসটি মোকাবেলা করতে হবে তা হ'ল ছোট tsu। After এর পরে যে ব্যঞ্জনবর্ণ আসে তা দ্বিগুণ করে, তা যাই হোক না কেন; এটা অন্য কিছু না। উদাহরণস্বরূপ, き た হয় kita; き っ た হয় kitta

সংক্ষিপ্তসার, ইনপুট এবং আউটপুট

আপনার প্রোগ্রামটি অবশ্যই লিখিতভাবে লিপিবদ্ধ করতে সক্ষম হবে: 46 টি বেসিক হীরাগানা, তাদের ডাকুন এবং হ্যান্ডাকুট ফর্ম এবং ছোট অক্ষরের সাথে তাদের সংমিশ্রণ।

অপরিজ্ঞাত আচরণের মধ্যে রয়েছে: ছোট ya, yuএবং একটি স্ট্রিংয়ের শেষে ছোট yoএকটি অক্ষরের পরে নয় i, tsuএকটি অরক্ষিত চরিত্রের উপর ডাকাক্ট, একটি অক্ষরহীন হ্যান্ডাকুট pএবং অন্য কিছু যা উপরোক্ত স্পেস / ভূমিকাটিতে উল্লেখ করা হয়নি।

আপনি ধরে নিতে পারেন যে সমস্ত ইনপুট বৈধ এবং কেবলমাত্র উপরে বর্ণিত জাপানী অক্ষর রয়েছে।

আউটপুট ক্ষেত্রে কেস আসে না; আপনি এর rসাথে lবা একাকী nদিয়ে প্রতিস্থাপন করতে পারেন m। আউটপুটে প্রতিটি সিলেবলের মধ্যে একটি করে স্থান থাকতে পারে বা কোনও ফাঁকা স্থান নেই।

এটি : বাইট জেতে সংক্ষিপ্ততম কোড।

পরীক্ষার মামলা

প্রতিটি স্বতন্ত্র অংশের জন্য অনেক পরীক্ষার কেসটি দেওয়া হয়। কিছু অতিরিক্ত মামলা:

→ ら か ゛ な → hiragana

→ た か な → katakana

゛ い き ゛ ゃ て て ん さ い は ゛ ん → daigyakutensaiban

゜ ろ く ゛ ら み ん く ゛ は ゜ す る る こ と と ゛ こ ゛ る ふ → puroguramingupazurucoudogorufu

→ ゛ ん ほ ゛ っ て → → ganbatte

নোট

  • আমি এখানে যা লিখেছি তা ছাড়াও আমি বেশি জাপানি ভাষা জানি না। আমি কোন ভুল করেছি কিনা দয়া করে আমাকে জানান।

  • আমি মূলত কাতাকানাকেও অন্তর্ভুক্ত করার পরিকল্পনা করছিলাম (সুতরাং আমার ইংরেজি লিখিত লিখিত লিখিত লিখনের পরীক্ষার কেসটি আরও সঠিক হতে পারে ) তবে কোড গল্ফ চ্যালেঞ্জের জন্য এটি খুব বেশি হবে।

  • ইউনিকোডের নামগুলিতে প্রতিটি চরিত্রের স্বতন্ত্রভাবে লিখিতভাবে অন্তর্ভুক্ত রয়েছে তবে ব্যতিক্রম ছাড়াই। এটি আপনার পক্ষে সহায়ক হতে পারে বা নাও পারে।

  • দুটি টাইপোগুলি সংশোধন করার জন্য স্কাইমিশোসিফ্রেজকে ধন্যবাদ!

  • আমি যদি খুব দীর্ঘ হয় তবে দুঃখিত! আমি বেশিরভাগ হিরাগানাকে চ্যালেঞ্জের সাথে ফিট করার চেষ্টা করেছি তবে কিছু জিনিস (যেমন ছোট স্বর-হিরাগান, কিছু ব্যঞ্জনবর্ণের সামনে n থেকে m পরিবর্তন এবং পুনরাবৃত্তির চিহ্ন) কে চ্যালেঞ্জটি ব্যবস্থাপনার জন্য কাটাতে হয়েছিল।

  • শিরোনামের জন্য আমি মোটেও দুঃখিত নই। এটি একটি মাস্টারপিস।


1
কিসের জন্য আউটপুট হওয়া উচিত きっった?
lirtosiast

@ থমাস: এটি একটি অবৈধ ইনপুট। আউটপুট আপনি যা চান তা হতে পারে।
দেউসোভি

1
হওয়া っしউচিত sshiনাকি shshi?
lirtosiast

2
I'm not at all sorry for the title. It's a masterpiece.Downvoted
Fatalize

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)

ইউনিকোড স্ট্রিং হিসাবে ইনপুট নেয়।

আইডিয়নে এটি পরীক্ষা করুন


1
আপনি পরিবর্তন করে একটি ছোটো বিদায় সংরক্ষণ করতে পারবেন print ''.join(R)করারprint''.join(R)
Zachary

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')তবে আমি মনে করি চ্যালেঞ্জের চেতনায় আরও বেশি।

ধাঁধার নোটে পরামর্শ অনুসারে আমি প্রতিটি চরিত্রের ইউনিকোড নামের শেষ দুটি অক্ষর দ্বারা প্রতিস্থাপন শুরু করেছি। দুর্ভাগ্যক্রমে, এটি একই চরিত্রের বিকল্প সংস্করণের মধ্যে পার্থক্য করে না, তাই ছোট চরিত্রগুলি এবং হ্যান্ডাকুটনের আগে 'এক্স' যুক্ত করতে আমাকে একটি কুৎসিত হ্যাক করতে হয়েছিল।

লুপের জন্য বাকিগুলি কেবল ব্যতিক্রমগুলি ঠিক করছে, যাতে ক্রম:

  1. লুপের জন্য প্রথমটি সঠিক ব্যঞ্জনায় পরিণত হয়
  2. শি, চি, সু এবং ফু এর হিরাগানা ব্যতিক্রম নিয়ে লুপ সংক্রান্ত দ্বিতীয়টি;
  3. একটি ছোট y- চরিত্রের আগে ব্যতিক্রম নিয়ে লুপ ডিলের জন্য তৃতীয় (যেমন শ, জো);
  4. ছোট টিসু পরে দ্বিগুণ ব্যঞ্জনা সঙ্গে লুপ ডিল জন্য চতুর্থ।
  5. চূড়ান্ত লাইন ছোট y- এর সাথে ডিল করে।

আমি চাই আমি আরও পদক্ষেপগুলি একত্রিত করতে পারতাম, তবে কিছু ক্ষেত্রে বিরোধগুলি এড়াতে পদক্ষেপগুলি সম্পাদন করতে হবে।

এটি অনলাইন চেষ্টা করুন! (আরও উদাহরণ সহ একটি বহু-লাইন সংস্করণ এখানে পাওয়া যাবে )।



পিপিসিজিতে আপনাকে স্বাগতম। খুব সুন্দর প্রথম সমাধান :)
শেজি

আপনার চারটি স্পেস সামনে রেখে for b in'AEIOU'একটি ট্যাবে বা একটি একক স্পেসে 3 বাইট সংরক্ষণ করুন। আপনি from unicodedata import*কিছু বাইট সংরক্ষণ করতেও সক্ষম হতে পারেন - নিশ্চিত নয়।
স্টিফেন

4

সুইফট 3, 67 64 টি অক্ষর

আসুন r = {(গুলি: স্ট্রিং) এ s.applyingTransfor (.toLatin, বিপরীত: মিথ্যা)}

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

3
একজন বিল্টিন, সত্যই, এইটির জন্য সুইফটের একটি বিল্টিন রয়েছে?
জাকারিয়া

সুইফটকে মোটেও জানেন না, তবে আপনি কি পরে s:String)এবং সাদা জায়গাগুলি কেটে ফেলতে পারবেন .toLatin,?
Yytsi

@ টুকুএক্সএক্স!
এপ্রিজ

@ জাকারি, ভাল 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 = 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']

ডাকাকেন একটি স্থান এবং একটি সংমিশ্রিত ডাক্টেন দ্বারা প্রতিস্থাপিত হয়। এখন সেই স্থানটি তার ডাক্টেন থেকে separa আলাদা করে দিচ্ছে। সুতরাং আমরা এ থেকে পরিত্রাণ পাই এবং আবার স্বাভাবিক করি :

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

বিঙ্গো। পঞ্চম লাইন ইনপুটটিকে এমন কিছুর মধ্যে রূপান্তরিত করে

KONOSUBARASIISEKAINISISMALL YUKUHUKUWO

তারপরে আমরা 9 ​​টি বোরিং রেজেক্স বিকল্পগুলি ক্র্যাডযুক্ত প্রয়োগ করি rএবং আমাদের কাজ শেষ হয়:

KONOSUBARASHIISEKAINISHUKUFUKUWO

(জোনাথন ফরাসি 4 টি বাইট সংরক্ষণ করেছিলেন, import re,unicodedata as uপরিবর্তে লিখেছেন import re;from unicodedata import*। ধন্যবাদ!)


মজা এবং লাভের জন্য সাধারণিকে আপত্তিজনকভাবে ব্যবহার করা। ঐটা সুন্দর.
টিম পেডারিক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.