Golff y Côd - ทรีกลาด


16

อ่าน yng Nghymraeg นี้

ท้าทาย

ให้คำในภาษาเวลส์ส่งออกรูปแบบคำที่กลายพันธุ์ทั้งหมดที่เป็นไปได้

การกลายพันธุ์

การกลายพันธุ์คือการเปลี่ยนแปลงของตัวอักษรตัวแรกของคำเมื่อทำตามคำบางคำหรือในบริบททางไวยากรณ์ที่แน่นอน

ในภาษาเวลส์รายการต่อไปนี้ถูกพิจารณาเป็น "พยัญชนะ":

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]หมายความว่า g ถูกลบออกจากจุดเริ่มต้นของคำ

โปรดทราบว่ามีพยัญชนะบางตัวที่ไม่ได้กลายพันธุ์:

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
ArtOfCode

กรณีทดสอบอีกtheatr; tเปลี่ยนแปลง แต่thไม่
Antti Haapala

ควรเป็น 'Golff y Côd' - 'yr' มาก่อนเสียงสระเท่านั้นคุณใช้ 'y' ก่อนตัวอักษร
Gareth

หากใครสนใจกฎที่ซับซ้อนเกี่ยวกับการกลายพันธุ์ในภาษาเวลส์มีแอพที่เรียกว่า 'Ap Treiglo' ซึ่งให้กฎและแสดงคำศัพท์มากมายที่ทำให้เกิดการกลายพันธุ์ในคำต่อไปนี้
Gareth

@Beta Decay Yeah ในช่วง 5 ปีที่ผ่านมา Rhyl ก่อนหน้านั้นเพื่อบาปของฉัน
Gareth

คำตอบ:


5

JavaScript (ES6), 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

เอาต์พุตเป็นอาร์เรย์ของสตริง นี่เป็นความพยายามครั้งแรกของฉันดังนั้นมันจึงค่อนข้างไม่เหมาะสม

ลองดู


มันไม่ได้ดีที่สุด แต่พีซีของฉันตัดสินใจที่จะปิดตัวเองและฉันไม่จำอีกต่อไปว่าการเพิ่มประสิทธิภาพที่ฉันสามารถทำได้
Neil

4

C #, 356 338 360ไบต์

ฉันรู้ว่า C # เป็นตัวเลือกที่แย่สำหรับการตีกอล์ฟ แต่มันก็คุ้มค่ากับการยิง:

ความพยายามครั้งที่สามตอนนี้ทุกกรณีผ่านไปรวมถึงการปรับค่าใช้จ่ายนี้ประมาณ 18 ไบต์

ขอบคุณ pinkfloydx33 สำหรับเคล็ดลับการประหยัด 24 ไบต์!

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 (บันทึกการข้ามด้วย) และเพียงแทนที่รายการแรกด้วยตัวเอง (ฉันคิดว่า) คุณเพียงแค่โทรไปที่ regex เพียงครั้งเดียวดังนั้นการแคช / เปลี่ยนชื่อค่าใช้จ่ายในการนำเข้ามากกว่าText.RegularExpressions.Regex.Replace(...)ในเนื้อหา การพักเบรคยังไม่จำเป็นเพราะมันจะมีการจับคู่เพียงครั้งเดียวไม่สำคัญว่ามันจะวนไปจนจบ
pinkfloydx33

1
ไม่มีตัวเลือกภาษาที่แย่สำหรับการเล่นกอล์ฟ - คุณแข่งขันกับคนอื่นที่ต้องการลองและเอาชนะคุณในภาษาเดียวกัน Plus C # ครั้งหนึ่งเคยเป็นภาษาการเล่นกอล์ฟที่ถูกเลือกสำหรับ Jon Skeet ...
trichoplax

@ pinkfloydx33 ขอบคุณสำหรับเคล็ดลับ! อย่างไรก็ตามฉันไม่สามารถลบการเรียก Console.WriteLine ครั้งแรกได้เนื่องจากจะเป็นการข้ามการแสดงผลคำในกรณีที่ไม่มีการแทนที่ ฉันแน่ใจว่ามีวิธีการเพิ่มประสิทธิภาพโดยการเปลี่ยนเงื่อนไข
Grizzly

ฉันเพิ่งเห็นtheatrกรณีและดูเหมือนว่าการกลายพันธุ์ไม่ถูกต้อง
Grizzly

ใช่มีหลายกรณีทดสอบที่ไม่ผ่านในขณะนี้เพราะ PH, TH, CH และ DD ไม่ได้รับการเปลี่ยน
pinkfloydx33

3

Python 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

C #, 349 ไบต์

ตามการส่งของ @ Grizzly แต่ได้รับการแก้ไขให้ทำงานกับพยัญชนะที่ไม่ได้รับการแปลง (ph / ch / th / dd) ที่มันไม่ได้ทำงานรวมทั้งตัดส่วนเกินออกบางส่วน หวังว่าไม่เป็นไร

ฉันลงไปที่ 290 จนกว่าฉันจะรู้ว่าฉันหายไปในกรณีที่ th / 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);
        }
    }
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.