Код гольф-вызов, хорошо


51

Мистер Макки - персонаж из Южного парка, хорошо известный тем, что он добавляет «m'kay» во все, что он говорит.

Напишите программу или функцию, которая преобразует строку текста в то, что сказал бы мистер Макки.

M'kay размещение

  • m'kayимеет случайный 50% шанс того , чтобы быть добавлен после пунктуации ,, ., ?и! . Если это так, за ним будет следовать точно такой же знак пунктуации, который стоит перед ним и перед ним стоит пробел.

    Например, в предложении можно добавить Test, test.два места m'kay: после запятой и после точки с вероятностью 50% в каждом месте. Возможные результаты будут Test, m'kay, test. или Test, test. M'kay.или Test, m'kay, test. M'kay..

  • Всегда должен быть хотя бы один m'kayдобавленный . Более того, оно не всегда может быть в одном и том же месте, и каждое действительное место, где m'kayего можно добавить, должно происходить с равной вероятностью. То есть вы не можете m'kayвсегда добавлять в конце строки, если из-за случайности вы никогда не добавляли ни одного m'kay. Если есть только один m'kay, он должен иметь одинаковую вероятность появления в каждой действительной позиции, даже если его присутствие является обязательным.

  • Если m'kayпосле ?, .или !, mдолжен быть в верхнем регистре.

  • Количество mв m'kayдолжно быть uniformely выбрал между 1 и 3. То есть m'kay, mm'kayи mmm'kayесть все возможные варианты, каждый из которых с вероятностью 0,33 ... Если он должен быть в верхнем регистре (см выше правила), все mдолжно быть в верхнем регистре.

Входы, выходы

  • Входными данными являются строки ASCII, содержащие символы от ASCII дек 32 (пробел) до ASCII дек 126 (тильда ~). На входе нет разрывов строк. Вы можете предположить, что любой вход будет содержать хотя бы один из , . ? !.

  • Вы можете предположить, что m'kayна входе нет ни одного из вариантов.

    Входные данные могут быть взяты из STDIN, аргументов функции, командной строки или чего-либо подобного.

  • Вывод может быть через STDOUT, возврат функции или что-то подобное.

Контрольные примеры

  • Входные данные: Test.

Возможный вывод: Test. M'kay.

  • Входные данные: Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.

Возможный вывод: Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. MMM'kay. It's 100% free, mm'kay, no registration required.

  • Входные данные: Drugs are bad, so, if you do drugs, you're bad, because drugs are bad. They can hurt your body, cause drugs are bad.

Возможный вывод: Drugs are bad, m'kay, so, if you do drugs, you're bad, m'kay, because drugs are bad. They can hurt your body, m'kay, cause drugs are bad. M'kay.

  • Входные данные: Do you understand? Really? Good!

Возможный вывод: Do you understand? MM'kay? Really? Good! MMM'kay!

счет

Это , поэтому выигрывает самый короткий код в байтах, ладно?


10
+1, хорошо, но нам нужен вызов Картмана!
Уровень Река St

16
@steveverrill не уверен, что язык в тесте Картмана был бы здесь приемлемым, к сожалению: P
Fatalize

1
Я хочу увидеть ответ в Ook! MM'kay! Но вы, вероятно, захотите использовать этот алгоритм для генератора псевдослучайных чисел .
mbomb007

3
@Fatalize: Это все вина мамы Кайла.
Маринус

4
« M'kayвероятность случайного добавления 50% после знаков препинания,.,? и! » кажется несовместимой с « всегда должен быть хотя бы один m'kayдобавленный ». Пожалуйста, уточните, что
Луис Мендо,

Ответы:


13

CJam, 65 52 49 байтов

l{_{_",.?!"#:IW>)mr{SI'M'm?3mr)*"'kay"3$}&}%_@=}g

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

Как это устроено

l            e# Read a line from STDIN.
{            e# Do:
  _          e#   Duplicate the line.
  {          e#   For each of its characters:
    _",.?!"# e#     Find its index in that string.
    :IW>     e#     Save the index in I and check if it's greater than -1.
    )        e#     Add 1 to the resulting Boolean.
     mr      e#     Pseudo-randomly select a non-negative integer below that sum.
             e#     If I == -1 the result will always be 0.
    {        e#     If the result is 1:
      S      e#       Push a space.
      I'M'm? e#       Select 'm' if I == 0 (comma) and 'M' otherwise.
      3mr)   e#       Pseudo-randomly select an integer in [1 2 3].
      *      e#       Repeat the M that many times.
      "'kay" e#       Push that string. MMM'kay.
      3$     e#       Copy the proper punctuation.
    }&       e#
  }%         e#
  _          e#   Copy the resulting array.
  @=         e#   Compare it to the copy from the beginning.
}g           e# Repeat the loop while the arrays are equal.
             e# This makes sure that there's at least one m'kay. M'kay.

