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.