एक कोड गोल्फ चुनौती, m'kay


51

मि। मैके एक साउथ पार्क चरित्र है, जिसे वह अपनी हर बात में "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अपरकेस होना चाहिए।

  • की संख्या mमें m'kayuniformely 1 और 3 के बीच उठाया जाना चाहिए यही है, m'kay, mm'kayऔर mmm'kay(नियम ऊपर देखें) संभावना 0.33 के साथ सभी संभव विकल्पों, प्रत्येक रहे हैं ... यह uppercased किया जाना चाहिए, सभी muppercased किया जाना चाहिए।

निवेश निर्गम

  • इनपुट ASCII स्ट्रिंग हैं जिसमें ASCII 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!

स्कोरिंग

यह , इसलिए बाइट्स जीत में सबसे छोटा कोड है, m'kay?


10
+1, M'kay, लेकिन हमें कार्टमैन चुनौती की आवश्यकता है!
लेवल रिवर सेंट

16
@steveverrill सुनिश्चित नहीं है कि एक कार्टमैन चुनौती में भाषा दुख की बात यहाँ स्वीकार्य होगी: P
घातक

1
मैं एक उत्तर देखना चाहता हूं ओखर! MM'kay! लेकिन आप शायद छद्म यादृच्छिक संख्या जनरेटर के लिए इस एल्गोरिथ्म का उपयोग करना चाहते हैं ।
mbomb007

3
@ घातक: यह सभी काइल की माँ की गलती है।
मारिनस

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

एपीएल (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एस या Mएस उत्पन्न करते हैं।
      • '''kay',⍨: स्ट्रिंग संलग्न करें 'kay
      • ⍵,⍨: चरित्र को जोड़ो
      • ' ',: स्थान खाली करना।
    • (¯1+⌈?2×⍵∊',.!?')/¨: प्रत्येक के लिए M'kay', यदि इसका संगत वर्ण एक है .,!?, तो इसे 50% संभावना के साथ चुनें, अन्यथा इसे 0% अवसर के साथ चुनें।
    • ⍉⍵⍪⍉⍪: प्रत्येक चयन को उसके चरित्र से मिलाएँ,
    • : क्रम में सभी सरल तत्वों (वर्णों) को सूचीबद्ध करें।


ठीक है, यह कैसे लागू होता है कि हमेशा एक जोड़ा जाता है?
जेरी जेरेमिया

6
@JerryJeremiah: ⍣≢जब तक इनपुट आउटपुट से मेल नहीं खाता तब तक फ़ंक्शन को बार-बार लागू करता है। इसलिए यदि एक जोड़ा जाता है, तो आउटपुट बदल जाता है और यह बंद हो जाता है और आउटपुट को वापस कर देता है, और यदि कोई जोड़ा नहीं जाता है, तो आउटपुट अपरिवर्तित रहता है और जब तक एक जोड़ा नहीं जाता तब तक यह फिर से चलता है
मारिनस

मुझे वह किसी तरह याद आया। वह बहुत चालाक है।
जेरी यिर्मयाह

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}

खैर, किसी को इसे शुरू करने की जरूरत है!

एम। को अपरकेस करने की एक कम फैंसी विधि का उपयोग करके 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

जूलिया, मिमी'के, 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

मैं साउथ पार्क को नापसंद करता हूं, लेकिन गोल्फ का रोमांच इसे पार करने के लिए बहुत रोमांचित था। 1 बाइट की बचत, एक रेगेक्स को सरल बनाने के लिए केरेन का धन्यवाद।


6

जावास्क्रिप्ट ईएस 6, 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``)

नवीनतम संस्करण में एक संदर्भ है: टी परिभाषित नहीं है
नील

केवल सबसे पुराना संस्करण वास्तव में Test.इनपुट पर काम करता है ।
नील

@ नहीं, जो नहीं होना चाहिए, मेरे लिए ठीक काम करता है। क्या आप सांत्वना में उपयोग किए जाने वाले कोड को जोड़ सकते हैं
डाउनगोट

मैं आपके प्रस्तुतिकरण को कोष्ठक में लपेटता हूँ और फिर ("Test.")इसे प्रत्यय देता हूँ।
नील


4

सी, 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

गणितज्ञ, 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; जब यह पता चलता है, तो यह 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

पायथन, 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

मुझे पता है, टैब स्वचालित रूप से रिक्त स्थान में परिवर्तित हो गए हैं।
ट्रांग ओउल

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 बर्बाद बाइट्स, लेकिन मैं इसे पुनर्व्यवस्थित करने की कोशिश कर थोड़ा ऊब गया हूं। इसके अलावा, एक फंड में यादृच्छिकता गोल्फ के लिए कठिन है।


2

पर्ल, 93 89 88 बाइट्स

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

निश्चित रूप से कुछ और गोल्फ हो सकता है!

डोम हेस्टिंग्स की बदौलत 4 बाइट्स कट गए


2

सी ++ 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

जावास्क्रिप्ट ईएस 6, 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

लुआ, 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)

क्या आपने कभी डार्थ प्लेगिस द वार की त्रासदी सुनी? MM'kay? मैंने सोचा नहीं। MMM'kay। यह एक कहानी नहीं है जो जेडी आपको बताएगी। M'kay। यह एक सिथ कथा है। डार्थ प्लेगिस सिथ का एक डार्क लॉर्ड था, जो इतना शक्तिशाली और बुद्धिमान था कि वह जीवन का निर्माण करने के लिए मिडीक्लोरियन को प्रभावित करने के लिए बल का उपयोग कर सकता था ... उसे अंधेरे पक्ष का इतना ज्ञान था कि वह लोगों को भी ध्यान रख सकता था मरने से। MM'kay। फोर्स का डार्क साइड कई क्षमताओं के लिए एक मार्ग है जो कुछ लोग अप्राकृतिक मानते हैं। MM'kay। वह इतना शक्तिशाली हो गया ... केवल एक चीज जिससे वह डरता था वह अपनी शक्ति खो रहा था, mmm'kay, जो अंततः, mm'kay, ज़ाहिर है, m'kay, उसने किया। M'kay। दुर्भाग्य से, उसने अपने प्रशिक्षु को वह सब कुछ सिखाया जो वह जानता था, फिर उसके प्रशिक्षु ने उसे नींद में मार दिया। M'kay। विडंबना। वह दूसरों को मौत से बचा सकता है,

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.