Golff y Côd - Treiglad


16

Lesen Sie diese yng Nghymraeg

Herausforderung

Wenn Sie ein Wort auf Walisisch eingegeben haben, geben Sie alle möglichen mutierten Formen des Wortes aus.

Mutationen

Eine Mutation ist eine Änderung des ersten Buchstabens eines Wortes, wenn bestimmten Wörtern oder in bestimmten grammatikalischen Kontexten gefolgt wird.

Auf Walisisch werden die folgenden als "Konsonanten" betrachtet:

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

Beachten Sie, dass Konsonanten mit mehreren Zeichen wie ch, ng und rh auf Walisisch als ein Buchstabe und daher als ein Konsonant gezählt werden.

Die anderen Buchstaben des walisischen Alphabets sind Vokale.

a e i o u w y

Siehe unten alle Mutationen mit dem Originalbuchstaben links und den resultierenden mutierten Buchstaben rechts:

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

Hier [no letter]bedeutet, dass das g vom Wortanfang entfernt wird.

Beachten Sie, dass es einige Konsonanten gibt, die nicht mutieren:

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

Vokale können auch am Anfang von Wörtern gefunden werden, mutieren aber nicht:

a
e
i
o
u
w
y

Beispiele

Eingang: dydd

Ausgabe:

dydd
ddydd
nydd

Eingang: pobl

Ausgabe:

pobl
bobl
mhobl
phobl

Eingang: gwernymynydd

Ausgabe:

gwernymynydd
wernymynydd
ngwernymynydd

Eingang: ffrindiau

Ausgabe:

ffrindiau

Eingang: enw

Ausgabe:

enw

Eingang: theatr

Ausgabe:

theatr

Auf Wunsch von ArtOfCode;)

Eingang: llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Ausgabe:

llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Regeln

Die Eingabe wird immer nur ein Wort sein.

Es werden immer mehr Buchstaben nach dem führenden Konsonanten in Ihrer Eingabe sein.

Gewinnen

Der kürzeste Code in Bytes gewinnt.


5
Neuer Testfall:llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
ArtOfCode

Ein weiterer Testfall theatr; tmutiert aber thnicht.
Antti Haapala

Sollte 'Golff y Côd' sein - 'yr' kommt nur vor einem Vokal, verwenden Sie 'y' vor einem Konsonanten.
Gareth

Wenn jemand an den komplizierten Regeln für Mutationen auf Walisisch interessiert ist, gibt es eine App namens "Ap Treiglo", die die Regeln enthält und viele der Wörter auflistet, die im folgenden Wort Mutationen verursachen.
Gareth

@Beta Decay Ja, seit 5 Jahren. Rhyl davor für meine Sünden.
Gareth

Antworten:


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

Ausgabe als Array von Strings. Dies ist mein erster Versuch, es ist also mit ziemlicher Sicherheit nicht optimal.

Versuch es


Es ist nicht optimal, aber mein PC hat sich entschieden, sich selbst auszuschalten, und ich kann mich nicht mehr daran erinnern, welche Optimierung ich vornehmen konnte.
Neil

4

C #, 356 338 360 Bytes

Ich weiß, dass C # eine schlechte Wahl für Codegolf ist, aber es ist den Versuch wert:

Der dritte Versuch, alle Fälle sind jetzt erfolgreich, einschließlich THF usw. Diese Anpassung kostet ungefähr 18 Bytes.

Danke pinkfloydx33 für die Tipps, die 24 Bytes sparen!

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

Ausgabe

$> ./p gwernymynydd
gwernymynydd
wernymynydd
ngwernymynydd

Formatierte Version

    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}"Sollte dies der Fall sein f, können Sie auch den ersten Aufruf zum Schreiben der Zeile sowie die Aktion speichern, indem Sie das erste Element in b nicht überspringen (auch das Überspringen speichern) und einfach das erste Element durch sich selbst ersetzen (glaube ich). Sie tätigen auch nur einen Aufruf an regex, sodass das Zwischenspeichern / Umbenennen des Imports mehr kostet als nur Text.RegularExpressions.Regex.Replace(...)im Hauptteil. Die Pause ist auch überflüssig, da es nur einmal darauf ankommt, ob sie bis zum Ende durchläuft
pinkfloydx33

1
Es gibt keine schlechte Wahl der Golfsprache - Sie treten gegen andere an, die versuchen wollen, Sie in derselben Sprache zu schlagen. Außerdem war C # einst die Golfsprache der Wahl für Jon Skeet ...
trichoplax

@ pinkfloydx33 Danke für die Tipps! Der erste Console.WriteLine-Aufruf kann jedoch nicht entfernt werden, da hierdurch die Ausgabe des Wortes übersprungen wird, falls keine Ersetzungen dafür vorhanden sind. Ich bin mir sicher, dass es einen Weg gibt, wie man es durch Ändern des Zustands optimieren kann.
Grizzly

Ich habe gerade einen theatrFall entdeckt und es scheint, dass er nicht richtig mutiert.
Grizzly

Ja, es gibt einige Testfälle, die im Moment nicht bestanden werden, weil PH, TH, CH und DD nicht transformiert werden
pinkfloydx33

3

Python 3, 196.189, 185 Bytes

Ursprünglicher Versuch

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 merkte an, not w.find(a)dass ein Ersatz dafür w.startswith(a)2 Zeichen einsparen würde. Aber stattdessen not x and ykönnen wir verwenden, x or ydie einige Zeichen mehr speichert:

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

Weitere Einsparungen durch Ersetzen w.replace(a,i,1)durch 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())]

Dann bemerkte ich, dass es einen Fehler gab, der rhzweimal aufgeführt wurde; einmal in meiner Kurzschlussliste, die sich um diese Doppelbuchstabenkonsonanten kümmern würde. Leider ddfehlte da keine Ersparnis, und wir haben

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

Bei jedem Sample-Input wird der gewünschte Output ausgegeben. gegeben

gorsaf

es gibt aus

gorsaf
orsaf
ngorsaf

und gegebene Eingabe

theatr

es druckt

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

weiter arbeiten, um Golf zu spielen ...

Beispiele

(Die Ausgabe ist durch Leerzeichen getrennt, da dies das Standard-Ausgabefeldtrennzeichen für Zeichenfolgen-Arrays ist. Ich weiß nicht, ob die Wörter, die ich zum Testen verwendet habe, tatsächliche Wörter sind, aber sie passen zu den Ausnahmen.)

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 Bytes

Basierend auf @ grizzlys Einreichung , aber korrigiert, um mit den Konsonanten zu arbeiten, die nicht transformiert werden (ph / ch / th / dd), mit denen es nicht funktioniert, und um einige Überschüsse herauszuschneiden. Hoffe das ist in Ordnung?

Ich hatte es auf 290 reduziert, bis mir klar wurde, dass mir die Fälle th / ch / ph / dd fehlten :-(. Das Hinzufügen des Regex-Aufrufs hat es getötet

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

Interessante Anmerkung, wusste nie, dass Sie den Raum zwischen weglassen könnten var r in"string"

Formatiert:

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 Bytes

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

Probieren Sie es online!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.