गोलफ वाई कॉड - ट्रेग्लाड


16

इस योग को पढ़ें

चुनौती

वेल्श में एक शब्द दिया, शब्द के सभी संभव उत्परिवर्तित रूपों का उत्पादन।

उत्परिवर्तन

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

वेल्श में, निम्नलिखित "व्यंजन" माने जाते हैं:

b c ch d dd f ff g ng h l ll m n p ph r rh s t th

ध्यान दें कि कई वर्ण व्यंजन जैसे ch, ng और rh को वेल्श में एक अक्षर के रूप में गिना जाता है , और इसलिए एक व्यंजन।

वेल्श वर्णमाला के अन्य अक्षर स्वर हैं, जिन्हें नीचे सूचीबद्ध किया गया है:

a e i o u w y

नीचे देखें, बाईं ओर मूल पत्र के साथ सभी उत्परिवर्तन और दाईं ओर परिणामित उत्परिवर्तित पत्र:

Original | Mutations
---------+---------------
p        | b mh ph
t        | d nh th
c        | g ngh ch
b        | f m
d        | dd n
g        | [no letter] ng
m        | f
ll       | l
rh       | r

यहां, [no letter]इसका मतलब है कि शब्द की शुरुआत से जी हटा दिया गया है।

ध्यान दें कि कुछ व्यंजन ऐसे हैं जो उत्परिवर्तित नहीं करते हैं:

ch
dd
f
ff
j
l
n
ng
ph
r
s
th

शब्द के आरंभ में स्वर भी मिल सकते हैं लेकिन उत्परिवर्तित न करें:

a
e
i
o
u
w
y

उदाहरण

इनपुट: dydd

आउटपुट:

dydd
ddydd
nydd

इनपुट: pobl

आउटपुट:

pobl
bobl
mhobl
phobl

इनपुट: gwernymynydd

आउटपुट:

gwernymynydd
wernymynydd
ngwernymynydd

इनपुट: ffrindiau

आउटपुट:

ffrindiau

इनपुट: enw

आउटपुट:

enw

इनपुट: theatr

आउटपुट:

theatr

ArtOfCode के अनुरोध पर;)

इनपुट: llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

आउटपुट:

llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

नियम

इनपुट केवल एक शब्द होगा।

आपके इनपुट में अग्रणी व्यंजन के बाद हमेशा अधिक अक्षर होंगे।

जीतना

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


5
नया परीक्षण मामला:llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
आर्टऑफकोड

एक और परीक्षण मामला theatr; tपरिवर्तन thकरता है, लेकिन नहीं करता है।
अंती हापाला

'गोल्फ़ वाई कोड' होना चाहिए - 'यर' केवल एक स्वर से पहले आता है, आप एक कंसिस्टेंट से पहले 'y' का उपयोग करते हैं।
गैरेथ

यदि किसी को वेल्श में उत्परिवर्तन के बारे में जटिल नियमों में दिलचस्पी है, तो 'एप ट्रेगलो' नामक एक ऐप है जो नियमों को देता है और कई शब्दों को सूचीबद्ध करता है जो निम्नलिखित शब्द में उत्परिवर्तन का कारण बनते हैं।
गैरेथ

पिछले 5 वर्षों से @Beta Decay हाँ। इससे पहले कि मेरे पापों के लिए राइल।
गैरेथ

जवाबों:


5

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

x=>x.replace(/^([cpt](?!h)|d(?!d)|[bgm]|ll|rh)(.+)/,(_,y,z)=>({p:"b mh ph",t:"d nh th",c:"g ngh ch",b:"f m",d:"dd n",g:" ng",m:"f"}[y]||y[0]).split` `.map(b=>a.push(b+z)),a=[x])&&a

स्ट्रिंग्स की एक सरणी के रूप में आउटपुट। यह मेरी पहली कोशिश है, इसलिए यह लगभग निश्चित रूप से इष्टतम नहीं है।

कोशिश करके देखो


यह इष्टतम नहीं है, लेकिन मेरे पीसी ने खुद को बंद करने का फैसला किया, और मुझे अब याद नहीं है कि मैं किस अनुकूलन को बनाने में सक्षम था।
नील

4

सी #, 356 338 360 बाइट्स

मुझे पता है कि C # कोड गोल्फ के लिए एक खराब विकल्प है, लेकिन यह शॉट के लायक है:

तीसरा प्रयास, अब सभी मामले पास हो जाते हैं, जिनमें th- ph- आदि शामिल हैं। इस समायोजन की लागत लगभग 18 बाइट्स है।

24 बाइट्स की बचत करने वाले सुझावों के लिए धन्यवाद Pinkfloydx33!

