स्पूनराइज शब्द… फिनिश में


19

यह चुनौती पर आधारित है, और इसमें एक ऑल्टो विश्वविद्यालय में लिया गया प्रोग्रामिंग कोर्स है , जिसमें मैंने एक प्रोग्रामिंग कोर्स किया है । सामग्री का उपयोग अनुमति के साथ किया जाता है।

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

फ़िनिश में चम्मच

फिनिश में, स्वर हैं aeiouyäöऔर व्यंजन हैं bcdfghjklmnpqrstvwxz। (å तकनीकी रूप से फिनिश का हिस्सा है, लेकिन यहां नहीं माना जाता है।)

सबसे बुनियादी spoonerisms केवल प्रत्येक शब्द का पहला स्वर लेते हैं, और किसी भी व्यंजन से पहले उन्हें लेते हैं, और भागों का आदान-प्रदान करते हैं:

henri kontinen -> konri hentinen
tarja halonen -> harja talonen
frakki kontti -> kokki frantti
ovi kello -> kevi ollo

लंबे स्वर

कुछ शब्दों में एक ही लगातार स्वर के दो होते हैं। उन मामलों में, स्वर जोड़ी को दूसरे शब्द के पहले स्वर के साथ स्वैप किया जाना चाहिए, लंबाई को समान रखने के लिए स्वरों को छोटा या लंबा करना।

haamu kontti -> koomu hantti
kisko kaappi -> kasko kiippi

दो अलग-अलग स्वरों के मामले में यह लागू नहीं होता है:

hauva kontti -> kouva hantti
puoskari kontti -> kooskari puntti

एक ही लगातार पत्र के तीन या अधिक इनपुट में प्रकट नहीं

स्वर का सामंजस्य

फ़िनिश में इस प्यारी चीज़ को स्वर सामंजस्य कहा जाता है । मूल रूप से, इसका मतलब है कि पीछे स्वर aou और सामने स्वर äöy एक ही शब्द में नहीं दिखाई देने चाहिए।

जब एक शब्द में आगे या पीछे स्वरों की अदला-बदली, शब्द के बाकी हिस्सों में अन्य प्रकार के सभी स्वर शब्द के नई शुरुआत मैच के लिए बदला जाना चाहिए ( a <-> ä, o <-> ö, u <-> y):

yhä kontti -> kouha ntti
hauva läähättää -> yvä haahattaa

eऔर iतटस्थ हैं और अन्य सभी अक्षरों के साथ दिखाई दे सकते हैं; उन्हें एक शब्द में स्वैप करना करने से बाकी शब्द में परिवर्तन नहीं होना चाहिए

विशेष स्थितियां

स्वर के सामंजस्य कुछ शब्दों पर लागू नहीं होते हैं, जिसमें कई ऋण शब्द और यौगिक शब्द शामिल हैं। इन मामलों को "सही ढंग से" संभालने की आवश्यकता नहीं है।

चुनौती

दो शब्दों को देखते हुए, स्पूनराइज्ड शब्दों का उत्पादन करें।

इनपुट शब्दों में केवल अक्षर होंगे a-zऔर äö। आप अपरकेस या लोअरकेस का उपयोग करना चुन सकते हैं, लेकिन आपकी पसंद शब्द और इनपुट / आउटपुट दोनों के बीच संगत होनी चाहिए।

I / O किसी भी सुविधाजनक प्रारूप में किया जा सकता है । (शब्दों को वर्णों का तार या सारणी माना जाना चाहिए।)

यह , इसलिए बाइट्स जीत में सबसे छोटा समाधान है।

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


क्या हम एक इनपुट / आउटपुट एन्कोडिंग चुन सकते हैं? इसके अलावा, क्या यह स्वीकार करना आवश्यक है कि इनपुट एकल वर्णों के बजाय डायक्टिक्स के संयोजन का उपयोग करता है?
दरवाज़े

