戈尔夫·科德-Treiglad


16

阅读此ng 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 2016年

另一个测试用例theatr; t变异但th不变异。
Antti Haapala

应该是'Golff yCôd'-'yr'仅在元音之前出现,而在辅音之前使用'y'。
加雷斯

如果有人对威尔士语中有关突变的复杂规则感兴趣,可以使用一个名为“ Ap Treiglo”的应用程序,该应用程序给出规则并列出许多导致下一个单词突变的单词。
加雷斯

@Beta Decay是的,过去5年。瑞尔在此之前,为了我的罪过。
Gareth 16'9

Answers:


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#对于代码高尔夫来说不是一个好的选择,但是值得一试:

第三次尝试,现在所有情况都通过了,包括ph-等。此调整大约需要18个字节。

感谢pinkfloydx33节省24个字节的提示!

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 2013年

1
高尔夫的语言选择不多-您正在与任何想用相同语言击败您的人竞争。加 C#曾经是乔恩·斯基特(Jon Skeet)选择的高尔夫语言 ...
trichoplax

@ pinkfloydx33感谢您的提示!但是,我无法删除第一个Console.WriteLine调用,因为在没有替换的情况下,这将跳过输出单词。我敢肯定,有一种方法可以通过更改条件来对其进行优化。
灰熊

我刚发现 theatr案例,看来它没有正确变异。
灰熊

是的,由于PH,TH,CH和DD尚未转换,因此目前没有几个测试用例通过
pinkfloydx33 2013年

3

蟒蛇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)一起使用,并修正了多余的辅音。希望还好吗?

我将其降低到290,直到我意识到我错过了th / ch / ph / dd案例:-(.。在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);
        }
    }
}

0

Perl 6,162个字节

{/^(.|<[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)}

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.