В дополнение к ответу @ MBoros.
Вы можете избежать написания сложных общих аргументов с помощью этого вспомогательного метода:
public static MethodInfo GetMethodByExpression<Tin, Tout>(Expression<Func<IQueryable<Tin>, IQueryable<Tout>>> expr)
{
return (expr.Body as MethodCallExpression).Method;
}
Использование:
var where = GetMethodByExpression<int, int>(q => q.Where((x, idx) => x > 2));
Или
var select = GetMethodByExpression<Person, string>(q => q.Select(x => x.Name));
С опцией -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
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);
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]
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.
Та же концепция, что и в ответе VB.NET, только с помощью Boo для сохранения нескольких нажатий клавиш.
print /(?i)\b([^aeiou\s])(\S*)/.Replace(/(?i)\b([aeiou]\S*)/.Replace(s, "$1way"), "$2$1ay")
Упс ... Я только что заметил, что это не относится к конечной пунктуации. Или действительно любая пунктуация. Ну да ладно, как и многие другие решения.
(аналогично 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: Оказывается, что версия с 103 символами не срабатывает, когда «y» используется для гласного звука. BLEH. (С другой стороны, 106-символьная версия KennyTM также дает сбой, когда «y» используется для гласного звука, и так далее.)
Несохранение заглавных букв , как разрешено в комментарии. Но знаки препинания сохранены. Пробелы и разрывы строк добавляются только для удобства чтения (отсюда ;
после 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()))
3 символа могут быть удалены (qu|
), если мы не обработаем слова "qu".
Пример использования:
$ python3.1 x.py
The "quick brown fox" jumps over: the lazy dog.
eThay "ickquay ownbray oxfay" umpsjay overway: ethay azylay ogday.
Решение дает разумную капитализацию для преобразованных слов на основе первоначальной капитализации. Теперь правильно обрабатывает ведущие согласные кластеры. Примечание: в конце последней строки нет новой строки.
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!"?
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"
})
)](' '/{1/(."AEIOUaeiou"-!{\119}*"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")));
Входные данные:
LINQ помогает мне написать хорошие ответы по гольфу
Вывод:
INQLay elpshay emay riteway oodgay olfgay answersway
Предполагается, что «s» является входом, а также Imports System.Text.RegularExpressions
. (Интересно, что из-за необходимости использования буквального префикса @ string и конечной точки с запятой, эта версия VB.NET превосходит эквивалент C # на 3 символа.)
Return Regex.Replace(Regex.Replace(s, "(?i)\b([aeiou]\S*)", "$1way"), "(?i)\b([^aeiou\s])(\S*)", "$2$1ay")
Для начала:
while(<>){for(split){s/^([^aeiou]+)(.*)/$2$1ay / or $_.='way ';print}}
Я уверен, что его можно где-нибудь улучшить.
работает с пунктуацией.
Спасибо 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.
Просто быстрый ответ, возможно, его можно сократить еще раз
p gets.gsub(/\w+/){|e|"#{e=~/^(qu|[^aeiou]+)/i?$'+$&:e+?w}ay"}
он обрабатывает случай qu
(question => estionquay ) и печатает с двойными кавычками. Еще 3 байта, чтобы избавиться от них (я не говорю об этом)
Редактировать 1: Если при использовании Ruby 1.9 сохраняется символ (? W
), давайте воспользуемся им.