Golff yCôd-トライグラッド


16

このyng 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などの複数の子音は、ウェールズ語では1文字としてカウントされるため、1つの子音としてカウントされることに注意してください。

ウェールズ語のアルファベットの他の文字は母音であり、以下にリストされています。

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

ルール

入力は1ワードのみです。

入力では、先頭の子音の後に常に文字が追加されます。

勝ち

バイト単位の最短コードが優先されます。


5
新しいテストケース:llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
ArtOfCode

別のテストケースtheatr; t変異しますが、thしません。
アンティハパラ

「Golff yCôd」である必要があります-「yr」は母音の前にのみ来るため、子音の前に「y」を使用します。
ガレス

ウェールズの突然変異に関する複雑なルールに興味がある人は、「Ap Treiglo」と呼ばれるアプリを使用して、ルールを提供し、次の単語で突然変異を引き起こす単語の多くをリストします。
ガレス

@Beta Decayええ、過去5年間。その前にリル、私の罪のために。
ガレス

回答:


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は自動的に電源を切ることにし、どのような最適化ができたか思い出せなくなりました。
ニール

4

C#、356 338 360バイト

私は、C#がコードゴルフには不適切な選択であることを知っていますが、一見の価値があります。

3回目の試行では、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の最初の要素をスキップしないことにより、書き込み線の最初の呼び出しだけでなく、アクション、保存(だけでなく、スキップを保存)し、ちょうど自分自身との最初のアイテムを交換することができます(私は思います)。また、正規表現への呼び出しは1回だけなので、インポートのキャッシング/名前の変更にはText.RegularExpressions.Regex.Replace(...)、本体内よりもコストがかかります。ブレークは最後までループする場合でも1回しか一致しないので、余計なことはありません
-pinkfloydx33

1
ゴルフの言語に悪い選択はありません。同じ言語であなたを打ち負かそうとする他の誰かと競争しています。さらに、C#はかつて Jon Skeet が選んだゴルフ言語でした
...-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は、2文字を節約するためのnot w.find(a)代替品になると指摘しましたw.startswith(a)。しかし、代わりにいくつかの文字をさらに節約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())]

次に、バグがあることに気づき、rh2回リストされました。これらの2文字の子音の面倒を見る私の短絡リストに一度。残念ながら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バイト

@グリズリーさんに基づき提出、それが働いていなかったこと(PH / CH /目/ 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.