Golff e Côd - Treiglad


16

Leia este yng Nghymraeg

Desafio

Dada uma palavra em galês, produza todas as possíveis formas mutadas da palavra.

Mutações

Uma mutação é uma alteração da primeira letra de uma palavra ao seguir certas palavras ou em certos contextos gramaticais.

Em galês, o seguinte é considerado "consoantes":

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

Observe que várias consoantes de caracteres, como ch, ng e rh, são contadas como uma letra em galês e, portanto, uma consoante.

As outras letras do alfabeto galês são vogais, listadas abaixo:

a e i o u w y

Veja abaixo todas as mutações com a letra original à esquerda e as letras mutantes resultantes à direita:

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

Aqui, [no letter]significa que o g é removido desde o início da palavra.

Observe que existem algumas consoantes que não sofrem mutação:

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

As vogais também podem ser encontradas no início das palavras, mas não são alteradas:

a
e
i
o
u
w
y

Exemplos

Entrada: dydd

Resultado:

dydd
ddydd
nydd

Entrada: pobl

Resultado:

pobl
bobl
mhobl
phobl

Entrada: gwernymynydd

Resultado:

gwernymynydd
wernymynydd
ngwernymynydd

Entrada: ffrindiau

Resultado:

ffrindiau

Entrada: enw

Resultado:

enw

Entrada: theatr

Resultado:

theatr

A pedido de ArtOfCode;)

Entrada: llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Resultado:

llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

Regras

A entrada será apenas uma palavra.

Sempre haverá mais letras após a consoante principal em sua entrada.

Ganhando

O código mais curto em bytes vence.


5
Novo caso de teste:llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
ArtOfCode 10/09

Outro caso de teste theatr; tmuda, mas thnão muda .
Antti Haapala

Deve ser 'Golff y Côd' - 'yr' só vem antes de uma vogal, você usa 'y' antes de uma consoante.
Gareth

Se alguém estiver interessado nas regras complicadas relacionadas à mutação no país de Gales, há um aplicativo chamado 'Ap Treiglo' que fornece as regras e lista muitas das palavras que causam mutações na palavra a seguir.
Gareth

@Beta Decay Sim, nos últimos 5 anos. Rhyl antes disso, pelos meus pecados.
Gareth

Respostas:


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

Saídas como uma matriz de seqüências de caracteres. Esta é a minha primeira tentativa, por isso quase certamente não é a ideal.

Experimente


Não é o ideal, mas meu PC decidiu se desligar e não lembro mais qual otimização consegui fazer.
Neil

4

C #, 356 338 360 bytes

Eu sei que o C # é uma má escolha para o código de golfe, mas vale a pena:

Terceira tentativa, todos os casos passam agora, incluindo th-ph-etc. Esse ajuste custa aproximadamente 18 bytes.

Obrigado pinkfloydx33 pelas dicas de economia de 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;}}}}}

Resultado

$> ./p gwernymynydd
gwernymynydd
wernymynydd
ngwernymynydd

Versão formatada

    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}"Como deveria ser f, você também pode salvar a primeira chamada para escrever a linha, bem como a ação, não pulando o primeiro elemento em b (salvando o salto também) e apenas substituindo o primeiro item por ele (acho). Você também faz apenas uma chamada para regex, para armazenar em cache / renomear os custos de importação mais do que apenas Text.RegularExpressions.Regex.Replace(...)no corpo. A pausa também é supérfluo, uma vez que só vai corresponder uma vez importa doesnt se ele percorre até o fim
pinkfloydx33

1
Não há opções ruins de idioma para o golfe - você está competindo contra qualquer pessoa que queira tentar vencê-lo no mesmo idioma. Além disso, C # foi outrora a língua golfe de escolha para Jon Skeet ...
Trichoplax

@ pinkfloydx33 Obrigado pelas dicas! No entanto, não consigo remover a primeira chamada Console.WriteLine, pois isso ignorará a saída da palavra caso não haja substituições. Estou certo de que existe uma maneira de otimizá-lo, alterando a condição.
grizzly

Acabei de ver o theatrcaso e parece que não está mudando corretamente.
grizzly

Sim, existem vários casos de teste que não passam no momento por causa PH, TH, CH e DD não se transformou
pinkfloydx33

3

Python 3, 196.189 185 bytes

Tentativa 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 observou que not w.find(a)seria um substituto, pois w.startswith(a)isso salvaria 2 caracteres. Mas, em vez de not x and yusarmos, o x or yque salva alguns caracteres mais:

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

Economias adicionais ao substituir w.replace(a,i,1)por 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())]

Então eu notei que havia um bug, rhfoi listado duas vezes; uma vez na minha lista de curtos-circuitos que cuidaria dessas consoantes de duas letras. Infelizmente ddestava faltando a partir daí, então não há economia, e temos

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 qualquer uma das entradas de amostra, ela fornece a saída desejada; dado

gorsaf

isso gera

gorsaf
orsaf
ngorsaf

e dado entrada

theatr

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

trabalhando para o golfe ainda mais ...

Exemplos

(A saída é separada por espaço, porque esse é o separador de campos de saída padrão para matrizes com strings. Não sei se as palavras que usei para testar são palavras reais, mas se encaixam nas exceções.)

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

Com base no envio do @ grizzly , mas corrigido para funcionar com as consoantes que não são transformadas (ph / ch / th / dd) com as quais não estava funcionando, além de aparar algum excesso. Espero que esteja tudo bem?

Eu tinha até 290, até perceber que estava faltando os casos th / ch / ph / dd :-(. A adição da chamada Regex o matou

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, nunca soube que você poderia omitir o espaço entre var r in"string"

Formatado:

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

Experimente online!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.