コードゴルフチャレンジ、m'kay


51

マッキー氏は、彼が言うことすべてに「m'kay」を追加することで有名なサウスパークのキャラクターです。

一連のテキストをMackey氏が言うようなものに変換するプログラムまたは関数を作成します。

M'kay配置

  • m'kay持っているランダムな50%の確率で追加されたの句読点の後に,.?!。その場合、その前にスペースが続く正確に同じ句読点が続きます。

    たとえば、文Test, test.m'kayは、追加できる場所が2つあります。カンマの後とピリオドの後に、それぞれの場所で50%のチャンスがあります。可能な結果はになりますTest, m'kay, test。またはTest, test. M'kay.またはTest, m'kay, test. M'kay.

  • 常に少なくとも1つm'kay追加する必要があります。さらに、常に同じ場所にあるとは限らず、m'kay追加できる有効な各場所は同じ確率で発生する必要があります。つまりm'kay、ランダム性のためにを追加したことがない場合、文字列の最後に常に追加することはできませんm'kay。が1つしかない場合m'kay、その存在は強制されますが、各有効な位置に現れる同じ確率を持たなければなりません。

  • 場合m'kayの後で?.または!m大文字にする必要があります。

  • min の数は、m'kay1から3の間で均一に選択する必要があります。つまりm'kaymm'kayおよびmmm'kayはすべて可能性のある選択肢であり、それぞれ確率0.33 ... mがあります。

入力、出力

  • 入力は、ASCII Dec 32(スペース)からASCII Dec 126(ティルデ~)までの文字を含むASCII文字列です。入力に改行はありません。入力には少なくとも1つが含まれると想定できます, . ? !

  • 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
15年

1
Ookで答えが見たい!うん!ただし、このアルゴリズムを疑似乱数ジェネレーターに使用することをお勧めします。
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秒またはMs を生成します。
      • '''kay',⍨:文字列を追加します'kay
      • ⍵,⍨:文字を追加します
      • ' ',:スペースを追加します。
    • (¯1+⌈?2×⍵∊',.!?')/¨:各M'kay'について、対応する文字がの場合、.,!?50%の確率で選択し、そうでない場合は0%の確率で選択します。
    • ⍉⍵⍪⍉⍪:各選択をその文字と一致させ、
    • :すべての単純な要素(文字)を順番にリストします。


わかりました、これは常に追加されたものがあることをどのように強制しますか?
ジェリージェレミア

6
@JerryJeremiah:⍣≢入力が出力と一致しなくなるまで、関数を繰り返し適用します。1が追加されている場合は、出力が変更され、それが停止し、出力を返し、1が追加されていない場合、出力は変わらず、1がするまで、それが再び実行されている追加します。
マリヌス

どういうわけかそれを見逃した。それはとても賢いです。
ジェリーエレミヤ

2
@DmitryGrigoryev:従来のAPLエンコーディングを使用する場合、実際には1バイトしかかかりません。
マリヌ

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

これにより、文字列を受け入れて文字列を返す再帰関数が作成されます。

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

私はサウスパークが嫌いですが、ゴルフのスリルはこれを渡すには魅力的すぎました。正規表現を簡素化し、1バイトを節約してくれたKRyanに感謝します。


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)

古いバージョン(繰り返さず、少なくとも1つは必要ありません)(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があります:tは定義されていません
ニール

実際には、最も古いバージョンのみがTest.入力に対して機能します。
ニール

起こるべきではない@Neilは、私にとっては問題なく動作します。コンソールで使用しているコードを追加できますか?
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);}

ゴルフをしていない:

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], ""] &))

Countaそこにいくつのを入れるかを数えます。i句読点の総数である場合、m'kaysは追加しませんでした。この場合、のような式がありa[0, _] ... a[i-1, _]、のa1つに対して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

タブは自動的にスペースに変換されました。
トランオウル

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バイトを節約します。
分裂

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 The Wiseの悲劇を聞いたことがありますか?うん 思わなかった。うん それはジェダイがあなたに語る物語ではありません。大丈夫。それはシスの伝説です。ダース・プラゲスはシスの暗黒Lordでした。とても強力で賢く、彼はフォースを使ってミディクロリアンに影響を与えて生命を作り出しました…死にかけているから。うん フォースのダークサイドは、一部の人が不自然だと考える多くの能力への道です。うん 彼はとてもパワフルになりました...彼が恐れていた唯一のことは、彼の力を失うことでした。大丈夫。残念なことに、彼は見習いに彼が知っていたすべてを教えました、そして、彼の見習いは彼の睡眠で彼を殺しました。大丈夫。皮肉。彼は他の人を死から救うことができた、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.