Кошки идут Мяу, Коровы идут Му


40

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

Точно так же коровы идут, кричат

Вызов

Вы должны написать программу, которая принимает в качестве входных данных слово, обозначающее «кошка», и слово, обозначающее «корова», определяет количество основных гласных и, при необходимости, печатает одну из следующих строк:

  • C[]ts go M[]w
  • C[]ws go M[]

Где []обозначает гласные, согласно следующим правилам:

  • Число е и о в «мяу» должно совпадать с количеством гласных во входном слове.
  • Число о в "Moo" должно быть в два раза больше количества гласных, найденных во входном слове.

Программа должна распознавать вводимые слова catи cow. В качестве входных данных можно использовать любую наиболее удобную заглавную букву, но выходные данные должны быть прописными, как показано выше.


42
реплика шутка о некой лисе
Мартин Эндер

7
Я не уверен, что понимаю проблему. Ввод одно или два слова? Можете ли вы привести несколько примеров пар ввода / вывода?
Згарб

31
@ MartinBüttner Я не уверен, знаю ли я, о какой лисе ты говоришь. Пробежка по моей памяти, что это говорит?
DJMcMayhem

4
Вы указываете количество e и o, но не их порядок. Является Meooeoewдействительным выходом для Caaat, например?
Питер Олсон

10
Ради лисы, остановись с каламбурами!
Eumel

Ответы:


17

Retina , 57 49 44 43 41 байт

Так близко ... :) Пиф ...

.(.+).
$0s go M$1$1
+`aa(\w*$)
e$1ow
wo
o

Попробуйте онлайн.

Ожидается, что ввод будет заглавным, как Caaatили Coooow.

объяснение

.(.+).
$0s go M$1$1

Регулярное выражение соответствует всему вводу и захватывает гласные в группе 1(нам не нужны якоря, потому что совпадение не может завершиться неудачей и будет жадно соответствовать всему вводу). Подстановка записывает эти входные данные и добавляет s go M, а затем дважды вводит гласные. Для входов Caaatи Coooowмы получаем:

Caaats go Maaaaaa
Coooows go Moooooooo

Вывод для коров уже правильный. Нам просто нужно что-то сделать с этими кошками.

+`aa(\w*$)
e$1ow

+Говорит Retina повторить этот этап как можно чаще. Регулярное выражение соответствует двум as в последней части строки (мы гарантируем это с помощью $якоря, чтобы не заменять вещи внутри Caaats). Это будет по существу соответствовать всему после того M, как эта часть все еще имеет as. Две aбуквы удаляются, а весь суффикс после него оборачивается e...ow:

Caaats go Meaaaaow
Caaats go Meeaaowow
Caaats go Meeeowowow

Наконец, есть два много wлет в результате, поэтому мы удаляем те , которые предшествуют o(чтобы убедиться , что мы не портя wин Coooows):

wo
o

И мы остались с:

Caaats go Meeeooow

11

LabVIEW, 58 примитивов LabVIEW

создавать такие строки - это боль ...

Крайние левые vis - сопоставление с образцом, a + и o + соответственно ищут самое большое количество as и os в строке.

Взяв длину из тех, что я создал 3 массива 1 с длиной os 1 с длиной es и один с длиной 2 раза os.

Тогда все части собраны вместе. Сначала исходный ввод, затем s идут M все массивы, неиспользуемые пустые, поэтому они будут игнорироваться, и, наконец, aw, если ввод был cat. (Если после того, как найдены, будет после матча, если не после матча пусто)

Для LOLZ я также реализовал лису с 6 различными выходами ^^


У меня нет возможности проверить это, но если это работает, как вы говорите, я впечатлен!
Sonic Atom

Можете ли вы дать объяснение из интереса?
Sonic Atom

Объяснение истекло, не стесняйтесь спрашивать, если есть какие-либо вопросы
Eumel

Код-гольф, как босс. Вау.
Jakuje

7

Пиф, 50 44 34

Принимает ввод в формате ["caat", "coow"].

Pj.bs[rN3"s go M"S*-lN2+Y\o\w)Q"eo

Попробуйте онлайн.

