Golff y Côd - Treiglad


16

Đọc này yng Nghymraeg

Thử thách

Cho một từ trong tiếng Wales, xuất ra tất cả các dạng đột biến có thể có của từ đó.

Đột biến

Đột biến là sự thay đổi chữ cái đầu tiên của từ khi theo một số từ nhất định hoặc trong ngữ cảnh ngữ pháp nhất định.

Trong tiếng Wales, những điều sau đây được coi là "phụ âm":

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

Lưu ý rằng nhiều phụ âm ký tự như ch, ng và rh được tính là một chữ cái trong tiếng Wales và do đó một phụ âm.

Các chữ cái khác trong bảng chữ cái tiếng Wales là nguyên âm, được liệt kê dưới đây:

a e i o u w y

Xem bên dưới, tất cả các đột biến với chữ cái gốc ở bên trái và các chữ cái bị đột biến ở bên phải:

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

Ở đây, [no letter]có nghĩa là g được loại bỏ từ đầu của từ.

Lưu ý rằng có một số phụ âm không biến đổi:

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

Nguyên âm cũng có thể được tìm thấy ở đầu từ nhưng không biến đổi:

a
e
i
o
u
w
y

Ví dụ

Đầu vào: dydd

Đầu ra:

dydd
ddydd
nydd

Đầu vào: pobl

Đầu ra:

pobl
bobl
mhobl
phobl

Đầu vào: gwernymynydd

Đầu ra:

gwernymynydd
wernymynydd
ngwernymynydd

Đầu vào: ffrindiau

Đầu ra:

ffrindiau

Đầu vào: enw

Đầu ra:

enw

Đầu vào: theatr

Đầu ra:

theatr

Theo yêu cầu của ArtOfCode;)

Đầu vào: llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Đầu ra:

llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Quy tắc

Đầu vào sẽ chỉ là một từ.

Sẽ luôn có nhiều chữ cái hơn sau phụ âm đầu trong đầu vào của bạn.

Chiến thắng

Mã ngắn nhất tính bằng byte thắng.


5
Trường hợp thử nghiệm mới:llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
ArtOfCode

Một trường hợp thử nghiệm khác theatr; tđột biến nhưng thkhông.
Antti Haapala

Nên là 'Golff y Côd' - 'yr' chỉ xuất hiện trước nguyên âm, bạn sử dụng 'y' trước phụ âm.
Gareth

Nếu bất cứ ai quan tâm đến các quy tắc phức tạp liên quan đến đột biến ở xứ Wales, thì có một ứng dụng có tên 'Ap Treiglo' cung cấp các quy tắc và liệt kê nhiều từ gây đột biến trong từ sau.
Gareth

@Beta Decay Vâng, trong 5 năm qua. Rhyl trước đó, vì tội lỗi của tôi.
Gareth

Câu trả lời:


5

JavaScript (ES6), 180 byte

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

Đầu ra là một chuỗi các chuỗi. Đây là lần thử đầu tiên của tôi, vì vậy nó gần như chắc chắn không tối ưu.

Dùng thử


Nó không tối ưu, nhưng PC của tôi đã quyết định tự tắt và tôi không còn nhớ mình có thể thực hiện tối ưu hóa gì nữa.
Neil

4

C #, 356 338 360 byte

Tôi biết rằng C # là một lựa chọn kém cho môn đánh gôn, nhưng nó đáng để thử:

Lần thử thứ ba, tất cả các trường hợp đều vượt qua, bao gồm cả ... điều chỉnh này có giá khoảng 18 byte.

Cảm ơn Pinkfloydx33 vì các mẹo tiết kiệm 24 byte!

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;}}}}}

Đầu ra

$> ./p gwernymynydd
gwernymynydd
wernymynydd
ngwernymynydd

