Golff y Côd - Treiglad


16

Leer este yng Nghymraeg

Desafío

Dada una palabra en galés, genera todas las formas mutantes posibles de la palabra.

Mutaciones

Una mutación es un cambio de la primera letra de una palabra cuando se siguen ciertas palabras o en ciertos contextos gramaticales.

En galés, los siguientes se consideran "consonantes":

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

Tenga en cuenta que las consonantes de caracteres múltiples como ch, ng y rh se cuentan como una letra en galés y, por lo tanto, una consonante.

Las otras letras del alfabeto galés son vocales, que se enumeran a continuación:

a e i o u w y

Vea a continuación, todas las mutaciones con la letra original a la izquierda y las letras mutadas resultantes a la derecha:

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

Aquí, [no letter]significa que la g se elimina desde el comienzo de la palabra.

Tenga en cuenta que hay algunas consonantes que no mutan:

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

Las vocales también se pueden encontrar al comienzo de las palabras, pero no mutan:

a
e
i
o
u
w
y

Ejemplos

Entrada: dydd

Salida:

dydd
ddydd
nydd

Entrada: pobl

Salida:

pobl
bobl
mhobl
phobl

Entrada: gwernymynydd

Salida:

gwernymynydd
wernymynydd
ngwernymynydd

Entrada: ffrindiau

Salida:

ffrindiau

Entrada: enw

Salida:

enw

Entrada: theatr

Salida:

theatr

A petición de ArtOfCode;)

Entrada: llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Salida:

llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Reglas

La entrada solo será una palabra.

Siempre habrá más letras después de la consonante principal en su entrada.

Victorioso

El código más corto en bytes gana.


55
Nuevo caso de prueba:llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
ArtOfCode

Otro caso de prueba theatr; tmuta pero thno lo hace.
Antti Haapala

Debe ser 'Golff y Côd' - 'yr' solo viene antes de una vocal, usa 'y' antes de una consonante.
Gareth

Si alguien está interesado en las complicadas reglas con respecto a la mutación en galés, hay una aplicación llamada 'Ap Treiglo' que proporciona las reglas y enumera muchas de las palabras que causan mutaciones en la siguiente palabra.
Gareth

@Beta Decay Sí, durante los últimos 5 años. Rhyl antes de eso, por mis pecados.
Gareth

Respuestas:


5

JavaScript (ES6), 180 bytes

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

Salidas como un conjunto de cadenas. Este es mi primer intento, por lo que es casi seguro que no sea óptimo.

Pruébalo


No es óptimo, pero mi PC decidió apagarse y ya no recuerdo qué optimización pude hacer.
Neil

4

C #, 356 338 360 bytes

Sé que C # es una mala elección para el golf de código, pero vale la pena intentarlo:

Tercer intento, ahora todos los casos pasan, incluido th-, etc. Este ajuste cuesta aproximadamente 18 bytes.

¡Gracias pinkfloydx33 por los consejos que ahorraron 24 bytes!

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

Salida

$> ./p gwernymynydd
gwernymynydd
wernymynydd
ngwernymynydd

Versión formateada

    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}"debería ser f, también puede guardar la primera llamada a la línea de escritura, así como la acción, al no omitir el primer elemento en b (guardar también el omitir) y simplemente reemplazar el primer elemento por sí mismo (creo). También solo hace una llamada a regex, por lo que el almacenamiento en caché / cambio de nombre de la importación cuesta más que solo Text.RegularExpressions.Regex.Replace(...)en el cuerpo. El descanso también es superfluo ya que solo coincidirá una vez, no importa si se
repite

1
No hay malas opciones de idioma para el golf: estás compitiendo contra cualquier otra persona que quiera intentar vencerte en el mismo idioma. Además, C # fue una vez el idioma de golf elegido por Jon Skeet ...
trichoplax

@ pinkfloydx33 ¡Gracias por los consejos! Sin embargo, no puedo eliminar la primera llamada Console.WriteLine porque esto omitirá la salida de la palabra en caso de que no haya reemplazos para ella. Estoy seguro de que hay una manera de optimizarlo cambiando la condición.
grizzly

Acabo de ver el theatrcaso y parece que no está mutando correctamente.
grizzly

Sí, hay varios casos de prueba que no pasan en este momento porque PH, TH, CH y DD no se transforman
pinkfloydx33

3

Pitón 3, 196,189 185 bytes

Intento original

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 señaló que not w.find(a)sería un reemplazo para w.startswith(a)eso ahorraría 2 caracteres. Pero en lugar de not x and ypodemos usar x or yque guarda algunos caracteres más:

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

Aún más ahorros al reemplazar 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())]

Entonces me di cuenta de que había un error, rhaparecía dos veces; una vez en mi lista de cortocircuitos que se encargaría de esas consonantes de doble letra. Desafortunadamente ddfaltaba de allí, así que no hay ahorros, y tenemos

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

Dada cualquiera de las entradas de muestra, proporciona la salida deseada; dado

gorsaf

da salida

gorsaf
orsaf
ngorsaf

y dado entrada

theatr

se imprime

theatr

3

PowerShell v3 +, 254 231 bytes

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

trabajando para jugar más al golf ...

Ejemplos

(La salida está separada por espacios porque es el separador de campo de salida predeterminado para las matrices en cadena. No sé si las palabras que usé para probar son palabras reales, pero se ajustan a las excepciones).

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

Basado en la presentación de @ grizzly , pero corregido para trabajar con las consonantes que no se transforman (ph / ch / th / dd) con las que no estaba funcionando, además de recortar un poco de exceso. Espero que esté bien?

Lo reduje a 290 hasta que me di cuenta de que me faltaban los casos th / ch / ph / dd :-(. Agregar la llamada Regex lo mató

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 interesante, nunca supe que podría omitir el espacio entre var r in"string"

Formateado:

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

Pruébalo en línea!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.