골프피 코트-Treiglad


16

이 ygh Nghymraeg를 읽으십시오

도전

웨일스 어로 단어가 주어지면, 가능한 모든 변형 된 형태의 단어를 출력하십시오.

돌연변이

돌연변이는 특정 단어를 따르거나 특정 문법적 맥락에서 단어의 첫 글자의 변화입니다.

웨일스 어에서는 다음이 "자음"으로 간주됩니다.

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

ch, ng 및 rh와 같은 여러 문자 자음 은 웨일스 어에서 하나의 문자 로 계산 되므로 하나의 자음 으로 간주됩니다 .

웨일스 어 알파벳의 다른 문자는 모음이며 아래에 나열되어 있습니다.

a e i o u w y

아래에서 왼쪽에 원래 문자가 있고 오른쪽에 돌연변이 문자가있는 모든 변이를 ​​참조하십시오.

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

여기서 [no letter]g는 단어의 시작 부분에서 제거됨을 의미합니다.

변경하지 않는 자음이 있습니다.

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

모음은 단어의 시작 부분에서도 찾을 수 있지만 변경하지는 않습니다.

a
e
i
o
u
w
y

입력: dydd

산출:

dydd
ddydd
nydd

입력: pobl

산출:

pobl
bobl
mhobl
phobl

입력: gwernymynydd

산출:

gwernymynydd
wernymynydd
ngwernymynydd

입력: ffrindiau

산출:

ffrindiau

입력: enw

산출:

enw

입력: theatr

산출:

theatr

ArtOfCode의 요청에 따라;)

입력: llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

산출:

llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch

규칙

입력은 항상 한 단어 일 것입니다.

입력에서 맨 앞 자음 뒤에는 더 많은 글자가 있습니다.

승리

바이트 단위의 가장 짧은 코드가 이깁니다.


5
새로운 테스트 사례 :llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
ArtOfCode

다른 테스트 사례 theatr; t돌연변이하지만 th그렇지 않습니다.
Antti Haapala

'Golff y Côd'여야합니다- 'yr'은 모음 앞에만 오며, 자음 앞에 'y'를 사용합니다.
Gareth

웨일스 어의 돌연변이에 관한 복잡한 규칙에 관심이 있다면 'Ap Treiglo'라는 앱이 있습니다.
Gareth

@Beta Decay 그래, 지난 5 년간. 내 죄악을 위해 그 전에 Rhyl.
Gareth

답변:


5

JavaScript (ES6), 180 바이트

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

문자열 배열로 출력합니다. 이것은 나의 첫 번째 시도이므로 거의 확실하지 않습니다.

사용해보십시오


최적은 아니지만 내 PC가 자동으로 꺼지기로 결정했으며 더 이상 내가 어떤 최적화를 할 수 있었는지 기억하지 못합니다.
Neil

4

C 번호 356 338 360 바이트

C #은 코드 골프에 적합하지 않다는 것을 알고 있지만 그만한 가치가 있습니다.

세 번째 시도는 이제 th-ph 등을 포함한 모든 사례를 통과합니다.이 조정 비용은 약 18 바이트입니다.

24 바이트 절약 팁에 대한 pinkfloydx33 감사합니다!

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

산출

$> ./p gwernymynydd
gwernymynydd
wernymynydd
ngwernymynydd

형식화 된 버전

    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}"그냥 있어야합니다 f.b의 첫 번째 요소를 건너 뛰지 않고 (스킵도 저장) 첫 번째 항목을 자체로 바꾸면 첫 번째 호출을 작성하고 작업을 저장할 수 있습니다. 또한 정규 표현식을 한 번만 호출하므로 수입을 캐싱 / 이름을 바꾸는 Text.RegularExpressions.Regex.Replace(...)것은 본문 보다 더 많은 비용이 듭니다 . 한 번만 경기가 끝날 때까지 중요하지 않기 때문에 휴식도 불필요하다
pinkfloydx33

1
골프에 대한 언어 선택이 잘못되지 않았습니다. 같은 언어로 당신을 이기고 싶어하는 다른 사람과 경쟁하고 있습니다. 게다가 C #은 선택의 골프 언어 한때 ... 존 소총을위한
trichoplax

@ pinkfloydx33 팁 주셔서 감사합니다! 그러나 첫 번째 Console.WriteLine 호출을 제거 할 수는 없습니다. 대체가 없으면 단어 출력을 건너 뛰기 때문입니다. 조건을 변경하여 최적화하는 방법이 있다고 확신합니다.
그리즐리

방금 theatr사례를 발견 했으며 올바르게 돌연변이되지 않는 것 같습니다.
그리즐리

PH, TH, CH 및 DD가 변환되지 않기 때문에 현재 통과하지 못하는 몇 가지 테스트 사례가 있습니다.
pinkfloydx33

3

Python 3, 196,189 185 바이트

원래 시도

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 w.find(a)대신하여 w.startswith(a)2자를 절약 할 수 있다고 언급했습니다 . 그러나 대신에 일부 문자를 더 절약하는을 not x and y사용할 수 있습니다 x or y.

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

교체하여 또 다른 비용 절감 w.replace(a,i,1)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())]

그런 다음 버그가 있음을 발견하고 rh두 번 나열되었습니다. 내 단락 목록에서 한 번은 이중 문자 자음을 처리합니다. 불행히도 dd거기에서 누락되었으므로 절약하지 못했습니다.

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

샘플 입력 중 하나가 주어지면 원하는 출력을 제공합니다. 주어진

gorsaf

출력

gorsaf
orsaf
ngorsaf

주어진 입력

theatr

그것은 인쇄

theatr

3

PowerShell을 V3 +, 254 231 바이트

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

더 골프를 타기 위해 ...

(출력은 문자열 배열의 기본 출력 필드 구분 기호이기 때문에 공백으로 구분됩니다. 테스트에 사용한 단어가 실제 단어인지는 모르지만 예외에 적합합니다.)

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 바이트

@grizzly의 제출을 기반으로 하지만 작동하지 않은 자음 (ph / ch / th / dd)과 함께 작동하지 않는 자음과 함께 작동하도록 수정되었으며 초과분을 제거했습니다. 그래도 괜찮아?

내가 th / ch / ph / dd 사례가 없다는 것을 깨달을 때까지 290으로 줄였습니다 .- (. Regex 호출에 추가하면 사망했습니다.

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

재미있는 메모, 당신이 사이의 공간을 생략 할 수 있다는 것을 결코 알지 못했습니다. var r in"string"

형식화 :

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.