Phiên bản được định dạng

    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}"chỉ nên f, bạn cũng có thể lưu cuộc gọi đầu tiên để viết dòng, cũng như hành động, bằng cách không bỏ qua phần tử đầu tiên trong b (lưu cả bỏ qua) và chỉ thay thế mục đầu tiên bằng chính nó (tôi nghĩ). Bạn cũng chỉ thực hiện một cuộc gọi đến regex để bộ nhớ đệm / đổi tên chi phí nhập nhiều hơn chỉ Text.RegularExpressions.Regex.Replace(...)trong cơ thể. Sự phá vỡ cũng là không cần thiết vì nó sẽ chỉ khớp một lần không thành vấn đề nếu nó lặp lại đến hết
Pinkfloydx33

1
Không có lựa chọn ngôn ngữ nào cho golf - bạn đang cạnh tranh với bất kỳ ai khác muốn thử và đánh bại bạn trong cùng một ngôn ngữ. Plus C # đã từng là ngôn ngữ chơi golf được lựa chọn cho Jon Skeet ...
trichoplax

@ Pinkfloydx33 Cảm ơn lời khuyên! Tuy nhiên tôi không thể xóa cuộc gọi Console.WriteLine đầu tiên vì điều này sẽ bỏ qua việc xuất từ ​​trong trường hợp không có thay thế cho nó. Tôi chắc chắn có một cách để tối ưu hóa nó bằng cách thay đổi điều kiện.
Grizzly

Tôi chỉ phát hiện theatrtrường hợp và có vẻ như nó không biến đổi chính xác.
Grizzly

Vâng, có một số trường hợp thử nghiệm không vượt qua tại thời điểm này vì PH, TH, CH và DD không được chuyển đổi
Pinkfloydx33

3

Python 3, 196.189 185 byte

Nỗ lực ban đầu

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 lưu ý rằng not w.find(a)sẽ thay thế cho việc w.startswith(a)đó sẽ cứu được 2 ký tự. Nhưng thay vì not x and ychúng ta có thể sử dụng x or yđể tiết kiệm một số ký tự hơn:

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())]

Tiết kiệm hơn nữa bằng cách thay thế w.replace(a,i,1)bằng 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())]

Sau đó, tôi nhận thấy rằng có một lỗi, rhđược liệt kê hai lần; một lần trong danh sách ngắn mạch của tôi sẽ chăm sóc những phụ âm hai chữ cái đó. Thật không may ddlà mất tích từ đó, vì vậy không có tiết kiệm, và chúng tôi có

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())]

Cho bất kỳ đầu vào mẫu nào, nó cho đầu ra mong muốn; được

gorsaf

nó xuất ra

gorsaf
orsaf
ngorsaf

và cho đầu vào

theatr

nó in

theatr

3

PowerShell v3 +, 254 231 byte

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')

làm việc để chơi gôn hơn nữa ...

Ví dụ

(Đầu ra được phân tách bằng dấu cách vì đó là Dấu tách trường đầu ra mặc định cho các mảng được xâu chuỗi. Tôi không biết liệu các từ tôi sử dụng để kiểm tra có phải là các từ thực tế hay không, nhưng chúng có phù hợp với các ngoại lệ không.)

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 byte

Dựa trên @ grizzly's đệ trình , nhưng đã sửa để làm việc với các phụ âm không được chuyển đổi (ph / ch / th / dd) mà nó không hoạt động, cộng với việc cắt bớt một số dư thừa. Hy vọng là ổn chứ?

Tôi đã giảm xuống còn 290 cho đến khi tôi nhận ra rằng tôi đã bỏ lỡ các trường hợp th / ch / ph / dd :-(. Thêm vào cuộc gọi Regex đã giết chết nó

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);}}}

Lưu ý thú vị, không bao giờ biết rằng bạn có thể bỏ qua khoảng trống giữa var r in"string"

Định dạng:

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);
        }
    }
}

0

Perl 6 , 162 byte

{/^(.|<[cprt]>h|dd|ff|ng|ll)(.*)/;(%('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>){$0}//~$0).map(*~$1)}

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.