Tantangan kode golf, m'kay

51

Mr Mackey adalah karakter South Park yang terkenal karena menambahkan "m'kay" dalam semua yang dia katakan.

Tulis sebuah program atau fungsi yang mengubah serangkaian teks menjadi sesuatu yang akan dikatakan Mr. Mackey.

Penempatan mungkin

  • m'kaymemiliki 50% kesempatan acak dari yang ditambahkan setelah tanda baca ,, ., ?dan! . Jika demikian, maka akan diikuti oleh tanda baca yang sama persis yang mendahuluinya dan didahului oleh spasi.

    Misalnya, dalam kalimat Test, test., ada dua tempat yang m'kaydapat ditambahkan: setelah koma, dan setelah periode, dengan peluang 50% di setiap tempat. Kemungkinan hasil akan Test, m'kay, test. atau Test, test. M'kay.atau Test, m'kay, test. M'kay..

  • Harus selalu ada setidaknya satu yang m'kayditambahkan . Selain itu, tidak dapat selalu berada di tempat yang sama dan setiap tempat yang valid di mana m'kaydapat ditambahkan harus terjadi dengan probabilitas yang sama. Artinya, Anda tidak dapat menambahkan m'kayselalu di akhir string jika karena keacakan Anda tidak pernah menambahkan m'kay. Jika hanya ada satu m'kay, itu harus memiliki probabilitas yang sama muncul di setiap posisi yang valid, meskipun keberadaannya ditegakkan.

  • Jika m'kaysetelah ?, .atau !, mharus ditulis dalam huruf besar.

  • Jumlah min m'kayharus dipilih secara seragam antara 1 dan 3. Yaitu m'kay,, mm'kaydan mmm'kaysemua pilihan yang mungkin, masing-masing dengan probabilitas 0,33 ... Jika itu harus dituliskan dengan huruf besar (lihat aturan di atas), semua mharus ditulis dengan huruf besar.

Input, output

  • Input adalah string ASCII yang berisi karakter dari ASCII Des 32 (Spasi) hingga ASCII Des 126 (Tilde ~). Tidak ada linebreak pada input. Anda dapat mengasumsikan bahwa input apa pun akan mengandung setidaknya satu dari , . ? !.

  • Anda dapat berasumsi bahwa tidak ada m'kayatau variannya di input.

    Input dapat diambil dari STDIN, argumen fungsi, baris perintah, atau yang serupa.

  • Output dapat melalui STDOUT, fungsi kembali, atau yang serupa.

Uji kasus

  • Memasukkan: Test.

Output yang mungkin: Test. M'kay.

  • Memasukkan: 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.

Output yang mungkin: 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.

  • Memasukkan: Drugs are bad, so, if you do drugs, you're bad, because drugs are bad. They can hurt your body, cause drugs are bad.

Output yang mungkin: 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.

  • Memasukkan: Do you understand? Really? Good!

Output yang mungkin: Do you understand? MM'kay? Really? Good! MMM'kay!

Mencetak gol

Ini , jadi kode terpendek dalam byte menang, m'kay?

Fatalisasi
sumber
10
+1, M'kay, tapi kita butuh tantangan Cartman!
Level River St
16
@steveverrill tidak yakin bahasa dalam tantangan Cartman akan diterima di sini dengan sedih: P
Fatalize
1
Saya ingin melihat jawaban dalam Ook! Boleh! Tetapi Anda mungkin ingin menggunakan algoritme ini untuk pembangkit angka pseudo-acak .
mbomb007
3
@Fatalize: Ini semua salah ibu Kyle.
marinus
4
" M'kaymemiliki peluang acak 50% untuk ditambahkan setelah tanda baca ,,.,? dan! " tampaknya tidak sesuai dengan " Selalu harus ada setidaknya satu m'kaytambahan ". Tolong jelaskan itu
Luis Mendo

Jawaban:

13

CJam, 65 52 49 byte

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

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

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.
Dennis
sumber
22

APL (66)

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