namespace System{using Linq;using S=String;class P{static void Main(S[]a){Action<S>w=Console.WriteLine;w(a[0]);foreach(S r in"th-dd-ch-ph-p.b.mh.ph-t.d.nh.th-c.g.ngh.ch-b.f.m-d.dd.n-g..ng-m.f-ll.l-rh.r".Split('-')){var b=r.Split('.');if(a[0].StartsWith(b[0])){foreach(S f in b.Skip(1))w(Text.RegularExpressions.Regex.Replace(a[0],$"^{b[0]}",f));break;}}}}}

उत्पादन

$> ./p gwernymynydd
gwernymynydd
wernymynydd
ngwernymynydd

स्वरूपित संस्करण

    namespace System {
    using Linq;
    using S = String;

    class P {
        static void Main(S[] a) {
            Action<S> w = Console.WriteLine;
            w(a[0]);
            foreach (S r in "th-dd-ch-ph-p.b.mh.ph-t.d.nh.th-c.g.ngh.ch-b.f.m-d.dd.n-g..ng-m.f-ll.l-rh.r"
                .Split('-')) {
                var b = r.Split('.');
                if (a[0].StartsWith(b[0])) {
                    foreach (S f in b.Skip(1))
                        w(Text.RegularExpressions.Regex.Replace(a[0], $"^{b[0]}", f));
                    break;
                }
            }
        }
    }
}

1
$"{f}"बस होना चाहिए f, आप पहली पंक्ति को लिखने के लिए, साथ ही एक्शन को भी सहेज सकते हैं, पहले तत्व को b में न छोड़ कर (स्किप को भी बचा सकते हैं) और बस पहले आइटम को स्वयं के साथ प्रतिस्थापित करें (मुझे लगता है)। आप केवल एक ही कॉल को फिर से शुरू करने के लिए करते हैं ताकि कैशिंग / आयात का नाम बदलकर सिर्फ Text.RegularExpressions.Regex.Replace(...)शरीर में खर्च किया जा सके। ब्रेक भी शानदार है क्योंकि यह केवल एक बार मैच होने वाला नहीं है, अगर यह अंत तक लूप करता है
Pinkfloydx33

1
गोल्फ के लिए भाषा की कोई खराब पसंद नहीं है - आप किसी और के खिलाफ प्रतिस्पर्धा कर रहे हैं जो आपको उसी भाषा में कोशिश करना और हरा देना चाहता है। प्लस सी # एक बार जॉन स्कीट के लिए पसंद की गोल्फ भाषा थी ...
ट्राइकोप्लेक्स सिप

@ Pinkfloydx33 सुझावों के लिए धन्यवाद! हालाँकि मैं पहले कंसोल को नहीं हटा सकता हूं। लाइटलाइन कॉल क्योंकि यह शब्द को आउटपुट करना छोड़ देगा, अगर इसके लिए कोई प्रतिस्थापन नहीं है। मुझे यकीन है कि वहाँ एक तरीका है कि हालत को बदलकर इसे कैसे अनुकूलित किया जाए।
ग्रिजली

मुझे सिर्फ theatrमामला दिखाई दिया और ऐसा लगता है कि यह सही तरीके से नहीं बदल रहा है।
ग्रिजली

हाँ, कई परीक्षण मामले हैं जो इस समय पास नहीं करते हैं क्योंकि PH, TH, CH और DD परिवर्तित नहीं होते हैं
Pinkfloydx33

3

पायथन 3, 196,189 185 बाइट्स

मूल प्रयास

w=input();print(w);[w.startswith(a)and[print(w.replace(a,i,1))for i in
r]+exit()for(a,*r)in(j.split(',')for j
in'th rh ph p,b,mh,ph t,d,nh,th c,g,ngh,ch b,f,m d,dd,n g,,ng m,f ll,l rh,r'.split())]

Vaultah ने कहा कि not w.find(a)इसके लिए एक प्रतिस्थापन w.startswith(a)होगा जो 2 पात्रों को बचाएगा। लेकिन इसके बजाय not x and yहम उपयोग कर सकते हैं x or yजो कुछ पात्रों को बचाता है:

w=input();print(w);[w.find(a)or[print(w.replace(a,i,1))for i in
r]+exit()for(a,*r)in(j.split(',')for j
in'th rh ph p,b,mh,ph t,d,nh,th c,g,ngh,ch b,f,m d,dd,n g,,ng m,f ll,l rh,r'.split())]

अभी भी आगे की जगह के w.replace(a,i,1)साथ बचत i+w[len(a):]:

