Golff y Côd - Treiglad


16

Przeczytaj to yng Nghymraeg

Wyzwanie

Podając słowo w języku walijskim, wypisz wszystkie możliwe zmutowane formy tego słowa.

Mutacje

Mutacja to zmiana pierwszej litery słowa, która następuje po określonych słowach lub w określonych kontekstach gramatycznych.

W języku walijskim za „spółgłosek” uważa się:

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

Zauważ, że spółgłosek wielu znaków, takich jak ch, ng i rh, są liczone jako jedna litera w języku walijskim, a zatem jedna spółgłoska.

Pozostałe litery w walijskim alfabecie to samogłoski wymienione poniżej:

a e i o u w y

Zobacz poniżej wszystkie mutacje z oryginalną literą po lewej stronie i wynikowe zmutowane litery po prawej stronie:

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

Tutaj [no letter]oznacza, że g jest usuwany z początku słowa.

Zauważ, że istnieją spółgłosek, które nie mutują:

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

Samogłoski można również znaleźć na początku słów, ale nie mutują:

a
e
i
o
u
w
y

Przykłady

Wejście: dydd

Wynik:

dydd
ddydd
nydd

Wejście: pobl

Wynik:

pobl
bobl
mhobl
phobl

Wejście: gwernymynydd

Wynik:

gwernymynydd
wernymynydd
ngwernymynydd

Wejście: ffrindiau

Wynik:

ffrindiau

Wejście: enw

Wynik:

enw

Wejście: theatr

Wynik:

theatr

Na żądanie ArtOfCode;)

Wejście: llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Wynik:

llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Zasady

Wpis będzie zawsze tylko jednym słowem.

Zawsze będzie więcej liter po wiodącej spółgłosce w twoim danych wejściowych.

Zwycięski

Najkrótszy kod w bajtach wygrywa.


5
Nowy przypadek testowy:llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
ArtOfCode

Kolejny przypadek testowy theatr; tmutuje, ale thnie robi.
Antti Haapala,

Powinno być „Golff y Côd” - „yr” występuje tylko przed samogłoską, a „y” przed spółgłoską.
Gareth,

Jeśli ktoś jest zainteresowany skomplikowanymi regułami dotyczącymi mutacji w języku walijskim, istnieje aplikacja o nazwie „Ap Treiglo”, która podaje reguły i wymienia wiele słów, które powodują mutacje w następującym słowie.
Gareth,

@Beta Decay Tak, przez ostatnie 5 lat. Rhyl wcześniej, za moje grzechy.
Gareth,

Odpowiedzi:


5

JavaScript (ES6), 180 bajtów

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

Dane wyjściowe jako tablica ciągów. To moja pierwsza próba, więc prawie na pewno nie jest optymalna.

Wypróbuj to


To nie jest optymalne, ale mój komputer postanowił się wyłączyć i nie pamiętam już, jaką optymalizację mogłem wykonać.
Neil

4

C #, 356 338 360 bajtów

Wiem, że C # jest złym wyborem dla golfa kodowego, ale warto spróbować:

Trzecia próba, wszystkie przypadki teraz przechodzą, w tym th- ph- itp. Ta korekta kosztuje około 18 bajtów.

Dzięki pinkfloydx33 za wskazówki oszczędzające 24 bajty!

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

Wynik

$> ./p gwernymynydd
gwernymynydd
wernymynydd
ngwernymynydd

Wersja sformatowana

    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}"tak powinno być f, możesz również zapisać pierwsze wywołanie zapisu linii, a także akcję, nie pomijając pierwszego elementu w b (również oszczędzając pomijanie) i po prostu zastępując pierwszy element samym sobą (tak myślę). Wykonujesz także tylko jedno wezwanie do wyrażenia regularnego, więc buforowanie / zmiana nazwy importu kosztuje więcej niż tylko Text.RegularExpressions.Regex.Replace(...)w treści. Przerwa jest również zbędna, ponieważ będzie pasować tylko raz, nie ma znaczenia, jeśli zapętli się do końca
pinkfloydx33 10.09.16

1
Nie ma złych wyborów językowych do gry w golfa - konkurujesz z kimkolwiek innym, kto chce spróbować cię pokonać w tym samym języku. Plus C # był kiedyś
ulubionym

@ pinkfloydx33 Dzięki za wskazówki! Nie mogę jednak usunąć pierwszego wywołania Console.WriteLine, ponieważ spowoduje to pominięcie wypowiadania słowa, jeśli nie będzie można go zastąpić. Jestem pewien, że istnieje sposób, jak to zoptymalizować, zmieniając warunek.
grizzly,

Właśnie zauważyłem theatrprzypadek i wygląda na to, że nie mutuje on poprawnie.
grizzly,

Tak, istnieje kilka przypadków testowych, które w tej chwili nie przejdą, ponieważ PH, TH, CH i DD nie ulegają transformacji
pinkfloydx33 10.09.16

3

Python 3, 196 189 185 bajtów

Oryginalna próba

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 zauważył, not w.find(a)że zastąpiłoby w.startswith(a)to 2 znaki. Ale zamiast tego not x and ymożemy użyć, x or yco oszczędza niektóre postacie:

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

Jeszcze dalsze oszczędności poprzez zastąpienie w.replace(a,i,1)z 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())]

Potem zauważyłem, że wystąpił błąd, rhzostał wymieniony dwukrotnie; raz na mojej liście zwarć, która zająłaby się tymi podwójnymi literami spółgłosek. Niestety nie ddbyło go stamtąd, więc nie ma oszczędności, a my mamy

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

Biorąc pod uwagę dowolne przykładowe dane wejściowe, daje pożądany wynik; dany

gorsaf

wychodzi

gorsaf
orsaf
ngorsaf

i dane wejściowe

theatr

drukuje

theatr

3

PowerShell v3 +, 254 231 bajtów

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

dalsza praca w golfa ...

Przykłady

(Dane wyjściowe są rozdzielone spacjami, ponieważ jest to domyślny separator pól wyjściowych dla tablic strunowych. Nie wiem, czy słowa użyte do testowania są słowami rzeczywistymi, ale pasują do wyjątków).

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 bajtów

W oparciu o użytkownika @ grizzly składania , ale skorygowane do pracy ze spółgłosek, które nie dostać przekształconych (pH / CH / th / dd), że nie działa z plus przycięte trochę nadmiar out. Mam nadzieję, że to w porządku?

Miałem go do 290, dopóki nie zdałem sobie sprawy, że brakuje mi przypadków th / ch / ph / dd :-(. Dodanie w wywołaniu Regex go zabiło

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

Ciekawa uwaga, nigdy nie wiedziałem, że można pominąć przestrzeń między var r in"string"

Sformatowany:

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 bajtów

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

Wypróbuj online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.