Разъяснение:

  .b                                  Map a lambda across two lists in parallel:
                              Q       The input, e.g. ["caat", "coow"]
                               "eo    The string "eo"
    s[                       )            Create and concatenate a list of:
      rN3                                 - The item N in title caps (e.g. "Caat")
         "s go M"                         - The string "s go M"
                 S                        - The sorted version of:
                       +Y\o                   The item Y + "o" ("eo" or "oo")
                  *-lN2                       Times the length of N - 2 (number of vowels)
                           \w             - The string "w"
Pj                                    Join the result on \n and drop the final "w"

Спасибо Jakube за значительное сокращение длины.


Некоторые мелочи: вы можете заменить первое jkна s, удалить второе jk(оно вообще ничего не делает) и заменить "w\n"на \wb.
Якуб

Кроме того, большая часть вашего кода появляется дважды в вашем коде, как r.Q3и другие вещи. Вы можете использовать двоичную карту и сохранить 10 дополнительных символов. Pj.bs[rN3"s go M"S*-lN2+Y\o\w)Q"eo, Не уверен, если у вас уже есть опыт работы с картами, если у вас есть какие-либо вопросы, я могу объяснить их вам в чате Pyth .
Якуб

Здорово спасибо Я подумал, что могу сделать что-то подобное, но не совсем знал, как.
Люк

Это очень эффективно. Это должно иметь больше голосов.
Sonic Atom


5

Perl, 66 61 55 54 байта

включает +1 для -p

/[ao]+/;$\="s go M".$&=~y/a/e/r.o x($+[0]-1).(w)[/w/]

Ожидается, что ввод будет соответствовать /^C[ao]+[tw]$/(без завершающей строки!)
Использование:/bin/echo -n Caaat | perl -p 55.pl

Сломать

/[ao]+/;
$\= "s go M"        # assign to $OUTPUT_RECORD_SEPARATOR, normally `\n`. Saves 1 vs `$_.=`
   . $&             # the matched vowels
     =~ y/a/e/r     # translate `a` to `e`; `/r` returns a copy.
   . o x($+[0]-1)   # append 'o', repeated. $+[0] is string position of last match end.
   . (w)[/w/]       # returns 'w' if there is no /w/ in the input, nothing if there is.

Предыдущая версия:

@l=/[ao]/g;$x=$&x@l.o x@l;$y=$x=~y/a/e/?w:'';s/$/s go M$x$y/

Прокомментировал :

@l = /[ao]/g;               # captures $& as vowel and @l as list of vowels
$x = $& x @l .o x @l;       # construct the output vowels
$y = $x =~ y/a/e/ ? w : ''; # correct vowel string for cats (aaaooo->eeeooo); $y='w' if cat.
s/$/s go M$x$y/             # construct the desired output.

Пример: Caaat

  • Захват $&как aи @lкак (a,a,a).
  • Установите $xв три раза , aпосле чего 3 раза o: aaaooo.
  • Перевести все aв $xк e: eeeooo. Количество замен (либо 0, либо положительных) служит в качестве детектора кошки: установите $yна, wесли так.
  • Измените ввод, добавив s go M, eeeoooи w.

  • обновление 61 : сохранить 5 байтов, используя список вместо строки
  • обновление 55 : сохранить 6 байтов, вставляя, назначая, $\а неs/$/ и не требуя завершающего перевода строки при вводе.
  • обновление 54 : сохранить 1 байт, исключив @l.

4

Python 2, 74 байта

i=input()
l=len(i)-2
print i+'s go M'+['e'*l+'o'*l+'w','o'*l*2][i[-1]>'v']

Принимает вход

Caaat или Cooow


2

CJam ( 60 57 55 53 байта)

"C%s%ss go M%sw
"2*-2<q"ctw"-S/"teowoo"3/.{(2$,@*$}e%

Демо онлайн . Ввод предполагается в нижнем регистре.

Для той же длины:

"C

s go M"N/_]"w
"a*q"ctw"-S/"teowoo"3/.{(2$,@*$M}]z

'CM"s go M"]2*q"ctw"-S/"teowoo"3/.{(2$,@*$}[MM"w
"]]z

1

PowerShell, 135 132 байта

