Một thử thách golf mã, m'kay


51

Ông Mackey là một nhân vật South Park nổi tiếng với việc thêm "m'kay" vào mọi thứ ông nói.

Viết chương trình hoặc chức năng biến đổi một chuỗi văn bản thành thứ mà ông Mackey sẽ nói.

Vị trí của M'kay

  • m'kay50% cơ hội ngẫu nhiên bị thêm sau khi punctuations ,, ., ?! . Nếu đó là trường hợp, nó sẽ được theo sau bởi dấu chấm câu chính xác tương tự trước nó và được đặt trước một khoảng trắng.

    Ví dụ, trong câu Test, test., có hai nơi m'kaycó thể được thêm vào: sau dấu phẩy và sau khoảng thời gian, với 50% cơ hội ở mỗi nơi. Kết quả có thể sẽ được Test, m'kay, test. hoặc Test, test. M'kay.hoặc Test, m'kay, test. M'kay..

  • Luôn phải có ít nhất một m'kaybổ sung . Hơn nữa, nó không thể luôn luôn ở cùng một nơi và mỗi nơi hợp lệ m'kaycó thể được thêm vào phải xảy ra với xác suất như nhau. Đó là, bạn không thể thêm m'kayluôn ở cuối chuỗi nếu vì ngẫu nhiên bạn không bao giờ thêm bất kỳ m'kay. Nếu chỉ có một m'kay, nó phải có cùng xác suất xuất hiện ở mỗi vị trí hợp lệ, mặc dù sự hiện diện của nó được thi hành.

  • Nếu m'kaylà sau ?, .hoặc !, mphải được cấp trên.

  • Số lượng mtrong m'kayphải được uniformely chọn giữa 1 và 3. Nghĩa là, m'kay, mm'kaymmm'kayđều là những lựa chọn có thể, mỗi với xác suất 0.33 ... Nếu nó phải được uppercased (xem phần trên nguyên tắc), tất cả mphải được uppercased.

Đầu vào, đầu ra

  • Đầu vào là các chuỗi ASCII chứa các ký tự từ ASCII 32 tháng 12 (Dấu cách ~) đến ASCII Dec 126 (Tilde ). Không có ngắt dòng trong đầu vào. Bạn có thể giả định rằng bất kỳ đầu vào sẽ chứa ít nhất một trong số đó , . ? !.

  • Bạn có thể cho rằng không có m'kayhoặc có bất kỳ biến thể nào của nó trong đầu vào.

    Đầu vào có thể được lấy từ STDIN, đối số chức năng, dòng lệnh hoặc bất cứ thứ gì tương tự.

  • Đầu ra có thể thông qua STDOUT, trả về hàm hoặc một cái gì đó tương tự.

Các trường hợp thử nghiệm

  • Đầu vào: Test.

Sản lượng có thể: Test. M'kay.

  • Đầu vào: 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.

Sản lượng có thể: 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.

  • Đầu vào: Drugs are bad, so, if you do drugs, you're bad, because drugs are bad. They can hurt your body, cause drugs are bad.

Sản lượng có thể: 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.

  • Đầu vào: Do you understand? Really? Good!

Sản lượng có thể: Do you understand? MM'kay? Really? Good! MMM'kay!

Chấm điểm

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng, phải không?


10
+1, M'kay, nhưng chúng tôi cần một thử thách Cartman!
Cấp sông St

16
@steveverrill không chắc chắn ngôn ngữ trong một thử thách Cartman sẽ được chấp nhận ở đây một cách đáng buồn: P
Fatalize

1
Tôi muốn xem một câu trả lời trong Ook! MM'kay! Nhưng có lẽ bạn sẽ muốn sử dụng thuật toán này cho trình tạo số giả ngẫu nhiên .
mbomb007

3
@Firthize: Tất cả là lỗi của mẹ Kyle.
marinus

4
" M'kayCó 50% cơ hội được thêm ngẫu nhiên sau các dấu chấm ,,.,? Và! " dường như không tương thích với " Luôn phải có ít nhất một lần m'kaythêm ". Vui lòng làm rõ điều đó
Luis Mendo

Câu trả lời:


13

CJam, 65 52 49 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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}¨⍵}⍣≢

Kết quả của 10 lần chạy:

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

