Golff y Côd - Treiglad


16

Baca yng Nghymraeg ini

Tantangan

Diberi kata dalam bahasa Welsh, keluarkan semua bentuk kata yang mungkin termutasi.

Mutasi

Mutasi adalah perubahan huruf pertama dari suatu kata ketika mengikuti kata-kata tertentu atau dalam konteks tata bahasa tertentu.

Di Welsh, berikut ini dianggap "konsonan":

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

Perhatikan bahwa beberapa konsonan karakter seperti ch, ng dan rh dihitung sebagai satu huruf dalam bahasa Welsh, dan oleh karena itu satu konsonan.

Huruf-huruf lain dalam alfabet Welsh adalah vokal, tercantum di bawah ini:

a e i o u w y

Lihat di bawah ini, semua mutasi dengan huruf asli di sebelah kiri dan huruf yang bermutasi di sebelah kanan:

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

Di sini, [no letter]berarti bahwa g dihapus dari awal kata.

Perhatikan bahwa ada beberapa konsonan yang tidak bermutasi:

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

Vokal juga dapat ditemukan di awal kata tetapi tidak bermutasi:

a
e
i
o
u
w
y

Contohnya

Memasukkan: dydd

Keluaran:

dydd
ddydd
nydd

Memasukkan: pobl

Keluaran:

pobl
bobl
mhobl
phobl

Memasukkan: gwernymynydd

Keluaran:

gwernymynydd
wernymynydd
ngwernymynydd

Memasukkan: ffrindiau

Keluaran:

ffrindiau

Memasukkan: enw

Keluaran:

enw

Memasukkan: theatr

Keluaran:

theatr

Atas permintaan ArtOfCode;)

Memasukkan: llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Keluaran:

llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Aturan

Masukan hanya akan menjadi satu kata.

Akan selalu ada lebih banyak surat setelah konsonan utama dalam masukan Anda.

Kemenangan

Kode terpendek dalam byte menang.


5
llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
Kasing

Kasus uji lain theatr; tbermutasi tetapi thtidak.
Antti Haapala

Seharusnya 'Golff y Côd' - 'yr' hanya muncul sebelum vokal, Anda menggunakan 'y' sebelum konsonan.
Gareth

Jika ada yang tertarik pada aturan rumit tentang mutasi di Welsh, ada aplikasi bernama 'Ap Treiglo' yang memberikan aturan dan daftar banyak kata yang menyebabkan mutasi pada kata berikut.
Gareth

@ Beta Decay Ya, selama 5 tahun terakhir. Rhyl sebelum itu, untuk dosa-dosa saya.
Gareth

Jawaban:


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

Output sebagai array string. Ini adalah percobaan pertama saya, jadi hampir pasti tidak optimal.

Cobalah


Ini tidak optimal, tetapi PC saya memutuskan untuk mematikannya sendiri, dan saya tidak lagi ingat optimasi apa yang bisa saya lakukan.
Neil

4

C #, 356 338 360 byte

Saya tahu bahwa C # adalah pilihan yang buruk untuk kode golf, tetapi patut dicoba:

Upaya ketiga, semua case sekarang lulus, termasuk ph- dll. Biaya penyesuaian ini kira-kira 18 byte.

Terima kasih pinkfloydx33 untuk tips menghemat 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;}}}}}

Keluaran

$> ./p gwernymynydd
gwernymynydd
wernymynydd
ngwernymynydd

Versi Terformat

    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}"seharusnya f, Anda juga dapat menyimpan panggilan pertama untuk menulis baris, serta tindakan, dengan tidak melewatkan elemen pertama dalam b (menyimpan lompatan juga) dan hanya mengganti item pertama dengan dirinya sendiri (saya pikir). Anda juga hanya melakukan satu panggilan untuk regex sehingga Caching / penggantian nama biaya impor lebih dari sekadar Text.RegularExpressions.Regex.Replace(...)di tubuh. Istirahat ini juga berlebihan karena hanya akan cocok sekali tidak masalah jika ia sampai akhir
pinkfloydx33

1
Tidak ada pilihan bahasa yang buruk untuk golf - Anda bersaing dengan siapa pun yang ingin mencoba dan mengalahkan Anda dalam bahasa yang sama. Plus C # pernah menjadi bahasa golf pilihan untuk Jon Skeet ...
trichoplax

@ pinkfloydx33 Terima kasih atas tipsnya! Namun saya tidak dapat menghapus panggilan Console.WriteLine pertama karena ini akan melewatkan mengeluarkan kata jika tidak ada penggantian untuk itu. Saya yakin ada cara bagaimana mengoptimalkannya dengan mengubah kondisinya.
grizzly

Saya baru saja melihat theatrcase dan sepertinya tidak bermutasi dengan benar.
grizzly

Ya ada beberapa test case yang tidak lulus saat ini karena PH, TH, CH dan DD tidak berubah
pinkfloydx33

3

Python 3, 196.189 185 byte

Upaya asli

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 mencatat bahwa not w.find(a)akan menjadi pengganti w.startswith(a)yang akan menghemat 2 karakter. Tetapi alih-alih not x and ykita dapat menggunakan x or yyang menyimpan beberapa karakter lebih banyak:

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

Namun penghematan lebih lanjut dengan mengganti w.replace(a,i,1)dengan 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())]

Kemudian saya perhatikan ada bug, rhterdaftar dua kali; sekali dalam daftar hubung singkat saya yang akan mengurus konsonan huruf ganda. Sayangnya ddhilang dari sana, jadi tidak ada tabungan, dan kami punya

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

Mengingat salah satu input sampel, ini memberikan output yang diinginkan; diberikan

gorsaf

itu output

gorsaf
orsaf
ngorsaf

dan diberi input

theatr

itu mencetak

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

bekerja untuk golf lebih lanjut ...

Contohnya

(Keluaran dipisahkan oleh ruang karena itulah Pemisah Bidang Output default untuk array bersesuaian. Saya tidak tahu apakah kata-kata yang saya gunakan untuk pengujian adalah kata-kata aktual, tetapi mereka sesuai dengan pengecualian.)

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

Berdasarkan pengajuan @ grizzly , tetapi dikoreksi untuk bekerja dengan konsonan yang tidak ditransformasikan (ph / ch / th / dd) yang tidak berfungsi, ditambah memangkas kelebihan kelebihan. Semoga itu tidak apa-apa?

Aku turun ke 290 sampai aku menyadari bahwa aku kehilangan kasus th / ch / ph / dd :-(. Menambahkan panggilan Regex membunuhnya

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

Catatan menarik, tidak pernah tahu bahwa Anda bisa menghilangkan ruang antara var r in"string"

Diformat:

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

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.