param($a,$b)
[char[]]"$a$b"|%{if($_-eq'a'){$c++}$d++}
$d-=4+$c
"C$("a"*$c)ts go M$("e"*$c)$("o"*$c)w"
"C$("o"*$d)ws go M$("o"*2*$d)"

(разрывы строк считаются такими же, как точки с запятой, поэтому для ясности разбито на строки)

Удивительно сложная задача. И я вполне уверен, что это может быть дальше в гольфе.

Принимает входные строки как $aи $b. Объединяет их и преобразует их как массив символов, а затем передает их через цикл %{}. Каждая буква затем проверяется , если это -eqUAL к 'a'и связанная переменная счетчика увеличивается соответствующим образом . Затем мы вычитаем 4+$cиз $dучета catcwвходные данные и переходим к формулированию выходных предложений, изменяя время вывода гласных на соответствующие счетчики. (В PowerShell 'e'*3выдаст 'eee', например.)


1

Почти аналогично ответу @ omulusnr, но это дает правильный вывод, а также ввод нечувствителен к регистру.

PHP, 172

$p=$argv[1];
preg_match("/c([ao]+)/i",$p,$e);
$l=strlen($e[1]);
$s=($k=strcmp($e[0][1],'o'))?'eo':'oo';
echo $p,' go M',str_repeat($s[0],$l),str_repeat($s[1],$l),$k?'w':'';

$p=$argv[1];preg_match("/c([ao]+)/i",$p,$e);$l=strlen($e[1]);$s=$k=strcmp($e[0][1],'o')?'eo':'oo';$r='str_repeat';echo $p,' go M',$r($s[0],$l),$r($s[1],$l),$k?'w':'';немного короче до 166 байт
Чаллака

1

Swift 2, 3̶8̶1̶ 333 байта

func f(i:String)->String{var s=i.lowercaseString;s.replaceRange(s.startIndex...s.startIndex,with:String(s[s.startIndex]).uppercaseString);let c=i.characters.count-2;let l=s.characters.last;return(s+"s go M"+String(count:c,repeatedValue:l=="t" ?"e" :"o" as Character)+String(count:c,repeatedValue:"o" as Character)+(l=="t" ?"w" :""))}

Ungolfed:

func f(i:String)->String{
    var s = i.lowercaseString
    s.replaceRange(s.startIndex...s.startIndex,with:String(s[s.startIndex]).uppercaseString)
    let c = i.characters.count-2
    let l = s.characters.last
    return(s+"s go M"+String(count:c,repeatedValue:l=="t" ?"e" :"o" as Character)+String(count:c,repeatedValue:"o" as Character)+(l=="t" ?"w" :""))
}

Принимает кошку или корову любую заглавную букву. Вы можете попробовать это здесь:

http://swiftlang.ng.bluemix.net/#/repl/3f79a5335cb745bf0ba7698804ae5da166dcee6663f1de4b045e3b8fa7e48415


2
Как это принять вход?
спагетто

В этом примере нет входных данных, я сделал это для тестирования на детской площадке, поэтому никаких входных данных там нет, нужно использовать vars для тестирования
Фидель Эдуардо Лопес

1
Я думаю, что это делает этот фрагмент тогда. Это должна быть функция или полная программа, чтобы быть действительной. : /
спагетто

1
Хорошо, я сделал это функцией ..
Фидель Эдуардо Лопес

1

MATLAB: 190 152 118 байт

i=input('','s');b=sum(i=='a');c=sum(i=='o');d=b>c;disp(['C',i(2:2+b+c),'s go M',i(2:1+b)+4,repmat('o',1,b+2*c),'w'*d])

Ungolfed:

i=input('','s');
b=sum(i=='a');
c=sum(i=='o');
d=b>c;
disp(['C',i(2:2+b+c),'s go M',i(2:1+b)+4,repmat('o',1,b+2*c),'w'*d])

тесты:

caaaaaaaats
Caaaaaaaats go Meeeeeeeeoooooooow

cooooows
Cooooows go Moooooooooo

PS: Спасибо @Kenney за хорошее предложение (см. Комментарии)!


Будет ли disp( (b>0)*[...] + (c>0)*[...] )работать здесь?
Кенни

