Гольф кода: латынь свиньи

В дополнение к ответу @ 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));  
23
задан 5 revs, 4 users 73%thyrgle 7 July 2010 в 20:12
поделиться

15 ответов

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
12
ответ дан 3 revs 29 November 2019 в 00:58
поделиться

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);
1
ответ дан 3 revsuser581149 29 November 2019 в 00:58
поделиться

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]
1
ответ дан 4 revs, 2 users 80% 29 November 2019 в 00:58
поделиться

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.
2
ответ дан gwell 29 November 2019 в 00:58
поделиться

Boo (.NET): 91 символ

Та же концепция, что и в ответе VB.NET, только с помощью Boo для сохранения нескольких нажатий клавиш.

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

Упс ... Я только что заметил, что это не относится к конечной пунктуации. Или действительно любая пунктуация. Ну да ладно, как и многие другие решения.

2
ответ дан mattmc3 29 November 2019 в 00:58
поделиться

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: Оказывается, что версия с 103 символами не срабатывает, когда «y» используется для гласного звука. BLEH. (С другой стороны, 106-символьная версия KennyTM также дает сбой, когда «y» используется для гласного звука, и так далее.)

3
ответ дан 3 revs 29 November 2019 в 00:58
поделиться

Python 3 - 107 106 символов

Несохранение заглавных букв , как разрешено в комментарии. Но знаки препинания сохранены. Пробелы и разрывы строк добавляются только для удобства чтения (отсюда ; после 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.
3
ответ дан 2 revs 29 November 2019 в 00:58
поделиться

Haskell: 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!"?
4
ответ дан 4 revs, 2 users 71% 29 November 2019 в 00:58
поделиться

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" 
    })
4
ответ дан 7 revs, 2 users 95% 29 November 2019 в 00:58
поделиться

GolfScript - 60 53 52 51 49 46 символов

)](' '/{1/(."AEIOUaeiou"-!{\119}*"ay "}%));+\+
9
ответ дан 5 revs 29 November 2019 в 00:58
поделиться

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

Входные данные:

LINQ помогает мне написать хорошие ответы по гольфу

Вывод:

INQLay elpshay emay riteway oodgay olfgay answersway

11
ответ дан 3 revs, 2 users 66% 29 November 2019 в 00:58
поделиться

VB.NET: 106 символов

Предполагается, что «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")
3
ответ дан mattmc3 29 November 2019 в 00:58
поделиться

Perl, 70 символов

Для начала:

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

Я уверен, что его можно где-нибудь улучшить.

1
ответ дан 29 November 2019 в 00:58
поделиться

Perl 87 , 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.
6
ответ дан 29 November 2019 в 00:58
поделиться

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 ), давайте воспользуемся им.

7
ответ дан 29 November 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: