23

挑战:

输入一个任意长度的句子并将该句子中的所有单词转换为猪拉丁语。如果您不知道什么是猪拉丁语,请阅读维基百科:猪拉丁语

规格:

  1. 假设所有单词都用空格分隔,并且所有句子都以感叹号、问号或句点结尾。

  2. 不要使用维基百科中提到的元音变体。

  3. 对于诸如面包和测验之类的词,完全可以使用 readbay、uizqay 而不是 eadbray 和 izquay。

  4. 函数或方法是完全可以接受的。换句话说,您不需要接受用户输入,但您必须显示用户输出。

  5. 假设没有输入包含复合词。

例子:

Input: I am a happy man.
Output: Iway amway away appyhay anmay.

如何取胜:

获胜者是能够编写程序以最少的字符完成挑战的人。

4

15 回答 15

12

sed - 53/55 45/47 个字符

使用 -r 选项 (2+43):

s/\b[aeiou]\w*/w&/gi;s/\b(\w)(\w*)/\2\1ay/g

没有 -r 选项 (47):

s/\b[aeiou]\w*/w&/gi;s/\b\(\w\)\(\w*\)/\2\1ay/g
于 2010-07-07T03:07:07.973 回答
11

C#25796 个字符

可读版本:

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

输入:

LINQ 帮助我写出好的高尔夫答案

输出:

INQLay elpshay emay riteway oodgay olfgay 答案

于 2010-07-07T02:55:17.127 回答
9

GolfScript - 60 53 52 51 49 46 个字符

)](' '/{1/(."AEIOUaeiou"-!{\119}*"ay "}%));+\+
于 2010-07-07T01:30:11.363 回答
7

Ruby 1.9+:63 62 个字符

只是一个快速的答案,可能可以缩短更多

p gets.gsub(/\w+/){|e|"#{e=~/^(qu|[^aeiou]+)/i?$'+$&:e+?w}ay"}

它处理qu(question => estionquay) 的情况,并使用双引号打印。3个字节来摆脱它们(我说没有关于这个的规范)

编辑 1:如果使用 Ruby 1.9 保存一个字符 ( ?w),让我们使用它。

于 2010-07-07T02:55:28.233 回答
6

Perl87,56, 47 个字符

与标点符号一起使用。

感谢 mobrule。

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.
于 2010-07-07T13:54:10.597 回答
4

Groovy,117 100 91 85 83 79 个字符

print args[0].replaceAll(/(?i)\b(\w*?)([aeiou]\w*)/,{a,b,c->c+(b?b:'w')+"ay"})

可读版本:

print args[0]
.replaceAll(
    /(?i)\b(\w*?)([aeiou]\w*)/ ,
    {
        a, b, c ->
        c + ( b ? b : 'w' ) + "ay" 
    })
于 2010-07-07T00:09:37.293 回答
4

哈斯克尔: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)

测试输入:

Did the strapping man say: "I am Doctor X!"?

测试输出:

Idday ethay appingstray anmay aysay: "Iway amway Octorday Xay!"?
于 2010-07-07T02:41:15.217 回答
3

蟒蛇 3 —107106 个字符

如评论中允许的那样,不保留大写。但标点符号被保留。添加空格和换行符只是为了便于阅读(因此是;after import re)。

import re;
print(re.sub('(?i)\\b(qu|[^aeiou\W]*)(\w*)',
             lambda m:m.group(2)+(m.group(1)or'w')+'ay',
             input()))

qu|如果我们不处理“qu”字,则可以删除 3 个字符 ( )。

示例用法:

$ python3.1 x.py
The "quick brown fox" jumps over: the lazy dog.
eThay "ickquay ownbray oxfay" umpsjay overway: ethay azylay ogday.
于 2010-07-07T08:36:37.153 回答
3

Python 3 - 100 103 106 个字符

(类似于 KennyTM 的;正则表达式在这里有所作为。)

import re;print(re.sub('(?i)(y|qu|\w*?)([aeiouy]\w*)',lambda m:m.group(2)+(m.group(1)or'w')+'ay',input()))

注意:从 100 个字符变为 103 个字符,因为修改了正则表达式以解释“qu”。

注意 2:当“y”用于元音时,103 字符版本会失败。呜呜。(另一方面,当“y”用于元音时,KennyTM 的 106 字符版本也会失败,所以无论如何。)

于 2010-07-07T14:53:47.957 回答
3

VB.NET:106 个字符

假设“s”是输入,也是Imports System.Text.RegularExpressions. (有趣的是,由于需要 @ 字符串字面量前缀和尾随分号,这个 VB.NET 版本比 C# 版本高出 3 个字符。)

Return Regex.Replace(Regex.Replace(s, "(?i)\b([aeiou]\S*)", "$1way"), "(?i)\b([^aeiou\s])(\S*)", "$2$1ay")
于 2010-07-07T03:49:03.773 回答
2

嘘(.NET):91 个字符

与 VB.NET 答案相同的概念,仅使用 Boo 来节省一些击键。

print /(?i)\b([^aeiou\s])(\S*)/.Replace(/(?i)\b([aeiou]\S*)/.Replace(s, "$1way"), "$2$1ay")

哎呀...我只是注意到这不能处理结尾的标点符号。或者真的是任何标点符号。哦,好吧 - 许多其他解决方案也没有。

于 2010-07-07T04:03:21.447 回答
2

Lua,109 个字符

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.
于 2010-07-08T00:18:20.697 回答
1

Python - 107 个字符

i=raw_input()
print" ".join(w+"way"if w[0]in"aeiouyAEIOUY"else w[1:]+w[0]+"ay"for w in i[:-1].split())+i[-1]
于 2010-07-07T01:14:08.430 回答
1

Perl,70 个字符

让球滚动:

while(<>){for(split){s/^([^aeiou]+)(.*)/$2$1ay / or $_.='way ';print}}

我相信它可以在某个地方进行改进。

于 2010-07-06T23:44:41.550 回答
1

PHP 102 字节

<?foreach(split(~ß,SENTENCE)as$a)echo($b++?~ß:'').(strpos(' aeuio',$a[0])?$a.w:substr($a,1).$a[0]).ay;

PHP 使用 preg 80 字节

<?=preg_filter('#\b(([aioue]\w*)|(\w)(\w*))\b#ie','"$2"?$2way:$4$3ay',SENTENCE);
于 2011-01-19T21:26:17.037 回答