高尔夫挑战赛,麦凯


51

麦克基先生南方公园的一个人物,以他所说的一切都加上“ m'kay”而闻名。

编写一个程序或函数,将一串文本转换成Mackey先生会说的话。

麦凯安置

  • 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如果由于随机性而从未添加any ,则不能总是在字符串末尾添加m'kay。如果只有一个m'kay,即使强制存在,它也必须具有相同的出现在每个有效位置的概率。

  • 如果m'kay是后?.或者!,在m必须大写。

  • min 的数目m'kay必须在1到3之间统一选择。也就是说m'kaymm'kaymmm'kay都是所有可能的选择,每个选择的概率为0.33 ...如果必须将其大写(请参见上述规则),则m必须将其全部大写。

输入,输出

  • 输入是ASCII字符串,其中包含从ASCII Dec 32(空格)到ASCII Dec 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,麦凯,但我们需要挑战卡特曼!
级圣河

16
@steveverrill不确定在卡特曼挑战赛中使用的语言在这里可悲:P
Fatalize 2015年

1
我想在Ook中看到答案!MM'kay!但是您可能需要将此算法用于伪随机数生成器
mbomb007

3
@Fatalize:都是凯尔妈妈的错。
marinus

4
M'kay、、、?和!后面有50%的随机添加概率, ”似乎与“ 必须始终至少m'kay添加一个 ” 不兼容。请澄清一下
路易斯·门多

Answers:


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 ms或Ms,具体取决于字符是否为逗号。
      • '''kay',⍨:追加字符串'kay
      • ⍵,⍨:追加字符
      • ' ',:加一个空格。
    • (¯1+⌈?2×⍵∊',.!?')/¨:对于每个M'kay',如果其对应字符为.,!?,则以50%的机会选择它,否则以0%的机会选择它。
    • ⍉⍵⍪⍉⍪:将每个选择与其字符相匹配,
    • :按顺序列出所有简单元素(字符)。


好的,这如何强制始终添加一个?
杰里·耶利米

6
@JerryJeremiah:⍣≢重复应用该功能,直到输入与输出不匹配为止。所以,如果一个加时,输出发生变化,它停止并返回输出,如果不添加一个,输出保持不变,直到一个再次运行添加。
marinus

我以某种方式错过了。那很聪明。
杰里·耶利米

2
@DmitryGrigoryev:如果您使用传统的APL编码,则确实仅占用1个字节。
marinus

9

K5,99 90个字节

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

好吧,有人需要启动它!

使用不太理想的方法将M大写,从而节省了9个字节。

说明

{                                                                                        }  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

朱,mm'kay,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))

这将创建一个递归函数,该函数接受一个字符串并返回一个字符串。

取消+说明:

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)

较旧的版本(不重复,不需要至少一个)(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``)

最新版本具有ReferenceError:未定义
Neil

实际上,只有最旧的版本才能在Test.输入上使用。
尼尔

@Neil不应该发生的事情,对我来说很好。你可以添加你使用控制台代码
Downgoat

我将您的意见书放在括号中,然后加上后缀("Test.")
尼尔

5

Pyth, 51 50 49

感谢@Maltysen,节省了1个字节。

 fnzJsm?&O2}dK",.!?"s[d\ *hO3?xKd\M\m"'kay"d)dz0J

在线尝试。

说明及更多高尔夫活动即将推出。


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

取消高尔夫:

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]。)

取消高尔夫:

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,则为标点符号的总数,则我们不添加任何m'kay。在这种情况下,我们将拥有像这样的表达式a[0, _] ... a[i-1, _],并且我们对其进行了定义,a以便它将为的确切一个返回m'kay 0..i-1


2

Python中,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)

取消高尔夫:

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 2015年

我知道,制表符会自动转换为空格。
董里(Trang Oul)

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

绝对可以打更多的高尔夫球!

感谢Dom Hastings截断了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个字节。
Schism

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

Lua,162160字节

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)

您有听过达斯·普拉格斯(Darth Plagueis)的悲剧吗?MM'好吗?我以为不是。MMM'kay。绝地不会讲这个故事。麦凯 这是西斯的传奇。达斯·普拉格斯(Darth Plagueis)是西斯的黑暗君主,麦凯(M'kay),是如此的强大和明智,他可以利用原力来影响中毒生物创造生命……他对黑暗的一面如此了解,甚至可以保留自己所关心的那面。快要死了。MM'kay。部队的阴暗面是通往许多人认为不自然的能力的途径。MM'kay。他变得如此强大……他唯一害怕的就是失去力量,mmm'kay,最终,mm'kay当然是m'kay,他做到了。麦凯 不幸的是,他把学到的一切教给了他的徒弟,然后他的徒弟在睡觉时杀死了他。麦凯 具有讽刺意味的。他可以救死人

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.