Giải trình:

  • {... }⍣≢: áp dụng chức năng cho đầu vào cho đến khi giá trị thay đổi
    • Tạo một M'kaycho mỗi nhân vật:
    • {... }¨⍵: cho mỗi ký tự trong đầu vào:
      • 'mM'[1+⍵≠',']/⍨?3: tạo 1 đến 3 mgiây hoặc Ms tùy thuộc vào việc ký tự có phải là dấu phẩy hay không.
      • '''kay',⍨: nối chuỗi 'kay.
      • ⍵,⍨: nối thêm nhân vật
      • ' ',: chuẩn bị một không gian.
    • (¯1+⌈?2×⍵∊',.!?')/¨: cho mỗi M'kay', nếu ký tự tương ứng của nó là một trong số đó .,!?, hãy chọn nó với 50% cơ hội, nếu không hãy chọn nó với 0% cơ hội.
    • ⍉⍵⍪⍉⍪: khớp từng lựa chọn với đặc tính của nó,
    • : liệt kê tất cả các yếu tố đơn giản (ký tự) theo thứ tự.


Ok, làm thế nào để thực thi rằng luôn có một bổ sung?
Jerry Jeremiah

6
@JerryJeremiah: ⍣≢áp dụng chức năng nhiều lần cho đến khi đầu vào không khớp với đầu ra. Vì vậy, nếu một cái được thêm vào, đầu ra được thay đổi và nó dừng lại và trả về đầu ra, và nếu không được thêm vào, đầu ra vẫn không thay đổi và nó chạy lại cho đến khi một cái được thêm vào.
bến tàu

Tôi đã bỏ lỡ điều đó bằng cách nào đó. Điều đó rất thông minh.
Jerry Jeremiah

2
@DmitryGrigoryev: nếu bạn sử dụng mã hóa APL truyền thống, thực sự chỉ mất 1 byte.
bến tàu

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}

Chà, ai đó cần phải khởi động cái này!

Đã lưu 9 byte bằng cách sử dụng một phương pháp ít ưa thích hơn so với chữ M.

Giải trình

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

Phiên bản 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}

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

Điều này tạo ra một hàm đệ quy chấp nhận một chuỗi và trả về một chuỗi.

Ungolfed + giải thích:

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

Tôi không thích South Park, nhưng sự hồi hộp của golf quá hấp dẫn để vượt qua điều này. Cảm ơn KRyan vì đã đơn giản hóa một regex, tiết kiệm 1 byte.


6

JavaScript ES6, 79 86 108 byte

Hóa ra việc Mlặp lại mất rất nhiều 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)

Phiên bản cũ (không lặp lại) (86 byte)

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

Phiên bản cũ hơn (không lặp lại, không yêu cầu ít nhất một m'kay) (79 byte) :

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

Phiên bản cũ nhất:

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

Phiên bản mới nhất có ReferenceError: t không được xác định
Neil

Chỉ phiên bản cũ nhất thực sự hoạt động trên Test.đầu vào.
Neil

@ Không nên xảy ra, chỉ hoạt động tốt với tôi. Bạn có thể thêm mã bạn đang sử dụng trong bảng điều khiển không
Downgoat 29/07/2015

Tôi gói trình của bạn trong ngoặc đơn và sau đó hậu tố ("Test.")cho nó.
Neil


4

C, 170 byte

Vết nứt đầu tiên tại nó:

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

Ung dung:

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

3

Toán học, 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}]&

Ngắt dòng được thêm vào để dễ đọc. Đánh giá một hàm ẩn danh lấy chuỗi làm đối số. ( là viết tắt cho \[Function].)

Ung dung:

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

hmất một dấu chấm câu char và làm cho nó " m'kay,", " mm'kay,"vv một cách ngẫu nhiên và vốn một cách thích hợp.

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

flấy một chuỗi và tìm kiếm bất kỳ ký tự dấu chấm câu x; khi tìm thấy nó, nó xử lý với xác suất 50% là phù hợp h[x]và 50% là một biểu thức như thế nào a[3, x]. Nó cũng cập nhật itổng số dấu chấm câu được thay thế (với cả hai trường hợp). Vì vậy, f["X, x."]có thể đánh giá để

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

Cuối cùng, gsẽ đối phó với a.

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

Countsẽ đếm axem chúng ta đặt bao nhiêu trong đó; nếu nó bằng i, tổng số dấu câu, thì chúng tôi đã không thêm bất kỳ ngày nào. Trong trường hợp này, chúng tôi sẽ có các biểu thức như thế nào a[0, _] ... a[i-1, _]và chúng tôi xác định ađể nó sẽ trả về một ngày cho chính xác một 0..i-1.


2

Con trăn, 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)

Ung dung:

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)

Sự thụt lề của bạn dường như khá lộn xộn: /
jazzpi 29/07/2015

Tôi biết, các tab đã tự động chuyển đổi thành không gian.
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 lãng phí, nhưng tôi đã hơi chán khi cố gắng sắp xếp lại nó. Ngoài ra, ngẫu nhiên trong một Funge rất khó để chơi gôn -.-


2

Perl, 93 89 88 byte

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

Chắc chắn có thể được chơi golf nhiều hơn nữa!

4 byte bị cắt đứt nhờ có Dom Hastings


2

C ++ 290

Giải pháp của tôi

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

Biến giải thích z xác định dấu chấm câu nào và z = 0 biểu thị sử dụng 'm' thay vì 'M'.

Kiểm tra

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=> -1hoặc ~0. Lựa chọn ~0cho phép bạn sử dụng -thay vì !=; để điều kiện trở thành if(z-~0&&r), tiết kiệm 11 byte.
Schism

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)

Sự cố nếu chuỗi đã cho không chứa dấu câu phù hợp.


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)

Bạn đã bao giờ nghe bi kịch của Darth Plagueis The Wise chưa? MM'kay? Tôi nghĩ là không. MMM'kay. Đó không phải là một câu chuyện mà Jedi sẽ kể cho bạn. Thưa ngài. Đó là một huyền thoại Sith. Darth Plagueis là một Chúa tể bóng tối của người Sith, m'kay, mạnh mẽ và khôn ngoan đến mức anh ta có thể sử dụng Thần lực để gây ảnh hưởng đến người midichlorian để tạo ra sự sống của anh ta sắp chết MM'kay. Mặt tối của Thần lực là con đường dẫn đến nhiều khả năng mà một số người cho là không tự nhiên. MM'kay. Anh ta trở nên mạnh mẽ, điều duy nhất anh ta sợ là mất đi sức mạnh của mình, mmm'kay, cuối cùng, mm'kay, tất nhiên, m'kay, anh ta đã làm. Thưa ngài. Thật không may, anh ta đã dạy cho người học việc tất cả những gì anh ta biết, sau đó người học việc của anh ta đã giết anh ta trong giấc ngủ. Thưa ngài. Mỉa mai Anh ta có thể cứu người khác khỏi cái chết,

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.