कोरियाई को रोमन करें


13

हां, यह मूल रूप से आप एक रोमनर, बेबी , लेकिन कठिन हैं । जैसे, कठिन रास्ता

कोरियाई सीखना HARD है। कम से कम एशिया के बाहर के व्यक्ति के लिए। लेकिन उनके पास कम से कम सीखने का मौका तो है ना?

आपको क्या करना चाहिए

आपको एक कोरियाई विवरण दिया जाएगा। उदाहरण के लिए, 안녕하세요। आपको इनपुट को इसके रोमन उच्चारण में बदलना होगा। दिए गए उदाहरण के लिए, आउटपुट हो सकता है annyeonghaseyo

अब यह तकनीकी हो जाता है

एक कोरियाई चरित्र के तीन भाग होते हैं, जिसमें व्यंजन, स्वर, और अंत व्यंजन शामिल होते हैं। एंडिंग व्यंजन वर्ण में मौजूद नहीं हो सकता है।

उदाहरण के लिए, है (शुरू व्यंजन) और (स्वर), और है (व्यंजन शुरू), (स्वर), और (व्यंजन समाप्त)।

एवर्टन व्यंजन और स्वर इसका उच्चारण है। प्रत्येक व्यंजन का उच्चारण इस प्रकार है।

Korean                 ㄱ   ㄲ  ㄴ  ㄷ   ㄸ  ㄹ  ㅁ  ㅂ  ㅃ  ㅅ  ㅆ  ㅇ   ㅈ   ㅉ  ㅊ ㅋ  ㅌ   ㅍ  ㅎ
Romanization Starting   g   kk  n   d   tt  r   m   b   pp  s   ss  –   j   jj  ch  k   t   p   h
               Ending   k   k   n   t   –   l   m   p   –   t   t   ng  t   –   t   k   t   p   h

(- का अर्थ है कोई उच्चारण या उपयोग नहीं। आपको उन्हें संभालने की आवश्यकता नहीं है।)

और प्रत्येक स्वर के लिए उच्चारण निम्नलिखित है।

Hangul          ㅏ  ㅐ  ㅑ  ㅒ   ㅓ  ㅔ  ㅕ  ㅖ  ㅗ   ㅘ   ㅙ  ㅚ ㅛ  ㅜ  ㅝ  ㅞ  ㅟ   ㅠ  ㅡ   ㅢ ㅣ
Romanization    a   ae  ya  yae eo  e   yeo ye  o   wa  wae oe  yo  u   wo  we  wi  yu  eu  ui  i

अब इसका असली हिस्सा है

अंत में व्यंजन के अंत से पहले व्यंजन का उच्चारण बदल जाता है। प्रत्येक प्रारंभ / अंत व्यंजन के लिए उच्चारण निम्न छवि के रूप में है। धन्यवाद, विकिपीडिया।  अगर यह नहीं था, तो मुझे यह सब लिखना पड़ेगा। (आपको उच्चारण के बीच हाइफ़न करने की ज़रूरत नहीं है। यह अनावश्यक है। यदि किसी सेल में दो या अधिक उच्चारण हैं, तो एक का चयन करें। यदि कोई समाप्ति व्यंजन नहीं है, तो मूल उच्चारण का उपयोग करें।)

उदाहरण

Korean => English
안녕하세요 => annyeonghaseyo
나랏말싸미 듕귁에달아 => naranmalssami dyunggwigedara  //See how the ㅅ in 랏 changes from 't' to 'n'

उदाहरण सुझाव का स्वागत किया। आप अपने स्वयं के इनपुट के लिए उत्तर यहां प्राप्त कर सकते हैं । (एक "सामान्य पाठ" में, संशोधित वही है जो मैं पूछ रहा हूं)


क्या इनपुट में हमेशा यूनिकोड वर्ण AC00-D7AF + स्थान होगा?
अरनौलद

1
कई विशेष X + X संयोजन हैं जो पीले रंग में हाइलाइट नहीं किए गए हैं (जैसे ㅈ + special = ch)। क्या इसका मतलब यह है कि हमें उनका समर्थन नहीं करना है? (इसके अलावा, चित्र में h के बजाय t को 'romanized' किया गया है, जो थोड़ा भ्रमित करने वाला है।)
Arnauld

1
परीक्षण के मामले: gist.github.com/perey/563282f8d62c2292d11aabcde0b94d2d @Arnauld कहते हैं, विशेष संयोजनों में कुछ विषमताएँ हैं; यह उन सभी के लिए परीक्षण है जिन्हें मैंने तालिका में पाया है, चाहे हाइलाइट किया गया हो या नहीं। जहां कई विकल्प मौजूद होते हैं, वे अंतरिक्ष से अलग हो जाते हैं। कोई हाइफ़न उपयोग नहीं किया जाता है क्योंकि मुझे उम्मीद है कि लोग उन्हें बाहर निकाल देंगे।
टिम पैडरिक

1
मुझे आपके सुझाए गए आउटपुट-चेकिंग लिंक में "सामान्य पाठ" नहीं दिख रहा है; क्या आपका मतलब है "सामान्य बातें"? यदि हां, तो हम तीनों में से किसका उपयोग करें (संशोधित, मैककिन, येल)? कोई भी आपकी तालिका से मेल नहीं खाता है; उदाहरण के लिए, example के बाद ㄹ आपके अनुसार "nn" होना चाहिए लेकिन उस लिंक पर "tr" या "cl" होना चाहिए। (ध्यान दें कि पिछली टिप्पणी में मेरे परीक्षण के मामले प्रश्न में लिप्यंतरण पर आधारित हैं!)
टिम पेडरिक

इसके बाद ㄱ, ㄷ, ㅈविशेष मामले भी होते हैं (वे ㅋ, ㅌ, ㅈ(k, t, j) के आकांक्षी बन जाते हैं ) उन पर भी प्रकाश डाला जाना चाहिए।
जुन्गवान मिन

जवाबों:


9

पायथन 3.6, 400 394 बाइट्स

संपादित करें: -6 बाइट्स के लिए RootTwo के लिए धन्यवाद ।

यह कोडगॉल्फ पर मेरा पहला सबमिशन है, इसलिए मुझे पूरा यकीन है कि इसे गोल्फ के लिए बेहतर तरीके हैं, लेकिन मुझे लगा कि मैं अभी भी इसे पोस्ट करूंगा, क्योंकि किसी ने भी अभी तक महत्वपूर्ण विचार का उल्लेख नहीं किया है, और यह अभी भी अन्य समाधानों की तुलना में काफी कम है। ।

import re,unicodedata as u
t='-'.join(u.name(i)[16:]for i in input()).lower()
for i in range(19):t=re.sub('h-[gdb]|(?<!n)([gdbsjc]+)(?!\\1)(?!-?[aeiouyw]) gg dd bb -- - h(?=[nmrcktp])|hh hj l(?=[aeiouyw]) l[nr] [nt][nr] tm pm [pm][nr] km kn|kr|ngr c yi weo'.split()[i],([lambda m:'ktpttt'['gdbsjc'.index(m[0][-1])]]+'kk,tt,pp, ,,t,c,r,ll,nn,nm,mm,mn,ngm,ngn,ch,ui,wo'.split(","))[i],t)
print(t)

यह काम किस प्रकार करता है

इस तथ्य का समाधान करने का प्रयास करता है (जो मैंने मूल जापानी रोमानीकरण चुनौती से सीखा था) कि रोमन वर्ण वर्ण पायथन के यूनिकोडेटा मॉड्यूल के माध्यम से सुलभ हैं। कोरियाई भाषा के लिए, वे का रूप लेते हैं HANGUL SYLLABLE <NAME>। दुर्भाग्य से, प्रदान किए गए विनिर्देश को पूरा करने के लिए और सभी शब्दांश संयोजन परिदृश्यों को कवर करने के लिए इन नामों को संसाधित करना अभी भी काफी प्रयास (और बाइट्स) की आवश्यकता है।

प्राप्त चरित्र नाम उनके व्यंजन रूप में सभी व्यंजन को शब्दांश के रूप में कहीं भी सूचीबद्ध करते हैं, उदाहरण के GGAGGलिए , R/L(जैसा कि शुरू R, समाप्त L) के CHरूप Cमें प्रत्यारोपित किया जाता है , और इसे दिया जाता है (यह वास्तव में हमें सिरदर्द से बचाता है)।

