Подтвердить что ты не робот

Код Golf: Pig Latin

Проблема:

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

Технические характеристики:

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

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

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

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

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

Пример:

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

Как выиграть:

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

4b9b3361

Ответ 1

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

Ответ 2

С# 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 answerway

Ответ 3

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

)](' '/{1/(."AEIOUaeiou"-!{\119}*"ay "}%));+\+

Ответ 4

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), используйте его.

Ответ 5

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

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

Ответ 7

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!"?

Ответ 8

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

Предполагается, что "s" - это вход, а также Imports System.Text.RegularExpressions. (Интересно, из-за необходимости префикса @string literal и конечной полуколонии, эта версия VB.NET превосходит эквивалент С# на 3 символа.)

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

Ответ 9

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.

Ответ 10

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

Ответ 11

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

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

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

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

Ответ 12

Lua, 109 символов

print((io.read():gsub("(%A*)([^AEIOUaeiou]*)(%a+)",function(a,b,c)return a..c..b..(#b<1 and"way"or"ay")end)))

Input:

To be honest, I would say "No!" to that question.

Вывод:

oTay ebay onesthay, Iway ouldway aysay "oNay!" otay atthay uestionqay.

Ответ 13

Perl, 70 символов

Чтобы заставить мяч прокатиться:

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

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

Ответ 14

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]

Ответ 15

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