@Doorknob आप किसी भी एन्कोडिंग का चयन कर सकते हैं, लेकिन पाठ एनएफसी (यानी कोई संयोजन वर्ण) में नहीं होगा। एन्कोडिंग कुछ भाषाओं के साथ संगतता का मामला हो सकता है, लेकिन एनएफसी / एनएफडी शायद नहीं होगा। (जो कुछ भी संभाल सकता है, वह ठीक U+0308 COMBINING DIAERESISहोना चाहिए U+00E4 LATIN SMALL LETTER A WITH DIAERESIS।)
पुरकाकूदरी

1
के बाद से eऔर iतटस्थ हैं, कर रहे हैं fihus keksy, huvu lehyऔर lesmä prihtiके लिए स्वीकार्य जवाब kehys fiksu, levy huhuऔर prisma lehtiक्रमशः?
अरनुलद

1
एक पक्ष की टिप्पणी के रूप में: लंबे स्वरों और स्वर के सामंजस्य के कारण, फिनिश स्पूनरिज्म एक अनैच्छिक कार्य नहीं है । उदाहरण के लिए: puoskari äyskäri --> äöskäri puuskari --> puoskari ääskäri
अरनुलद

@Arnauld नहीं, मैं प्रश्न को अपडेट करूंगा; तटस्थ स्वरों में कोई परिवर्तन नहीं होना चाहिए।
पुरकाकूदरी

जवाबों:


9

जावास्क्रिप्ट (ईएस 6 ), 196 175 बाइट्स

करी वाक्य रचना में शब्दों को दो तार के रूप में लेता है (a)(b)। वर्णों के दो सरणियों की एक सरणी देता है।

a=>b=>[(e=/(.*?)([eiäaöoyu])(\2?)(.*)/,g=(a,[,c,v])=>[...c+v+(a[3]&&v)+a[4]].map(c=>(j=e.search(v),i=e.search(c))>9&j>9?e[i&~1|j&1]:c))(a=e.exec(a),b=e.exec(b),e+=e),g(b,a)]

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

कैसे?

प्रत्येक इनपुट शब्द को नियमित अभिव्यक्ति के माध्यम से पारित किया जाता है ई के , जिसमें 4 कैप्चरिंग समूह होते हैं:

e = /(.*?)([eiäaöoyu])(\2?)(.*)/    1: leading consonants (or empty)
     [ 1 ][     2    ][ 3 ][ 4]     2: first vowel
                                    3: doubled first vowel (or empty)
                                    4: all remaining characters

सहायक फ़ंक्शन जी () शब्द के सभी कैप्चरिंग समूहों को अद्यतन के रूप में लेता है एक [] के और दूसरे शब्द के पहले और दूसरे कैप्चरिंग समूहों को सी और वी के रूप में ।

हम बुनियादी स्पूनरिज़्म लागू करते हैं और लंबे स्वरों का ध्यान रखते हैं:

c + v + (a[3] && v) + a[4]

स्वर-सामंजस्य को लागू करने के लिए, हम सबसे पहले नियमित अभिव्यक्ति का समन्वय करते हैं ही में जोड़ने से है, जो देता है द्वारा एक स्ट्रिंग के लिए:

e = "/(.*?)([eiäaöoyu])(\2?)(.*)//(.*?)([eiäaöoyu])(\2?)(.*)/"
     ^^^^^^^^^^^^^^^^
     0123456789ABCDEF (position as hexa)

स्वर जिन्हें सामंजस्य बनाने की आवश्यकता है, उनके परिणामस्वरूप स्ट्रिंग में 9 से अधिक की स्थिति है। इसके अलावा, अभिव्यक्ति इस तरह से कि सामने स्वर में आयोजित किया गया एओवाय भी पदों पर स्थित हैं, जबकि वापस स्वर aou विषम स्थितियों में, उनके समकक्षों के बगल में स्थित हैं।

इसलिए निम्न अनुवाद सूत्र जो आउटपुट शब्द के प्रत्येक वर्ण c पर लागू होता है:

(j = e.search(v), i = e.search(c)) > 9 & j > 9 ? e[i & ~1 | j & 1] : c

4

पायथन 3 , 235 231 225 221 217 215 बाइट्स

