Golff y Côd - Treiglad


16

Leggi questo yng Nghymraeg

Sfida

Data una parola in gallese, produce tutte le possibili forme mutate della parola.

mutazioni

Una mutazione è un cambiamento della prima lettera di una parola quando segue determinate parole o in determinati contesti grammaticali.

In gallese, sono considerate "consonanti":

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

Si noti che le consonanti a più caratteri come ch, ng e rh sono conteggiate come una lettera in gallese, e quindi una consonante.

Le altre lettere dell'alfabeto gallese sono vocali, elencate di seguito:

a e i o u w y

Vedi sotto, tutte le mutazioni con la lettera originale a sinistra e le lettere mutate risultanti a destra:

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

Qui, [no letter]significa che la g viene rimossa dall'inizio della parola.

Nota che ci sono alcune consonanti che non mutano:

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

Le vocali possono anche essere trovate all'inizio delle parole ma non mutare:

a
e
i
o
u
w
y

Esempi

Ingresso: dydd

Produzione:

dydd
ddydd
nydd

Ingresso: pobl

Produzione:

pobl
bobl
mhobl
phobl

Ingresso: gwernymynydd

Produzione:

gwernymynydd
wernymynydd
ngwernymynydd

Ingresso: ffrindiau

Produzione:

ffrindiau

Ingresso: enw

Produzione:

enw

Ingresso: theatr

Produzione:

theatr

Su richiesta di ArtOfCode;)

Ingresso: llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Produzione:

llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Regole

L'input sarà sempre e solo una parola.

Ci saranno sempre più lettere dopo la consonante principale nel tuo input.

vincente

Vince il codice più breve in byte.


5
Nuovo caso di prova:llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
ArtOfCode

Un altro caso di test theatr; tmuta ma thnon lo fa.
Antti Haapala,

Dovrebbe essere 'Golff y Côd' - 'yr' viene solo prima di una vocale, tu usi 'y' prima di una consonante.
Gareth,

Se qualcuno è interessato alle complicate regole riguardanti la mutazione in gallese, c'è un'app chiamata 'Ap Treiglo' che fornisce le regole ed elenca molte delle parole che causano mutazioni nella seguente parola.
Gareth,

@Beta Decay Sì, negli ultimi 5 anni. Rhyl prima di quello, per i miei peccati.
Gareth,

Risposte:


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 come una matrice di stringhe. Questo è il mio primo tentativo, quindi quasi sicuramente non è ottimale.

Provalo


Non è ottimale, ma il mio PC ha deciso di spegnersi e non ricordo più quale ottimizzazione sono riuscito a fare.
Neil,

4

C #, 356 338 360 byte

So che C # è una cattiva scelta per il golf del codice, ma vale la pena provare:

Terzo tentativo, ora tutti i casi passano, incluso th-ph- ecc. Questa regolazione costa circa 18 byte.

Grazie pinkfloydx33 per i suggerimenti che salvano 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;}}}}}

Produzione

$> ./p gwernymynydd
gwernymynydd
wernymynydd
ngwernymynydd

Versione formattata

    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}"dovresti semplicemente essere f, puoi anche salvare la prima chiamata per scrivere la riga, così come l'azione, non saltando il primo elemento in b (salvando anche il salto) e semplicemente sostituendo il primo elemento con se stesso (penso). Puoi anche effettuare una sola chiamata a regex, pertanto la memorizzazione nella cache / la ridenominazione dei costi di importazione è maggiore rispetto al solo Text.RegularExpressions.Regex.Replace(...)corpo. La pausa è anche superflua poiché si abbinerà solo una volta, non importa se si snoda fino alla fine
pinkfloydx33

1
Non ci sono scelte sbagliate di lingua per il golf: stai competendo con chiunque voglia provare a batterti nella stessa lingua. Inoltre C # era una volta il linguaggio del golf preferito da Jon Skeet ...
trichoplax,

@ pinkfloydx33 Grazie per i suggerimenti! Tuttavia, non riesco a rimuovere la prima chiamata Console.WriteLine perché questo salterà l'output della parola nel caso in cui non vi siano sostituzioni. Sono sicuro che esiste un modo per ottimizzarlo modificando la condizione.
grizzly,

Ho appena notato il theatrcaso e sembra che non stia mutando correttamente.
grizzly

Sì, ci sono diversi casi di test che al momento non passano perché PH, TH, CH e DD non si trasformano
pinkfloydx33

3

Python 3, 196.189 185 byte

Tentativo 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 notò che not w.find(a)sarebbe stato un rimpiazzo w.startswith(a)che avrebbe salvato 2 personaggi. Ma invece di not x and ypossiamo usare ciò x or yche salva di più alcuni personaggi:

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

Ancora ulteriori risparmi sostituendo w.replace(a,i,1)con 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())]

Poi ho notato che c'era un bug, è rhstato elencato due volte; una volta nella mia lista di cortocircuiti che si sarebbe occupata di quelle consonanti a doppia lettera. Purtroppo ddmancava da lì, quindi nessun risparmio, e abbiamo

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

Dato uno qualsiasi degli input di esempio, fornisce l'output desiderato; dato

gorsaf

esce

gorsaf
orsaf
ngorsaf

e dato input

theatr

stampa

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

lavorare per il golf ulteriormente ...

Esempi

(L'output è separato dallo spazio perché è il separatore di campo di output predefinito per gli array stringiti. Non so se le parole che ho usato per il test siano parole reali, ma si adattano alle eccezioni.)

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

Basato su @ grizzly's @grizzly , ma corretto per funzionare con le consonanti che non si trasformano (ph / ch / th / dd) con cui non stava funzionando, oltre a tagliare un eccesso. Spero che vada bene?

L'ho avuto fino a 290 fino a quando mi sono reso conto che mi mancavano i casi th / ch / ph / dd :-(. L'aggiunta nella chiamata Regex l'ha ucciso

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

Nota interessante, non ho mai saputo che potresti omettere lo spazio tra var r in"string"

formattato:

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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.