รหัสความท้าทายกอล์ฟ m'kay


51

Mr. Mackeyเป็นตัวละครSouth Park ที่รู้จักกันดีในการเพิ่ม "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จะต้อง uppercased

  • จำนวนmในm'kayจะต้องรับ uniformely ระหว่างวันที่ 1 และ 3 นั่นคือm'kay, mm'kayและmmm'kayเป็นทางเลือกที่เป็นไปได้ทั้งหมดในแต่ละที่มีความน่าจะเป็น 0.33 ... ถ้ามันจะต้อง uppercased (ดูด้านบนกฎ) ทั้งหมดmจะต้อง uppercased

อินพุตเอาต์พุต

  • อินพุตเป็นสตริง ASCII ที่มีอักขระตั้งแต่ ASCII Dec 32 (Space) ถึง ASCII Dec 126 (Tilde ~) ไม่มี linebreaks ในอินพุต คุณอาจสันนิษฐานว่าข้อมูลใด ๆ จะมีอย่างน้อยหนึ่ง, . ? !รายการ

  • คุณอาจคิดว่ามี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!

เกณฑ์การให้คะแนน

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ m'kay?


10
+1, M'kay แต่เราต้องการความท้าทายของคาร์ท!
เลเวลริเวอร์เซนต์

16
@steveverrill ไม่แน่ใจว่าภาษาในการแข่งขันคาร์ทจะเป็นที่ยอมรับได้ที่นี่อย่างน่าเศร้า: P
Fatalize

1
ฉันต้องการเห็นคำตอบใน Ook! MM'kay! แต่คุณอาจจะต้องการใช้วิธีนี้สำหรับเครื่องกำเนิดไฟฟ้าจำนวนสุ่มหลอก
mbomb007

3
@ สรุป: มันเป็นความผิดของแม่ของไคล์ทุกคน
marinus

4
" M'kayมีโอกาสสุ่ม 50% ของการเพิ่มหลังจากเครื่องหมายวรรคตอน,.,? และ! " ดูเหมือนจะไม่เข้ากันกับ " ต้องมีอย่างน้อยหนึ่งรายการที่m'kayเพิ่ม " โปรดอธิบายว่า
Luis Mendo

คำตอบ:


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?   

คำอธิบาย:

  • {... }⍣≢: ใช้ฟังก์ชันกับอินพุตจนกว่าค่าจะเปลี่ยน
    • สร้าง a M'kayสำหรับตัวละครแต่ละตัว:
    • {... }¨⍵: สำหรับอักขระแต่ละตัวในอินพุต:
      • 'mM'[1+⍵≠',']/⍨?3: สร้าง 1 ถึง 3 ms หรือMs ขึ้นอยู่กับว่าอักขระเป็นเครื่องหมายจุลภาคหรือไม่
      • '''kay',⍨: 'kayผนวกสตริง
      • ⍵,⍨: ผนวกอักขระ
      • ' ',: เติมช่องว่าง
    • (¯1+⌈?2×⍵∊',.!?')/¨: สำหรับแต่ละตัวM'kayหากอักขระที่เกี่ยวข้องเป็นหนึ่ง.,!?ให้เลือกโดยมีโอกาส 50% มิฉะนั้นให้เลือกด้วยโอกาส 0%
    • ⍉⍵⍪⍉⍪: จับคู่แต่ละตัวเลือกกับตัวละคร
    • : รายการองค์ประกอบง่าย ๆ (ตัวอักษร) ตามลำดับ


ตกลงวิธีนี้บังคับใช้ว่ามีการเพิ่มอย่างใดอย่างหนึ่งเสมอ?
Jerry Jeremiah

6
@JerryJeremiah: ⍣≢ใช้ฟังก์ชั่นซ้ำ ๆ จนกระทั่งอินพุตไม่ตรงกับเอาท์พุท ดังนั้นหากมีการเพิ่มหนึ่งเอาท์พุทจะมีการเปลี่ยนแปลงและมันจะหยุดและส่งกลับออกและถ้าไม่มีการเพิ่มเอาท์พุทยังคงไม่เปลี่ยนแปลงและจะทำงานอีกครั้งจนกว่าจะมีการเพิ่ม
marinus

ฉันพลาดอย่างใด มันฉลาดมาก
Jerry Jeremiah

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}

ดีคนที่จำเป็นในการเตะเริ่มต้นนี้!

บันทึก 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

Julia, 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

ฉันไม่ชอบเซาท์พาร์ก แต่ความตื่นเต้นของสนามกอล์ฟเกินกว่าที่จะผ่านสิ่งนี้ ขอบคุณ KRyan สำหรับการทำให้ regex ง่ายขึ้นประหยัด 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``)

รุ่นล่าสุดมี ReferenceError: t ไม่ได้กำหนด
Neil

เฉพาะรุ่นที่เก่าที่สุดเท่านั้นที่ใช้งานได้กับTest.อินพุต
Neil

@Nil ที่ไม่ควรเกิดขึ้นทำงานได้ดีสำหรับฉัน คุณสามารถเพิ่มรหัสที่คุณใช้ในคอนโซลได้
ไหม

ฉันใส่การส่งของคุณในวงเล็บแล้วต่อท้าย("Test.")มัน
Neil


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

สกาลา, 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; เมื่อพบมัน tacks กับความน่าจะเป็น 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'kays ใด ๆ ในกรณีนี้เราจะมีการแสดงออกเหมือน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)

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

ฉันรู้ว่าแท็บถูกแปลงเป็นช่องว่างโดยอัตโนมัติ
ตรัง 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

สามารถตีกอล์ฟได้มากกว่านี้อย่างแน่นอน!

4 ไบต์ถูกตัดออกเนื่องจาก Dom Hastings


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

คุณเคยได้ยินโศกนาฏกรรมของ Darth Plagueis The Wise หรือไม่? MM'kay? ฉันไม่คิด MMM'kay ไม่ใช่เรื่องที่เจไดจะบอกคุณ M'kay มันเป็นตำนาน Sith Darth Plagueis เป็น Dark Lord of the Sith, m'kay มีพลังมากและฉลาดมากเขาสามารถใช้ Force เพื่อสร้างอิทธิพลให้ midichlorians เพื่อสร้างชีวิต ... เขามีความรู้ด้านมืดที่เขาสามารถดูแลสิ่งที่เขาห่วงใยได้ เกี่ยวกับจากการตาย MM'kay ด้านมืดของกองทัพเป็นเส้นทางสู่ความสามารถหลายอย่างที่บางคนคิดว่าผิดธรรมชาติ MM'kay เขากลายเป็นคนที่มีพลังมาก ... สิ่งเดียวที่เขากลัวคือการสูญเสียพลัง mmm'kay ซึ่งในที่สุด mm'kay แน่นอน m'kay เขาทำ M'kay แต่น่าเสียดายที่เขาสอนลูกศิษย์ทุกอย่างที่เขารู้จากนั้นลูกศิษย์ของเขาก็ฆ่าเขาในขณะหลับ M'kay แดกดัน เขาสามารถช่วยคนอื่นจากความตาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.