Language agnostic 代码:猪拉丁语
挑战: 取一个输入任意长度的句子,将该句子中的所有单词转换成拉丁语。如果你不知道什么是猪拉丁语,请阅读 规格:Language agnostic 代码:猪拉丁语,language-agnostic,code-golf,rosetta-stone,Language Agnostic,Code Golf,Rosetta Stone,挑战: 取一个输入任意长度的句子,将该句子中的所有单词转换成拉丁语。如果你不知道什么是猪拉丁语,请阅读 规格: 假设所有单词都用空格分隔,所有句子都以感叹号、问号或句号结尾 不要对维基百科中提到的元音使用变体 对于像面包和测验这样的单词来说,将它们改为readbay、uizqay而不是eadbray和izqay是完全可以接受的 函数或方法是完全可以接受的。换句话说,您不需要接受用户输入,但必须显示用户输出 假设没有输入包含复合词 例如: Input: I am a happy man.
Input: I am a happy man.
Output: Iway amway away appyhay anmay.
如何赢得:
获胜者是能够用最少的字符编写完成挑战的程序的人。Perl,70个字符
要使球滚动,请执行以下操作:
while(<>){for(split){s/^([^aeiou]+)(.*)/$2$1ay / or $_.='way ';print}}
while()
我相信它可以在某些地方改进。Groovy,11710091858379字符
可读版本:
print args[0]
.replaceAll(
/(?i)\b(\w*?)([aeiou]\w*)/ ,
{
a, b, c ->
c + ( b ? b : 'w' ) + "ay"
})
Python-107字符
GolfScript-60 53 52 51 49 46个字符
哈斯克尔:244 199 222 214查尔
该方案在原大写的基础上,对转换后的单词进行合理的大写。现在正确地处理前导辅音簇。注:最后一行末尾不包括换行符
import Data.Char
import Data.List
q(x:y,z)|w x=x%(z++toLower x:y++"ay")|0<1=x:y++z
q(_,z)=z++"way"
x%(y:z)|isUpper x=toUpper y:z|0<1=y:z
w=isAlpha
main=interact$(>>=q.break(`elem`"aeiouAEIOU")).groupBy((.w).(==).w)
测试输出:
Idday ethay appingstray anmay aysay: "Iway amway Octorday Xay!"?
C#257 96个字符
可读版本:
string.Join(" ",
args.Select(y =>
("aeiouAEIOU".Contains(y[0])
? y + "way"
: y.Substring(1) + y[0] + "ay")
)
);
浓缩的
string.Join(" ",args.Select(y=>("aeiouAEIOU".Contains(y[0])?y+"way":y.Substring(1)+y[0]+"ay")));
输入:
string.Join(" ",
args.Select(y =>
("aeiouAEIOU".Contains(y[0])
? y + "way"
: y.Substring(1) + y[0] + "ay")
)
);
林克帮我写出好的高尔夫答案
输出:
string.Join(" ",
args.Select(y =>
("aeiouAEIOU".Contains(y[0])
? y + "way"
: y.Substring(1) + y[0] + "ay")
)
);
在Qlay elpshay emay riteway oodgay olfgay answersway
Ruby 1.9+:63 62个字符
只是一个简单的回答,可能可以缩短更多
p gets.gsub(/\w+/){|e|"#{e=~/^(qu|[^aeiou]+)/i?$'+$&:e+?w}ay"}
它处理qu
(问题=>estionquay)的情况,并使用双qoutes打印。再增加3个字节以消除它们(我说没有这方面的规范)
编辑1:如果使用Ruby 1.9保存一个字符(?w
),让我们使用它。sed-53/55 45/47 chars
使用-r选项(2+43):
没有-r选项(47):
VB.NET:106个字符
假设“s”是输入,并且导入System.Text.RegularExpressions
。(有趣的是,由于需要@string literal前缀和尾随分号,这个VB.NET版本比C#等价物多了3个字符。)
Boo(.NET):91个字符
与VB.NET answer的概念相同,只使用Boo保存一些击键
print /(?i)\b([^aeiou\s])(\S*)/.Replace(/(?i)\b([aeiou]\S*)/.Replace(s, "$1way"), "$2$1ay")
哎呀。。。我只是注意到这不能处理结尾的标点符号。或者任何标点符号。哦,好吧,其他许多解决方案也没有。Python3-107 106字符
不保留注释中允许的大小写。但是标点符号被保留了下来。添加空格和换行符只是为了可读性(因此在导入re后添加;
)
如果我们不处理“qu”字,可以删除3个字符(qu |
)
用法示例:
$ python3.1 x.py
The "quick brown fox" jumps over: the lazy dog.
eThay "ickquay ownbray oxfay" umpsjay overway: ethay azylay ogday.
Perl 87、56、47个字符
使用标点符号
多亏了MobleRule
s/\b[aeiou]\w*/w$&/gi;s/\b(\w)(\w*)/\2\1ay/g
用法:
echo 'I, am; a: happy! man.' | perl -p piglatin.pl
输出:
Iway, amway; away: appyhay! anmay.
Python 3-100 103 106个字符
(类似于肯尼特的;正则表达式在这里起作用。)
注意:由于将正则表达式修改为“qu”,所以从100个字符增加到103个字符
注2:当“y”用于元音时,103字符版本失败。呜呜。(另一方面,KennyTM的106字符版本在元音使用“y”时也会失败,所以不管怎样。)Lua,109个字符
输出:
oTay ebay onesthay, Iway ouldway aysay "oNay!" otay atthay uestionqay.
PHP 102字节
<?foreach(split(~ß,SENTENCE)as$a)echo($b++?~ß:'').(strpos(' aeuio',$a[0])?$a.w:substr($a,1).$a[0]).ay;
<?=preg_filter('#\b(([aioue]\w*)|(\w)(\w*))\b#ie','"$2"?$2way:$4$3ay',SENTENCE);
@Byron Whitlock:胜利的满足感。如果你赢了,在你的答案旁边打一个绿色的复选标记我们应该把大写的词适当地大写吗?我们可以忽略整个单词大写的情况吗?@trinithis:没关系。无论哪种方式都可以。好吧,谁投票结束了这个话题?那个人能提供他/她决定这么做的理由吗?@MtnViewMark:是的,你需要保留标点符号。你可以通过做perl-pe'.
而不是自己在代码中的while/print位来切掉一些标点符号。通过示例输入,会生成一个不正确的输出Iay-amway-away-appyhay-an.may
。它应该是Iway
(包括不区分大小写的标志)和anmay.
(忽略非单词字符)。通过使用LINQ剃掉了大约2/3的解决方案。哇,我在C#中从未见过这么短的高尔夫+1@Maulrus:那是因为这个程序忽略了所有使它成为程序的东西。也就是说,您需要将类A{static void Main(string[]A){
放在所有这些之前(并将“args
”替换为“A
”当然。事实上,我不明白他们为什么使用多字母变量名。@Johannes:ohhh,这是有道理的。如果这不是一个完整的程序,我就撤回我的投票。@mickey TheOP的第三条规则规定,忽略音节,只在第一个字母上破译是可以接受的(虽然我同意你的观点,但应该在音节上破译).赞美并用一句话写下:)它仍然需要一个程序it@Johannes-不一定。它可以始终通过以下()或任何()之类的方式运行。没有理由过度夸大现有的代码对动态语言的偏好。它们可以站在自己的优势上:)@matt:在这种情况下,我可以通过假设输入由函数I
给出,而不是使用迭代器$input
,从而缩短很多东西(至少它可以决定打败Ruby与否)。此外,如果它在REPL中,您可以删除返回值
-1。示例输入为Iway安利送出appyhay。may
-该人。
转换错误。@KennyTM输入的规范以“!”?”或“.”结尾。它没有说它们可以以“!”结尾“\n”很好的背驮解决方案!很好的表演。我喜欢看
s/\b[aeiou]\w*/w$&/gi;s/\b(\w)(\w*)/\2\1ay/g
echo 'I, am; a: happy! man.' | perl -p piglatin.pl
Iway, amway; away: appyhay! anmay.
import re;print(re.sub('(?i)(y|qu|\w*?)([aeiouy]\w*)',lambda m:m.group(2)+(m.group(1)or'w')+'ay',input()))
print((io.read():gsub("(%A*)([^AEIOUaeiou]*)(%a+)",function(a,b,c)return a..c..b..(#b<1 and"way"or"ay")end)))
To be honest, I would say "No!" to that question.
oTay ebay onesthay, Iway ouldway aysay "oNay!" otay atthay uestionqay.
<?foreach(split(~ß,SENTENCE)as$a)echo($b++?~ß:'').(strpos(' aeuio',$a[0])?$a.w:substr($a,1).$a[0]).ay;
<?=preg_filter('#\b(([aioue]\w*)|(\w)(\w*))\b#ie','"$2"?$2way:$4$3ay',SENTENCE);