Golff y Côd - Treiglad


16

Bu yng Nghymraeg okuyun

Meydan okuma

Galce'de bir kelime verildiğinde, kelimenin olası mutasyona uğramış tüm formlarını çıktılayın.

Mutasyonlar

Mutasyon, belirli kelimeleri takip ederken veya belirli gramer bağlamlarında bir kelimenin ilk harfinin değişmesidir.

Galce'de aşağıdakiler "ünsüz" olarak kabul edilir:

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

Örneğin ch olarak birden fazla karakter ünsüz, ng ve bağıl olarak hesaplanmasını Not bir harf Gal de, ve bu nedenle bir ünsüz.

Galli alfabesindeki diğer harfler aşağıda listelenen sesli harflerdir:

a e i o u w y

Aşağıya bakın, solda orijinal harf ve sağda ortaya çıkan mutasyona uğramış harfler ile tüm mutasyonlar:

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

Burada, [no letter]g, kelimenin başından kaldırıldığı anlamına gelir.

Değişmeyen bazı ünsüzlerin olduğunu unutmayın:

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

Ünlüler kelimelerin başında da bulunabilir, ancak mutasyona uğramaz:

a
e
i
o
u
w
y

Örnekler

Giriş: dydd

Çıktı:

dydd
ddydd
nydd

Giriş: pobl

Çıktı:

pobl
bobl
mhobl
phobl

Giriş: gwernymynydd

Çıktı:

gwernymynydd
wernymynydd
ngwernymynydd

Giriş: ffrindiau

Çıktı:

ffrindiau

Giriş: enw

Çıktı:

enw

Giriş: theatr

Çıktı:

theatr

ArtOfCode'un isteği üzerine;)

Giriş: llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Çıktı:

llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

kurallar

Giriş sadece bir kelime olacaktır.

Girişinizde önde gelen ünsüzden sonra her zaman daha fazla harf olacaktır.

Kazanan

Bayt cinsinden en kısa kod kazanır.


5
Yeni test örneği:llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
ArtOfCode

Başka bir test durumu theatr; tdeğişiyor ama thdeğil.
Antti Haapala

'Golff y Côd' - 'yr' sadece bir sesli harften önce gelirse, bir ünsüzden önce 'y' kullanırsınız.
Gareth

Galce'deki mutasyonla ilgili karmaşık kurallarla ilgilenen varsa, kuralları veren ve aşağıdaki kelimede mutasyonlara neden olan kelimelerin çoğunu listeleyen 'Ap Treiglo' adlı bir uygulama var.
Gareth

@Beta Decay Evet, son 5 yıldır. Ondan önce Rhyl, günahlarım için.
Gareth

Yanıtlar:


5

JavaScript (ES6), 180 bayt

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

Dizeler dizisi olarak çıktılar. Bu benim ilk denemem, bu yüzden neredeyse kesinlikle optimal değil.

Denemek


Optimal değil, ancak bilgisayarım kendini kapatmaya karar verdi ve artık hangi optimizasyonu yapabildiğimi hatırlamıyorum.
Neil

4

C # 356 338 360 bayt

C # kod golf için kötü bir seçim olduğunu biliyorum, ama atışa değer:

Üçüncü deneme, thph- vb. Dahil olmak üzere tüm vakalar geçer. Bu ayarlama yaklaşık 18 bayttır.

24 bayt tasarruf ipuçları için pinkfloydx33 teşekkürler!

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

Çıktı

$> ./p gwernymynydd
gwernymynydd
wernymynydd
ngwernymynydd

Biçimlendirilmiş Sürüm

    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}"sadece f, ilk öğeyi b'ye atlayarak (atlamayı da kaydederek) ve sadece ilk öğeyi kendisiyle değiştirerek (satır bence) satır yazmanın yanı sıra eylemi de kaydedebilirsiniz. Ayrıca, regex için yalnızca bir çağrı yaparsınız, böylece içe aktarma maliyetlerini yalnızca Text.RegularExpressions.Regex.Replace(...)gövdeden daha fazla önbelleğe almak / yeniden adlandırmak . Mola da gereksiz çünkü sadece bir kez eşleşecek, eğer sonuna kadar
dönerse

1
Golf için kötü bir dil seçeneği yok - sizi aynı dilde dövmek isteyen herkese karşı yarışıyorsunuz. Artı C # bir zamanlar Jon Skeet için tercih edilen golf
diliydi

@ pinkfloydx33 Tavsiyeler için teşekkürler! Ancak, ilk Console.WriteLine çağrısını kaldıramıyorum çünkü bunun yerine herhangi bir değişiklik olmaması durumunda sözcük çıktısını atlayacaktır. Durumu değiştirerek nasıl optimize edeceğinizin bir yolu olduğundan eminim.
grizzly

Sadece theatrdavayı gördüm ve doğru mutasyona uğramaz gibi görünüyor.
grizzly

Evet, PH, TH, CH ve DD dönüştürülmediği için şu anda geçmeyen birkaç test örneği var
pinkfloydx33

3

Python 3, 196.189 185 bayt

Orijinal deneme

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)bunun yerine w.startswith(a)2 karakter kazandıracağını belirtti. Ama yerine not x and ykullanabileceğimiz x or ydaha bazı karakterler kazandırır ki:

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

Değiştirerek Yine başka tasarruf w.replace(a,i,1)ile 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())]

Sonra bir hata olduğunu fark ettim, rhiki kez listelendi; kısa devre listemde bu çift harfli ünsüzlerle ilgilenecekti. Ne yazık ki ddoradan kayıptı, bu yüzden tasarruf yok ve biz

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

Örnek girdilerinden herhangi biri göz önüne alındığında, istenen çıktıyı verir; verilmiş

gorsaf

çıktı

gorsaf
orsaf
ngorsaf

ve verilen girdi

theatr

yazdırır

theatr

3

PowerShell v3 +, 254231 bayt

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

daha fazla golf için çalışıyor ...

Örnekler

(Çıktı boşlukla ayrılmıştır, çünkü dizge dizileri için varsayılan Çıktı Alanı Ayırıcısıdır. Test için kullandığım kelimelerin gerçek kelimeler olup olmadığını bilmiyorum, ancak istisnalara uyuyorlar.)

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 bayt

@ Grizzly'nin teslimine dayanarak, çalışmadığı dönüştürülmemiş ünsüzlerle (ph / ch / th / dd) çalışacak şekilde düzeltildi, ancak biraz fazlalık kesildi. Umarım bu iyi mi?

Ben th / ch / ph / dd davaları eksik olduğunu fark edene kadar 290 aşağı vardı :-(. Regex çağrısında eklemek onu öldürdü

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

İlginç not, arasındaki boşluğu atlayabileceğinizi asla bilmiyordum var r in"string"

biçimlendirilmiş:

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 bayt

{/^(.|<[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)}

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.