Код Гольф: Свинья Латинская
Вызов:
Возьмите предложение ввода любой длины и преобразуйте все слова в этом предложении в латинскую свинью. Если вы не знаете, что такое латинская свинья, пожалуйста, прочитайте Wikipedia: Pig Latin.
Характеристики:
Предположим, что все слова разделены пробелами, и все предложения заканчиваются восклицательным знаком, знаком вопроса или точкой.
Не используйте вариант для гласных, упомянутых в Википедии.
Для таких слов, как хлеб и викторина, для них вполне приемлемо быть readbay, uizqay вместо and eadbray и izquay.
Функции или методы вполне приемлемы. Другими словами, вам не нужно принимать пользовательский ввод, но вы должны отображать пользовательский вывод.
Предположим, что входные данные не содержат составного слова.
Пример:
Input: I am a happy man.
Output: Iway amway away appyhay anmay.
Как победить:
Победителем становится человек, который может написать программу, которая выполнит вызов с наименьшим количеством символов.
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
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
GolfScript - 60 53 52 51 49 46 символов
)](' '/{1/(."AEIOUaeiou"-!{\119}*"ay "}%));+\+
Ruby 1.9+: 63 62 символа
Просто быстрый ответ, вероятно, можно сократить больше
p gets.gsub(/\w+/){|e|"#{e=~/^(qu|[^aeiou]+)/i?$'+$&:e+?w}ay"}
это обрабатывает случай qu
(question => estionquay), и печатает с двойными qoutes. Еще 3 байта для избавления от них (я не говорю об этом)
Редактировать 1: при использовании Ruby 1.9 сохраняет персонажа (?w
), давайте использовать это.
Perl 87, 5647 символов
работает с пунктуацией.
Благодаря мобруле.
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.
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!"?
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"
})
Питон 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" используется для гласного звука, и так далее.)
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.
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")
Бу (.NET): 91 символ
Та же концепция, что и в VB.NET, только с использованием Boo для сохранения нескольких нажатий клавиш.
print /(?i)\b([^aeiou\s])(\S*)/.Replace(/(?i)\b([aeiou]\S*)/.Replace(s, "$1way"), "$2$1ay")
Ой... Я только что заметил, что это не обрабатывает конечную пунктуацию. Или действительно любая пунктуация. Ну да ладно, как и многие другие решения.
Луа, 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.
Питон - 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]
Perl, 70 символов
Чтобы получить мяч катится:
while(<>){for(split){s/^([^aeiou]+)(.*)/$2$1ay / or $_.='way ';print}}
Я уверен, что это может быть улучшено где-нибудь.
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);