import re
S=F,B='äöy','aou'
def f(a,b,C=1):
 e,r,Q,W=re.findall(fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'*2,a+' '+b)[0][2:6]
 for c in zip(*S*(W in B)+(B,F)*(W in F)):r=r.replace(*c)
 return[Q+W*len(e)+r]+(C and f(b,a,[]))

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


बचाया

  • -2 बाइट्स, लिन का धन्यवाद
  • -4 बाइट्स, Zacharý को धन्यवाद

2
दो बाइट्स के साथ सहेजें:fr' ?(.*?([ei{B+F}]))(\2)?(\w*)'
लिन

1
इससे भी बेहतर: आप दूसरी पंक्ति को बदल सकते हैं S='äöy','aou', फिर पाँचवीं पंक्ति पर: (F,B)=> Sऔर (B,F)=> S[::-1](यह सुझाव @ असंगत दिए गए सुझाव के साथ असंगत है)
Zacharý

इसके अलावा, आप e,r,Q,W=re.findall(r' ?(.*?([eiaouäöy]))(\2)?(\w*)'*2,a+' '+b)[0][2:5]बचाई गई कुछ और बाइट्स के लिए चौथी पंक्ति को बदल सकते हैं ।
ज़ाचरी

मेरे कहने का मतलब था: दूसरी पंक्ति S=F,B='aöy','aou'और फिर चौथी पंक्ति में बदल (F,B)जाना S
ज़ाचरी

S=F,B=...कुछ बाइट्स बचाना चाहिए अगर आप के (F,B)साथS
Zacharý

0

पायथ, 84 बाइट्स

.b++hY*W@N2JhtY2XW}JeA@DJc2"aouäöy"eNGH_Bmth:d:"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]"4

इसे ऑनलाइन आज़माएं। परीक्षण सूट।

यह साबित करना कि यह गोल्फ भाषाओं में उतना कठिन नहीं है । एक स्टैक-आधारित भाषा और भी बेहतर कर सकती है।

Pyth डिफ़ॉल्ट रूप से ISO-8859-1 का उपयोग करता है, इसलिए äöप्रत्येक एक बाइट है।

व्याख्या

  • Q, शब्दों की इनपुट जोड़ी से युक्त, स्पष्ट रूप से जोड़ा जाता है।
  • m: dइनपुट में प्रत्येक शब्द को मैप करें:
    • :"^([^A*)([A)(\\2)*(.+)"\A"aeiouyäö]": की जगह Aके साथ aeiouyäö]regex पाने के लिए स्ट्रिंग में ^([^aeiouyäö]*)([aeiouyäö])(\2)*(.+)
    • :d: सभी मैच खोजें और उनके कैप्चरिंग समूहों को वापस करें।
    • h: पहला (और केवल) मैच लें।
    • t: पूरे मैच वाले पहले समूह को छोड़ दें।
  • _B: पाने के लिए रिवर्स के साथ जोड़ी [[first, second], [second, first]]
  • .b: N, Yउसमें शब्दों के प्रत्येक जोड़े को मैप करें:
    • hY: दूसरे शब्द के शुरुआती व्यंजन लें।
    • @N2: पहले शब्द का लंबा पहला स्वर लें, या None
    • htY: दूसरे शब्द का पहला स्वर लें।
    • J: उस में सहेजें J
    • *W... 2: अगर कोई लंबा स्वर था, तो दूसरे शब्द के स्वर की नकल करें।
    • +: कि व्यंजन के लिए append।
    • c2"aouäöy": aouäöyदो में विभाजित करने के लिए मिलता है ["aou", "äöy"]
    • @DJ: दूसरे शब्द के पहले स्वर के साथ प्रतिच्छेदन द्वारा जोड़ी को क्रमबद्ध करें। यह जोड़ी के अंत में दूसरे शब्द के पहले स्वर के साथ आधा हो जाता है।
    • A: जोड़ी को बचाओ G, H
    • e: दूसरी छमाही लें।
    • }J: देखें कि क्या दूसरे शब्द का पहला स्वर दूसरी छमाही में है।
    • XW... eNGH: यदि यह था, तो पहले शब्द के प्रत्यय में नक्शा Gहै H, अन्यथा प्रत्यय के रूप में रखें।
    • +: प्रत्यय लगाएं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.