सबसे पहले, हम HANGUL SYLLABLEभाग को बंद करते हैं (पहले 16 वर्ण), के साथ शब्दांश सीमाओं को चिह्नित करें -, और फिर रूपांतरण करने के लिए RegEx'es की एक श्रृंखला लागू करें।

पहला RegEx विशेष रूप से बुरा लग रहा है। यह मूल रूप से क्या करता है, व्यंजन को उनके समतुल्य समकक्षों (दोहरे व्यंजन के मामले में अतिरिक्त अक्षर को हटाते हुए) में बदलने का रूपांतरण है, जब उन्हें स्वर का पालन नहीं किया जाता है, या कुछ अक्षरों के लिए - जब वे पहले होते हैं h(?<!n)Lookbehind रोकता मिलान gजो का हिस्सा है ng, और (?!\\1)अग्रदर्शी दर्शाता है कि हम न करने वाली, जैसे, ssaके लिए tsa

अगले कुछ RegEx'es ने डबल व्यंजन शुरू करने को अपने असमान समकक्षों में परिवर्तित किया। यहाँ जहाँ -विभाजक भी काम में आते हैं क्योंकि वे g-gदोहरे व्यंजन ( gg) से समझदार सीमा टकराव ( ) में मदद करते हैं । अब उन्हें भी हटाया जा सकता है।

अगला, हम शेष h+consonantसंयोजनों को, l->rस्वरों से पहले और अन्य विशेष मामलों को संभालते हैं।

अंत में, हम को बहाल cकरने के लिए ch, और इस तरह के रूप में हमारे भेजे चार नामों में से कुछ अन्य pecularities, को हल yiकरने के बजाय uiऔर weoके बजाय wo

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


PPCG में आपका स्वागत है! शानदार पहला जवाब।
FantaC

1
अच्छा जवाब। अजगर 3.6 के m[0]रूप में m.group(0), के रूप में ही है ; बचत 6 बाइट्स।
रूटट्वो

5

जावास्क्रिप्ट (ES6), 480 बाइट्स (WIP)

यह गेंद को लुढ़काने के लिए मौजूदा चश्मे के आधार पर एक प्रारंभिक प्रयास है। जब टिप्पणियों में प्रश्नों को संबोधित किया जाता है, तो इसे कुछ ठीक करने की आवश्यकता हो सकती है।

s=>[...s].map(c=>c<'!'?c:(u=c.charCodeAt()-44032,y='1478ghjlmnpr'.search((p=t).toString(36)),t=u%28,u=u/28|0,v=u%21,x=[2,5,6,11,18].indexOf(u=u/21|0),~x&~y&&(z=parseInt(V[y+68][x],36))>10?V[z+69]:V[p+40]+V[u+21])+V[v],t=0,V='8a6y8ye6e46ye4y64w8wa6o6y4u/w4w6wi/yu/eu/ui/i/g/k21d/t7r/3b/p0s/ss95j5ch/270h922/197l999930/77ng/77270h/bbcd6afaa8gghi5ffak8alaa8llmn4gghp8abaa8gghq5gghr5ggha5gghs8ng1ng3g/2ll/n1n3d/7r/m1m3b/0s/5ch/h'.replace(/\d/g,n=>'pnkmojeta/'[n]+'/').split`/`).join``

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

कैसे?

एक बार विघटित होने के बाद, सरणी V में निम्न डेटा होता है:

00-20 vowels
a/ae/ya/yee/eo/e/yeo/ye/o/wa/wae/oe/yo/u/wo/we/wi/yu/eu/ui/i

21-39 starting consonants
g/kk/n/d/tt/r/m/b/pp/s/ss//j/jj/ch/k/t/p/h

40-67 ending consonants
/k/k//n///t/l////////m/p//t/t/ng/t/t/k/t/p/h

