Golff y Côd - Treiglad


16

Lisez ce yng Nghymraeg

Défi

Étant donné un mot en gallois, affichez toutes les formes mutées possibles du mot.

Mutations

Une mutation est un changement de la première lettre d'un mot lorsque l'on suit certains mots ou dans certains contextes grammaticaux.

En gallois, les éléments suivants sont considérés comme des «consonnes»:

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

Notez que plusieurs consonnes de caractère telles que ch, ng et rh sont comptées comme une lettre en gallois, et donc une consonne.

Les autres lettres de l'alphabet gallois sont des voyelles, énumérées ci-dessous:

a e i o u w y

Voir ci-dessous, toutes les mutations avec la lettre d'origine à gauche et les lettres mutées résultantes à droite:

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

Ici, [no letter]signifie que le g est supprimé au début du mot.

Notez qu'il y a des consonnes qui ne mutent pas:

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

Les voyelles peuvent également être trouvées au début des mots mais ne changent pas:

a
e
i
o
u
w
y

Exemples

Contribution: dydd

Production:

dydd
ddydd
nydd

Contribution: pobl

Production:

pobl
bobl
mhobl
phobl

Contribution: gwernymynydd

Production:

gwernymynydd
wernymynydd
ngwernymynydd

Contribution: ffrindiau

Production:

ffrindiau

Contribution: enw

Production:

enw

Contribution: theatr

Production:

theatr

À la demande de ArtOfCode;)

Contribution: llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Production:

llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Règles

L'entrée ne sera qu'un seul mot.

Il y aura toujours plus de lettres après la consonne principale dans votre entrée.

Gagnant

Le code le plus court en octets gagne.


5
Nouveau llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
scénario de

Un autre cas de test theatr; tmute mais thnon.
Antti Haapala

Doit être «Golff y Côd» - «yr» vient seulement avant une voyelle, vous utilisez «y» devant une consonne.
Gareth

Si quelqu'un s'intéresse aux règles compliquées concernant la mutation en gallois, il existe une application appelée `` Ap Treiglo '' qui donne les règles et répertorie de nombreux mots qui provoquent des mutations dans le mot suivant.
Gareth

@Beta Decay Oui, depuis 5 ans. Rhyl avant ça, pour mes péchés.
Gareth

Réponses:


5

JavaScript (ES6), 180 octets

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

Sorties sous forme de tableau de chaînes. C'est mon premier essai, donc ce n'est certainement pas optimal.

Essaye le


Ce n'est pas optimal, mais mon PC a décidé de s'éteindre et je ne me souviens plus quelle optimisation j'ai pu faire.
Neil

4

C #, 356 338 360 octets

Je sais que C # est un mauvais choix pour le golf de code, mais ça vaut le coup:

Troisième tentative, tous les cas passent maintenant, y compris le ph- etc. Cet ajustement coûte environ 18 octets.

Merci pinkfloydx33 pour les astuces permettant d'économiser 24 octets!

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

Production

$> ./p gwernymynydd
gwernymynydd
wernymynydd
ngwernymynydd

Version formatée

    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}"devrait juste être f, vous pouvez également enregistrer le premier appel à la ligne d'écriture, ainsi que l'action, en ne sautant pas le premier élément en b (en sauvegardant également le saut) et en remplaçant simplement le premier élément par lui-même (je pense). Vous ne faites également qu'un seul appel à regex, donc la mise en cache / renommer l'importation coûte plus que juste Text.RegularExpressions.Regex.Replace(...)dans le corps. La pause est également superflue car elle ne correspondra qu'une fois, peu importe si elle se termine jusqu'à la fin
pinkfloydx33

1
Il n'y a pas de mauvais choix de langue pour le golf - vous êtes en compétition avec quelqu'un d'autre qui veut essayer de vous battre dans la même langue. De plus, C # était autrefois le langage de golf
préféré

@ pinkfloydx33 Merci pour les conseils! Cependant, je ne peux pas supprimer le premier appel Console.WriteLine car cela sautera la sortie du mot au cas où il n'y aurait pas de remplacements. Je suis sûr qu'il existe un moyen de l'optimiser en changeant la condition.
grizzly

Je viens de repérer le theatrcas et il semble qu'il ne mute pas correctement.
grizzly

Oui, il y a plusieurs cas de test qui ne passent pas pour le moment parce que PH, TH, CH et DD ne sont pas transformés
pinkfloydx33

3

Python 3, 196 189 185 octets

Tentative originale

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 a noté que ce not w.find(a)serait un remplacement w.startswith(a)qui sauverait 2 caractères. Mais au lieu de cela, not x and ynous pouvons utiliser x or yce qui enregistre plus de caractères:

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

Encore plus d'économies en remplaçant w.replace(a,i,1)par 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())]

Ensuite, j'ai remarqué qu'il y avait un bug, a rhété répertorié deux fois; une fois dans ma liste de court-circuit qui prendrait soin de ces consonnes à double lettre. Malheureusement, ddil manquait à partir de là, donc pas d'économies, et nous avons

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

Étant donné l'un des échantillons d'entrée, il donne la sortie souhaitée; donné

gorsaf

il sort

gorsaf
orsaf
ngorsaf

et donné l'entrée

theatr

il imprime

theatr

3

PowerShell v3 +, 254 231 octets

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

travailler au golf plus loin ...

Exemples

(La sortie est séparée par des espaces car c'est le séparateur de champ de sortie par défaut pour les tableaux stringifiés. Je ne sais pas si les mots que j'ai utilisés pour les tests sont des mots réels, mais ils correspondent aux exceptions.)

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 octets

Basé sur la soumission de @ grizzly , mais corrigé pour fonctionner avec les consonnes qui ne se transforment pas (ph / ch / th / dd) avec lesquelles il ne fonctionnait pas, en plus de couper un excès. J'espère que ça va?

Je l'ai réduit à 290 jusqu'à ce que je réalise que je manquais les cas th / ch / ph / dd :-(. L'ajout de l'appel Regex l'a tué

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

Note intéressante, je n'ai jamais su que tu pouvais omettre l'espace entre var r in"string"

Formaté:

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 octets

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

Essayez-le en ligne!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.