Hasil 10 berjalan:

      ↑ ({∊⍉⍵⍪⍉⍪(¯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?   

Penjelasan:

  • {... }⍣≢: terapkan fungsi ke input sampai nilainya berubah
    • Buat a M'kayuntuk setiap karakter:
    • {... }¨⍵: untuk setiap karakter dalam input:
      • 'mM'[1+⍵≠',']/⍨?3: menghasilkan 1 hingga 3 mdtk atau Mdtk tergantung pada apakah karakternya koma atau bukan.
      • '''kay',⍨: tambahkan string 'kay.
      • ⍵,⍨: tambahkan karakter
      • ' ',: tambahkan spasi.
    • (¯1+⌈?2×⍵∊',.!?')/¨: untuk masing-masing M'kay', jika karakter yang sesuai adalah salah satu .,!?, pilih dengan peluang 50%, jika tidak pilihlah dengan peluang 0%.
    • ⍉⍵⍪⍉⍪: cocokkan setiap pilihan dengan karakternya,
    • : daftarkan semua elemen sederhana (karakter) secara berurutan.
marinus
sumber
Ok, bagaimana ini menegakkan bahwa selalu ada satu yang ditambahkan?
Jerry Jeremiah
6
@ JerryJeremiah: ⍣≢menerapkan fungsi berulang kali hingga input tidak sesuai dengan output. Jadi jika ada yang ditambahkan, output berubah dan berhenti dan mengembalikan output, dan jika salah satu tidak ditambahkan, output tetap tidak berubah dan berjalan lagi sampai satu ini menambahkan.
marinus
Aku rindu itu entah bagaimana. Itu sangat pintar.
Jerry Jeremiah
2
@DmitryGrigoryev: jika Anda menggunakan pengkodean APL tradisional, itu memang hanya membutuhkan 1 byte.
marinus
9

K5, 99 90 byte

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

Nah, seseorang perlu memulai ini!

Disimpan 9 byte dengan menggunakan metode yang tidak terlalu mewah untuk melapisi M.

Penjelasan

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

Versi 99 byte

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

Julia, mm'kay, 115 114 byte

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

Ini menciptakan fungsi rekursif yang menerima string dan mengembalikan string.

Penjelasan + tidak dikumpulkan:

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

Saya tidak suka South Park, tetapi sensasi golf terlalu menggoda untuk melewatkan ini. Terima kasih kepada KRyan untuk menyederhanakan regex, menghemat 1 byte.

Alex A.
sumber
6

JavaScript ES6, 79 86 108 byte

Ternyata membuat Mpengulangan membutuhkan banyak byte.

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

Versi lama (tidak diulang) (86 byte)

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

Versi yang lebih lama (tidak diulang, tidak memerlukan setidaknya satu m'kay) (79 byte) :

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

Versi tertua:

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``)
Downgoat
sumber
Versi terbaru memiliki ReferenceError: t tidak didefinisikan
Neil
Hanya versi tertua yang benar-benar berfungsi pada Test.input.
Neil
@Neil yang seharusnya tidak terjadi, bekerja dengan baik untuk saya. Bisakah Anda menambahkan kode yang Anda gunakan di konsol
Downgoat
Saya bungkus kiriman Anda dalam tanda kurung dan kemudian sufiks ("Test.").
Neil
5

Pyth, 51 50 49

Disimpan 1 byte berkat @Maltysen.

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

Cobalah online.

Penjelasan & lebih banyak golf segera hadir.

PurkkaKoodari
sumber
4

C, 170 byte

Retak pertama untuk itu:

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

Tidak Disatukan:

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! */
}
Cole Cameron
sumber
4

Scala, 191 byte

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)
triggerNZ
sumber
3

Mathematica, 202 byte

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}]&

Jeda baris ditambahkan agar mudah dibaca. Mengevaluasi fungsi anonim yang menggunakan string sebagai argumen. ( adalah singkatan untuk \[Function].)

Tidak Disatukan:

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

hmengambil char tanda baca dan membuatnya " m'kay,", " mm'kay,", dll secara acak dan dikapitalisasi tepat.

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

fmengambil string dan mencari karakter tanda baca apa pun x; ketika menemukannya, itu berhasil dengan probabilitas 50% sesuai h[x], dan 50% ekspresi seperti a[3, x]. Ini juga memperbarui ijumlah tanda baca yang diganti (dengan kedua kasus). Jadi f["X, x."]mungkin mengevaluasi

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

Akhirnya, gakan berurusan dengan a.

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

Countakan menghitung berapa banyak yang akita masukkan ke sana; jika sama dengan i, jumlah total tanda baca, maka kami tidak menambahkan m'kays. Dalam hal ini, kami akan memiliki ekspresi seperti a[0, _] ... a[i-1, _], dan kami mendefinisikan asehingga akan mengembalikan satu untuk satu saja 0..i-1.

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

Tidak Disatukan:

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)
Trang Oul
sumber
Lekukan Anda tampaknya cukup kacau: /
jazzpi
Saya tahu, tab secara otomatis dikonversi ke spasi.
Trang Oul
2

> <>, 150 byte

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 byte terbuang, tapi aku sudah bosan mencoba mengatur ulang itu. Juga, pengacakan dalam Funge sulit untuk golf -.-

Sok
sumber
2

Perl, 93 89 88 byte

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

Pasti bisa bermain golf lagi!

4 byte dipotong berkat Dom Hastings

Jarmex
sumber
2

C ++ 290

Solusi saya

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

Variabel Penjelasan z menentukan tanda baca dan z = 0 yang menunjukkan penggunaan 'm' daripada 'M'.

Uji

int main()
{
int x=5;
while(x--){
string S("Do you understand? Really? Good! Yes, I do.");
M(S);
cout<<endl;
}
return 0;
}
bacchusbeale
sumber
string::npos=> -1atau ~0. Memilih ~0memungkinkan Anda menggunakan -alih-alih !=; sehingga kondisional menjadi if(z-~0&&r), menghemat 11 byte.
Skisma
1

JavaScript ES6, 121 byte

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

Gangguan jika string yang diberikan tidak mengandung tanda baca yang cocok.

Neil
sumber
1

Lua, 162 160 byte

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)

Apakah Anda pernah mendengar tragedi Darth Plagueis The Wise? Boleh? Saya pikir tidak. MMM'kay. Ini bukan cerita yang akan diceritakan Jedi padamu. Boleh. Itu adalah legenda Sith. Darth Plagueis adalah Pangeran Kegelapan Sith, m'kay, begitu kuat dan begitu bijak sehingga dia bisa menggunakan the Force untuk memengaruhi para midichlorian untuk menciptakan kehidupan ... Dia memiliki pengetahuan tentang sisi gelap sehingga dia bahkan bisa mempertahankan yang dia pedulikan. tentang dari sekarat. Boleh. Sisi gelap the Force adalah jalur menuju banyak kemampuan yang oleh beberapa orang dianggap tidak wajar. Boleh. Dia menjadi sangat kuat ... satu-satunya yang dia takuti adalah kehilangan kekuatannya, mmm'kay, yang akhirnya, mm'kay, tentu saja, m'kay, dia melakukannya. Boleh. Sayangnya, dia mengajar muridnya segala yang dia tahu, lalu muridnya membunuhnya dalam tidurnya. Boleh. Ironis. Dia bisa menyelamatkan orang lain dari kematian,

Pengobrol
sumber