68-79 indices of substitution patterns for consecutive consonants
      ('a' = no substitution, 'b' = pattern #0, 'c' = pattern #1, etc.)
bbcde/afaaa/gghij/ffaka/alaaa/llmno/gghpa/abaaa/gghqj/gghrj/gghaj/gghsa

80-97 substitution patterns
ngn/ngm/g/k/ll/nn/nm/d/t/r/mn/mm/b/p/s/j/ch/h

हम प्रत्येक हंगुल चरित्र को व्यंजन शुरू करने, स्वर और अंत व्यंजन में विभाजित करते हैं। हम परिणाम के लिए संलग्न हैं:

  • V[80 + substitution] + V[vowel] अगर वहाँ एक प्रतिस्थापन है
  • V[40 + previousEndingConsonant] + V[21 + startingConsonant] + V[vowel] अन्यथा

कर सकते हैं '!'नहीं हो 33?
जोनाथन फ्रीच

@JonathanFrech cएक बाइट नहीं है। यह 1-वर्ण स्ट्रिंग है। कहा कि , एक अंकगणितीय ऑपरेशन को लागू करते समय, एक स्थान के लिए मजबूर किया जाता है, 0जबकि अन्य गैर-अंक पात्रों के लिए मजबूर किया जाता है NaN। जिसका मतलब है कि c<1वास्तव में उम्मीद के मुताबिक काम करना चाहिए। (और c<33गैर-अंकीय वर्णों के लिए भी काम करेगा, हालाँकि यह एक प्रकार का सौभाग्य है।)
अरनॉल्ड

@JonathanFrech परिशिष्ट: के c<1लिए भी सत्य होगा "0"(जो कि शायद ठीक है यदि इनपुट में किसी अरबी अंक को शामिल न करने की गारंटी है।)
अरनौल्ड

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

2

Tcl, 529 बाइट्स

fconfigure stdin -en utf-8
foreach c [split [read stdin] {}] {scan $c %c n
if {$n < 256} {append s $c} {incr n -44032
append s [string index gKndTrmbPsS-jJCktph [expr $n/588]][lindex {a ae ya yae eo e yeo ye o wa wae oe yo u wo we wi yu eu ui i} [expr $n%588/28]][string index -Ak-n--tl-------mp-BGQDEkFph [expr $n%28]]}}
puts [string map {nr nn
A- g An ngn Ar ngn Am ngm A kk
t- d p- b B- s D- j
nr ll l- r ln ll lr ll
A k B t G t D t E t F t
K kk T tt P pp S ss J jj C ch Q ng
- ""} [regsub -all -- {[tpBDEFh]([nrm])} $s n\\1]]

कलन विधि

  1. सीसा, स्वर और पूंछ सूचकांकों में अपघटन
  2. मध्यवर्ती अक्षीय प्रतिनिधित्व के लिए पहली खोज
  3. सभी xn → nn / xm → nm परिवर्तनों के लिए एक प्रारंभिक पास लागू करें
  4. शेष परिवर्तनों के लिए एक अंतिम पास लागू करें

यह एल्गोरिथ्म चुनौती के प्रयोजनों के लिए crunched है; व्यापार-बंद होने के नाते यह माना जाता है कि इनपुट में लैटिन वर्णमाला के किसी भी अक्षर को शामिल नहीं किया गया है , न ही चुनौती में वर्णित के रूप में U + AC00 हंगुल ब्लॉक के बाहर के पात्रों का उपयोग करने के लिए। यह असली कोड था, मैं जामो में सभी परिवर्तनों को अंतिम पास तक रखूंगा।

मुझे लगता है कि मैं उन स्वरों और लुकअप तालिका में कुछ पुनरावृत्ति को कम करने के लिए कुछ और दिमाग लगा सकता हूं, लेकिन यह उतना ही अच्छा है जितना कि यह आज मुझसे मिलता है।

परिक्षण

सुनिश्चित करें कि आप Tcl दुभाषिया को UTF-8 इनपुट प्रदान कर सकते हैं। यह एक सरल UTF-8 टेक्स्ट फ़ाइल के साथ सबसे आसानी से पूरा होता है। काश, Tcl अभी भी डिफ़ॉल्ट रूप से UTF-8 के लिए डिफ़ॉल्ट नहीं होती; यह मेरी लागत 33 बाइट्स है।

यहाँ मेरी (वर्तमान में दयनीय) परीक्षण फ़ाइल है:

한
안녕하세요
나랏말싸미 듕귁에달아

टिप्पणियाँ

मैं कोरियाई भाषा के बारे में कुछ नहीं जानता (सिवाय इसके कि मैंने यहां क्या सीखा है)। यह एक पहला प्रयास है, जो प्रश्न विनिर्देश में अपडेट होने के कारण संभावित संशोधन लंबित है।

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

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