w=input();print(w);[w.find(a)or[print(i+w[len(a):])for i in
r]+exit()for(a,*r)in(j.split(',')for j
in'th rh ph p,b,mh,ph t,d,nh,th c,g,ngh,ch b,f,m d,dd,n g,,ng m,f ll,l rh,r'.split())]

तब मैंने देखा कि एक बग rhथा , दो बार सूचीबद्ध किया गया था; एक बार मेरी शॉर्ट-सर्किट सूची में जो उन डबल-अक्षर व्यंजन का ध्यान रखेगा। दुर्भाग्य ddसे वहां से गायब था, इसलिए कोई बचत नहीं है, और हमारे पास है

w=input();print(w);[w.find(a)or[print(i+w[len(a):])for i in
r]+exit()for(a,*r)in(j.split(',')for j
in'th ph dd p,b,mh,ph t,d,nh,th c,g,ngh,ch b,f,m d,dd,n g,,ng m,f ll,l rh,r'.split())]

किसी भी नमूना इनपुट को देखते हुए, यह वांछित आउटपुट देता है; दिया हुआ

gorsaf

यह आउटपुट करता है

gorsaf
orsaf
ngorsaf

और इनपुट दिया

theatr

यह प्रिंट करता है

theatr

3

PowerShell v3 +, 254 231 बाइट्स

param($a)$a;$z=-join$a[1..$a.length]
if(($x=@{112='b mh ph';116='d nh th';99='g ngh ch';98='f m';100='dd n';109='f'})[+$a[0]]-and$a-notmatch'^[cpt]h|^dd'){-split$x[+$a[0]]|%{"$_$z"}}
($z,"ng$z")*($a[0]-eq103)
$z*($a-match'^ll|^rh')

आगे गोल्फ का काम ...

उदाहरण

(आउटपुट स्पेस-अलग है क्योंकि यह कड़े किए गए सरणियों के लिए डिफ़ॉल्ट आउटपुट फील्ड सेपरेटर है। मुझे नहीं पता कि परीक्षण के लिए मैंने जिन शब्दों का इस्तेमाल किया है वे वास्तविक शब्द हैं, लेकिन वे अपवादों को फिट करते हैं।)

PS C:\Tools\Scripts\golfing> 'dydd','pobl','gwernymynydd','ffrindiau','enw','rhee','llewyn','chern','ddydd','phobl'|%{"$_ --> "+(.\golff-yr-cod.ps1 $_)}
dydd --> dydd ddydd nydd
pobl --> pobl bobl mhobl phobl
gwernymynydd --> gwernymynydd wernymynydd ngwernymynydd
ffrindiau --> ffrindiau
enw --> enw
rhee --> rhee hee
llewyn --> llewyn lewyn
chern --> chern
ddydd --> ddydd
phobl --> phobl

1

सी #, 349 बाइट्स

@ ग्रिज़ली की सबमिशन के आधार पर , लेकिन उन व्यंजन के साथ काम करने के लिए सही किया गया है जो रूपांतरित नहीं हो (ph / ch / th / dd) जो इसके साथ काम नहीं कर रहा था, साथ ही कुछ अतिरिक्त को छाँट दिया। आशा है कि यह ठीक है?

मेरे पास यह 290 तक नीचे था जब तक मुझे एहसास नहीं हुआ कि मैं वें / ch / ph / dd मामलों को याद कर रहा था :-( और Regex कॉल में जोड़कर इसे मार दिया।

namespace System{class P{static void Main(string[]a){var x=a[0];if(!Text.RegularExpressions.Regex.IsMatch(x,"^[pct]h|^dd"))foreach(var r in"p.b.mh.ph-t.d.nh.th-c.g.ngh.ch-b.f.m-d.dd.n-g..ng-m.f-ll.l-rh.r".Split('-')){var b=r.Split('.');if(a[0].StartsWith(b[0]))for(int i=1;i<b.Length;)x+='\n'+b[i++]+a[0].Substring(b[0].Length);}Console.Write(x);}}}

दिलचस्प नोट, कभी नहीं पता था कि आप के बीच की जगह को छोड़ सकते हैं var r in"string"

प्रारूपित:

namespace System
{
    class P
    {
        static void Main(string[] a)
        {
            var x = a[0];
            if (!Text.RegularExpressions.Regex.IsMatch(x, "^[pct]h|^dd"))
                foreach (var r in"p.b.mh.ph-t.d.nh.th-c.g.ngh.ch-b.f.m-d.dd.n-g..ng-m.f-ll.l-rh.r".Split('-'))
                {
                    var b = r.Split('.');
                    if (a[0].StartsWith(b[0]))
                        for (int i = 1; i < b.Length;) x += '\n' + b[i++] + a[0].Substring(b[0].Length);
                }
            Console.Write(x);
        }
    }
}

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