Код Гольф: Свинья Латинская

Вызов:

Возьмите предложение ввода любой длины и преобразуйте все слова в этом предложении в латинскую свинью. Если вы не знаете, что такое латинская свинья, пожалуйста, прочитайте Wikipedia: Pig Latin.

Характеристики:

  1. Предположим, что все слова разделены пробелами, и все предложения заканчиваются восклицательным знаком, знаком вопроса или точкой.

  2. Не используйте вариант для гласных, упомянутых в Википедии.

  3. Для таких слов, как хлеб и викторина, для них вполне приемлемо быть readbay, uizqay вместо and eadbray и izquay.

  4. Функции или методы вполне приемлемы. Другими словами, вам не нужно принимать пользовательский ввод, но вы должны отображать пользовательский вывод.

  5. Предположим, что входные данные не содержат составного слова.

Пример:

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);
Другие вопросы по тегам