Хорошее предложение @ Кенни
brainkz

1

PHP, 138 байт

echo ucfirst($a=$argv[1]).'s go M'.(($n=substr_count($a,'a'))?str_repeat('e',$n).str_repeat('o',$n).'w':str_repeat('oo',substr_count($a,'o')));

удобочитаемый:

echo ucfirst($a = $argv[1]) . 's go M'. (
    ($n = substr_count($a, 'a'))
        ? str_repeat('e', $n) . str_repeat('o', $n) . 'w'
        : str_repeat('oo', substr_count($a, 'o'))
);

попробовал короче, но не будет работать в PHP:

#too long -- echo ucfirst($s=$argv[1]).'s go M'.(($o='o'and$n=substr_count($s,'a'))?str_repeat('e',$n).str_repeat($o,$n).'w':str_repeat('oo',substr_count($s,$o)));
#too long -- echo ucfirst($s=$argv[1]).'s go M'.(($o='o'and$f=function($s,$n){return str_repeat($s,$n);}and$n=substr_count($s,'a'))?$f('e',$n).$f($o,$n).'w':$f('oo',substr_count($s,$o)));

знак равно


1

оКТАВА, 126 , 108

Первая версия с переменными и пояснениями, 126:

L="ao"';S={'eo','oo'},e={'w',' '};a=sum(argv(){1}==L,2);b=find(a);disp([argv(){1},' goes m',vec(ones(sum(a),1)*S{b})',e{b}]);

Пояснение: L знает, какое животное содержит какое письмо. S знает, что они повторяют. конец знает. Вам нужно включить «автоматическое вещание», чтобы это работало, но оно должно быть по умолчанию во всех октавах, которые я использовал. Конечно, существуют более короткие способы, например, с помощью команды regexprep (регулярные выражения с заменой), но в ответах уже было несколько таких подходов, так что это будет скучно.


Редактирование: Пропуск переменных, которые встречаются только один раз, с использованием октавного индексирования «на лету» (не знаю, как это называется на самом деле) и добавления «i», входной строковой переменной:

i=argv(){1};a=sum(i=="ao"',2);b=find(a);disp([i,' goes m',vec(ones(sum(a),1)*{'eo','oo'}{b})',{'w',''}{b}]);

1

JavaScript (ES2015), 78 77

s=>s+'s go M'+(l=s.length-1,w=s[l]<'u',Array(l).join(w?'eo':'oo')+(w?'w':''))

Попробуйте это здесь: https://jsbin.com/guqaxejiha/1/edit?js,console


Не работает на Caaat, вывод: «Caaats go Meoeoeow и должно быть» Caaats go Meeeooow
Фидель Эдуардо Лопес

@ FidelEduardoLópez В задании не указывается порядок: «Число« е »и« о »в« мяу »должно совпадать с количеством гласных, найденных во входном слове».
Павло

Ну, я думаю, вы правы .. Смешные мяуканые кошки у вас есть :)
Фидель Эдуардо Лопес

0

Луа, 121 90 байт

121 байт

i=...r="M"o="o"s=i:len()-3if(i:find("w"))then r=r..o:rep(s*2)else r=r..("e"):rep(s)..o:rep(s).."w"end print(i.." go "..r)

90 байт

i=....." go M"o="o"s=#i-7 print(i..(i:find"w"and o:rep(s*2)or("e"):rep(s)..o:rep(s).."w"))

Принимает ввод, такой как 'Caats' или 'Coooows' с учетом регистра. Поскольку нет никаких требований для неверных входных данных, выходные данные могут быть странными, скажем, для «лис» или «волов». :П

Ungolfed

i=... .. " go M"
o="o"
s=#i-7
print(i..
         (i:find"w"and o:rep(s*2) or 
         ("e"):rep(s)..o:rep(s).."w")
      )

Обновление до 90 байт: заменена структура if-control на логические операторы, оптимизирована конкатенация строк путем добавления большего количества данных в объявлении i. Убрана скобка на i:find("w"). Интересно, что при хранении "o"в переменной при использовании сохраняется пара байтов rep, но это будет контрпродуктивно с "w"или "e". Чем больше ты знаешь.