22

APL (66)

{∊⍉⍵⍪⍉⍪(¯1+⌈?2×⍵∊',.!?')/¨{' ',⍵,⍨'''kay',⍨'mM'[1+⍵≠',']/⍨?3}¨⍵}⍣≢

Результат 10 заездов:

      ↑ ({∊⍉⍵⍪⍉⍪(¯1+⌈?2×⍵∊',.!?')/¨{' ',⍵,⍨'''kay',⍨'mM'[1+⍵≠',']/⍨?3}¨⍵}⍣≢)¨ 10/⊂'Test, test. Test! Test?'
Test, m'kay, test. Test! Test?                  
Test, test. M'kay. Test! MMM'kay! Test? M'kay?  
Test, mm'kay, test. Test! MM'kay! Test? MM'kay? 
Test, mmm'kay, test. Test! Test? M'kay?         
Test, mm'kay, test. Test! Test? M'kay?          
Test, test. MM'kay. Test! Test? MMM'kay?        
Test, test. MMM'kay. Test! MMM'kay! Test? M'kay?
Test, test. Test! MM'kay! Test?                 
Test, mm'kay, test. M'kay. Test! Test?          
Test, test. MM'kay. Test! MM'kay! Test?   

Объяснение:

  • {... }⍣≢: применять функцию к входу, пока значение не изменится
    • Создайте M'kayдля каждого персонажа:
    • {... }¨⍵: для каждого символа на входе:
      • 'mM'[1+⍵≠',']/⍨?3: генерировать от 1 до 3 mс или Mс в зависимости от того, был ли символ запятой или нет.
      • '''kay',⍨: добавить строку 'kay.
      • ⍵,⍨: добавить символ
      • ' ',: поставить пробел
    • (¯1+⌈?2×⍵∊',.!?')/¨: для каждого M'kay', если соответствующий ему символ является одним из .,!?, выберите его с вероятностью 50%, в противном случае выберите его с вероятностью 0%.
    • ⍉⍵⍪⍉⍪: сопоставить каждый выбор с его характером,
    • : перечислить все простые элементы (символы) по порядку.


Хорошо, как это обеспечивает, что всегда добавляется один?
Джерри Иеремия

6
@JerryJeremiah: ⍣≢применяет функцию несколько раз, пока ввод не совпадет с выводом. Таким образом, если один из них добавлен, выходные данные изменяются, и он останавливается и возвращает выходные данные, а если один из них не добавляется, выходные данные остаются неизменными и снова запускаются до тех пор, пока один из них не будет добавлен.
Марин

Я как-то пропустил это. Это очень умно.
Джерри Иеремия

2
@DmitryGrigoryev: если вы используете традиционную кодировку APL, она действительно занимает всего 1 байт.
Маринус

9

К5, 99 90 байт

{f::0;{x;~f}{,/{f::f|r:(*1?2)&#&",.?!"=x;x,("";" ",((1+1?3)#"Mm"@x=","),"'kay",x)@r}'x}/x}

Ну, кто-то должен был начать это!

Сохранено 9 байт с использованием менее изящного метода верхнего регистра M.

объяснение

{                                                                                        }  Define a function
 f::0;                                                                                      Set `f` (used to determine when to stop) to 0.
      {x;~f}{                                                                         }/x   While `f` is 0 (no "m'kay"s have been inserted), loop over the string argument
               {                                                                   }'x      For each character in the string
                       (*1?2)&#&",.?!"=x                                                    If we are at a punctuation character, generate a random number between 0 and 1
                     r:                                                                     and assign it to `r`
                f::f|                                                                       If the number is one, an "m'kay" will be inserted, so the outer while loop should exit after this
                                                            "Mm"@x=","                      If the punctuation is a comma, then use a lowecase `m`, otherwise use `M`
                                                    (1+1?3)#                                Repeat the `m` between 1 and 3 times
                                               " ",(                  ),"'kay",x            Join the "m'kay" string to the punctuation and prepend a space
                                         x,("";                                 )@r         If the random number is 1, append the "m'kay" string, to the current string
             ,/                                                                             Join the resulting string

99-байтовая версия

{f::0;{x;~f}{,/{f::f|r:(*1?2)&#&",.?!"=x;x,("";" ",((1+1?3)#`c$(-32*~","=x)+"m"),"'kay",x)@r}'x}/x}

7

Юлия, мм'кей, 115 114 байтов

f(s)=(R=replace(s,r"[,.?!]",r->r*(" "*(r==","?"m":"M")^rand(1:3)*"'kay"*r)^rand(0:1));ismatch(r"m'kay"i,R)?R:f(R))

Это создает рекурсивную функцию, которая принимает строку и возвращает строку.

Ungolfed + объяснение:

function f(s)
    # Replace occurrences of punctuation using random repeats
    R = replace(s, r"[,.?!]", r -> r*(" " * (r == "," ? "m" : "M")^rand(1:3) * "'kay" * r)^rand(0:1))

    # Check whether anything was replaced
    if ismatch(r"m'kay"i, R)
        # If so, return the replaced string
        R
    else
        # Otherwise recurse
        f(R)
    end
end

Мне не нравится Южный парк, но острые ощущения от гольфа были слишком соблазнительными, чтобы упустить это из виду. Спасибо KRyan за упрощение регулярных выражений, сохранение 1 байта.


6

JavaScript ES6, 79 86 108 байт

Оказывается, выполнение Mповторения занимает много байтов.

(s,z=Math.random)=>s.replace(/([!?.,])/g,l=>z(t=t+1)>=.5||t?` ${(l==','?'m':'M').repeat(0|z()*3+1)}'kay`+l:l)

Старая версия (не повторяется) (86 байт)

(s,t=1)=>s.replace(/([!?.,])/g,l=>Math.random()>=.5||--t?` ${l==','?'m':'M'}'kay`+l:l)

Старая версия (не повторяется, не требует хотя бы одного m'kay) (79 байт) :

s=>s.replace(/([!?.,])/g,l=>~~(Math.random()*2)?l+` ${l==','?'m':'M'}'kay`+l:l)

Самая старая версия:

s=>(r=t=>t.replace(/([!?.])/,"$1 M'kay$1").replace(/,/,", m'kay,"),r(s),[for(i of s)~~(Math.random()*2)?r(i):i].join``)

В последней версии есть ошибка ReferenceEr: t не определено
Нейл

Только самая старая версия на самом деле работает на Test.входе.
Нил

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

Я заключаю ваше представление в скобки, а затем добавляю ("Test.")к нему суффикс .
Нил


4

C 170 байт

Первый треск на это:

n;main(r,v,p)char**v,*p;{for(srand(time(0)),p=v[1];r=rand(),*p;p++)if(strchr(".,?!",putchar(*p))&&r%2||(!*(p+1)&&!n))n=printf(" %.*s'kay%c",r/2%3+1,*p%4?"MMM":"mmm",*p);}

Ungolfed:

n;
main(r,v,p)
char**v,*p;
{
    for(srand(time(0)), p=v[1]; r=rand(), *p; p++) /* loop through string */
        if(strchr(".,?!",putchar(*p)) /* print the char, check if punctuation */
            && r % 2 /* should we say it? */
            || (!*(p+1) && !n)) /* If this is the end of the string and we haven't M'kay'd, then do it now */
            n=printf(" %.*s'kay%c", r/2%3+1, *p%4 ? "MMM" : "mmm", *p); /* say it! */
}

4

Scala, 191 байт

var(r,s,a,o)=(util.Random,readLine,1>2,"")
while(!a){o=""
for(c<-s)o+=(if(",.?!".contains(c)&&r.nextBoolean){a=2>1
s"$c ${(if(c==46)"M"else"m")*(1+r.nextInt(3))}'kay$c"}else s"$c")}
print(o)

3

Mathematica, 202 байта

i=0;r=Random;x=r[];
h=" "<>If[#==",","m","M"]~Table~{Ceiling[3r[]]}<>"'kay"<>#&;
(ee/.a:>(If[e~Count~a@__==i&&#==Floor[x*i],h@#2,""]&))@
StringReplace[#,x:","|"."|"?"|"!":>x~~RandomChoice@{i++~a~x,h@x}]&

Добавлены разрывы строк для удобства чтения. Оценивает анонимную функцию, принимающую строку в качестве аргумента. ( сокращение от \[Function].)

Ungolfed:

h[x_]:=" " <> Table[
    If[x==",", "m", "M"],
    { Ceiling[3 Random[]] }
] <> "'kay" <> x;

hпринимает знаки препинания полукокса и делает его " m'kay,", " mm'kay,"и т.д. случайным образом и капитализированные соответствующим образом .

f[s_] := (i = 0;
   StringReplace[s, 
    x : "," | "." | "?" | "!" :> 
     x ~~ RandomChoice[{a[i++, x], h[x]}]]);

fберет строку и ищет любой знак пунктуации x; когда он его находит, он с вероятностью 50% прибегает к соответствующему h[x], а на 50% - к подобному выражению a[3, x]. Также обновляется iобщее количество замененных знаков препинания (в обоих случаях). Так что f["X, x."]может оценить

"X," ~~ h[","] ~~ " x." ~~ a[1, "."]           ...which might expand to
"X, mmm'kay, x." ~~ a[1, "."]                  , and i would equal 2

Наконец, gразберемся с aх.

g[expr_] := (r = Random[]; 
  expr /. a -> (If[Count[expr, a[__]] == i && # == Floor[r*i], h[#2], ""] &))

Countпосчитаем, сколько aмы туда положим; если оно равно iобщему количеству знаков препинания, то мы не добавляли ни одного мейкаса. В этом случае у нас будут выражения типа a[0, _] ... a[i-1, _], и мы определим, aчтобы он возвращал m'kay точно для одного из 0..i-1.


2

Питон, 173 168 156

from random import randint as R
    m,k,s,C="mM","'kay",input(),0
    while C<1:
        S=""
        for c in s:r=R(0,c in",.!?");C+=r;S+=c+(' '+m[c!=","]*R(1,3)+k+c)*r
    print(S)

Ungolfed:

from random import randint
m, kay = "mM", "'kay"
string = input()
count = 0
while count < 1: #at least one occurrence
    newString= ""
    for char in s:
        rm  = randint(1,3) #number of "m"
        rmk = randint(0, char in ",.!?") #occurrence of "m'kay"
        count += rmk
        newString += char + (' ' + m[c != ","] * rm + kay + char) * rmk
print(newString)

Ваш абзац кажется довольно запутанным: /
jazzpi

Я знаю, вкладки автоматически конвертируются в пробелы.
Транг Оул

2

> <>, 150 байт

i:0(?v
r0&v >
?v~>:0(?v::o1[:::",.?!"{=${=+${=+r=+]
>x~^    >&:0)?;&"."14.
v>&1+&1[:","=&"yak'"&84**"M"+
 >  >84*v
>x::^>22 .
 >: ^]
ol0=?^  >

13 потраченных впустую байтов, но мне стало немного скучно, пытаясь изменить его. Кроме того, случайность в Funge трудно в гольф.


2

Perl, 93 89 88 байт

$_=$0=<>;s/[.?!]|(,)/$&.($".($1?"m":M)x(1+rand 3)."'kay$&")[rand 2]/ge while$0eq$_;print

Определенно можно играть в гольф еще!

4 байта отрезаны благодаря Дому Гастингсу


2

C ++ 290

Мое решение

void M(string x){
srand(rand());
string p(",.?!");
char c=0,m='m',n='M';
int r=0;
size_t z=0;
for(size_t i=0;i<x.size();i++)
{
c=x[i];cout<<c;
z=p.find(c);
r=rand()%2;
if(z!=string::npos&&r)
{
cout<<' ';
c=(z?n:m);
r=rand()%3+1;
while(r--){cout<<c;}
cout<<"\'kay";
}
}
}

Поясняющая переменная z определяет, какой знак пунктуации и z = 0 указывают на использование «m» вместо «M».

Контрольная работа

int main()
{
int x=5;
while(x--){
string S("Do you understand? Really? Good! Yes, I do.");
M(S);
cout<<endl;
}
return 0;
}

string::npos=> -1или ~0. Выбор ~0позволяет использовать -вместо !=; так что условно становится if(z-~0&&r), экономя 11 байт.
Раскол

1

JavaScript ES6, 121 байт

(s,r=Math.random,f=t=>t==s?f(s.replace(/[!?.,]/g,m=>r()<.5?m:m+" "+(m==","?"mmm":"MMM").slice(r()*3)+"'kay"+m)):t)=>f(s)

Сбои, если данная строка не содержит подходящей пунктуации.


1

Луа, 162 160 байт

r=math.random;s,m=io.read()repeat m=s:gsub("([,.?!])",function(p)return p..(r()>.5 and" "..(p==","and"m"or"M"):rep(r(1)).."'kay"..p or"")end)until s~=m;print(m)

Вы когда-нибудь слышали трагедию Дарта Чума Мудрого? MM'kay? Я думал, что нет. MMM'kay. Это не история, которую джедай расскажет вам. M'kay. Это легенда ситхов. Дарт Плагейс был Темным Лордом Ситхов, так хорошо, настолько могущественным и мудрым, что он мог использовать Силу, чтобы влиять на мидихлорианов, чтобы создать жизнь ... У него было такое знание темной стороны, что он мог даже сохранить тех, кого он заботился о смерти MM'kay. Темная сторона Силы - это путь ко многим способностям, которые некоторые считают неестественными. MM'kay. Он стал таким могущественным ... единственное, чего он боялся, это потерять свою силу, ммм'кей, что, в конце концов, ммкей, конечно, м'кей, он и сделал. M'kay. К сожалению, он научил своего ученика всему, что знал, затем его ученик убил его во сне. M'kay. Иронический. Он мог спасти других от смерти,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.