0

Lua: 115 92 89 байт

i=...l=#i-2o="o"io.write(i,"s go M",i:find"a"and("e"):rep(l)..o:rep(l).."w"or o:rep(l*2))

принимает C[]tили в C[]wкачестве входных данных; [] = а или о. Ввод нижнего регистра приведет к результату.

длинная версия:

i=...   --"C[]t" or "C[]w"
l=#i-2  --length of input -2
o="o"   --shorten usage of "o"
io.write(i,"s go M",i:find"a"and("e"):rep(l)..o:rep(l).."w"or o:rep(l*2)) 

-- if it's a C"a"t concat "s go M" then repeat  --> Cats/Cows go M
-- "e" and then "o" l times and concat else     --> Cats go Meo
-- repeat "o" l*2 times and concat              --> Cows go Moo
-- concat "w" and output evrything              --> Cats go Meow

Пример выходов:

Caaat --> Caaats go Meeeooow
Cat   --> Cats go Meow
Cow   --> Cows go Moo

Изменить: изменено if then elseна and or. удалены ВСЕ не строковые пробелы.

Также вы можете попробовать это здесь: Запустите Lua Online, но я не мог понять, как использовать терминал, поэтому я включил его в функцию.

Изменить: изменил использование «o» и удален () из :find. кредит идет на Cyv для поиска этих оптимизаций. Добавил "s" и изменил l=#i-3наl=#i-2

С входом, включающим "s", всего 88 байт

i=...l=#i-3o="o"io.write(i," go M",i:find"a"and("e"):rep(l)..o:rep(l).."w"or o:rep(l*2))

Вход должен быть кошкой или коровой, а не кошками, коровами. И не с большой буквы. 'кошки' выводят 'кошки идут мяу' должны быть 'кошки идут мяу'
Фидель Эдуардо Лопес

@ FidelEduardoLópez Я согласен с первым, а не со вторым. В соответствии со словом, означающим «кошка», и словом, означающим «корова», кошки допускаются, но не в соответствии с входными словами catи cow. В качестве входных данных можно использовать любую заглавную букву, а значение cat или Cat должно быть допустимым
CHLM3RA

Согласен. входные данные могут использовать любую заглавную букву, но выходные данные всегда должны быть заглавными, поскольку C [] ts идут M [] w, не так ли?
Фидель Эдуардо Лопес

0

Дротик , 114 112 110 104 102 100 байт

f(s)=>s+'s go M'.padRight(s[1]=='a'?s.length+4:0,'e').padRight(2*s.length+2,'o')+(s[1]=='a'?'w':'');

Попробуйте онлайн!

  • -2 байта: изменен способ вычисления смещения u, чтобы уменьшить количество добавлений
  • -2 байта: перемещен чек на первом вставке на ширину, а не на символ
  • -6 байт: изменена проверка Корова / Кошка
  • -2 байта: избавился от назначения переменных
  • -2 байта: уменьшено количество парентезов на 2 * (длина + 1)

  • -1

    PHP, 170 164 161 157 байт

    preg_match("/(?i)c([ao]+)/",$argv[1],$e);
    $n=strlen($e[1]);
    $c=$e[1][0];
    $a=($c=="a"?("ew"):("o"));
    echo "M".str_repeat($a[0],$n).str_repeat("o",$n).$a[1]."\n";

    Принимает любую капитализацию вообще. CaAaT, coOOOwчто угодно.

    v2: на самом деле не нужно [wt] $. также исправлено char ct
    v3: все символы char ct неверны, сжатое присвоение $ a и $ e
    v4: сохранить 3 байта на $ af -> $ a
    v5: сохранить 4 байта, отключив его (не показано)


    Не понизил, но вывод неправильный: отсутствует $argv[0]."s go ". Попробуйте это preg_match("/(?i)c([ao]+)/",$x=$argv[1],$e);$a=$e[1][0]=="a"?"ew":"o";echo$x."s go M".str_repeat($a[0],$n=strlen($e[1])).str_repeat("o",$n).$a[1]."\n";(правильный вывод и 151 байт).
    Кенни
    Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
    Licensed under cc by-sa 3.0 with attribution required.