Eine Code Golf Challenge, m'kay

51

Mr. Mackey ist ein South Park- Charakter, der dafür bekannt ist, dass er in allem, was er sagt, "m'kay" hinzufügt.

Schreiben Sie ein Programm oder eine Funktion, die eine Textfolge in etwas verwandelt, was Mr. Mackey sagen würde.

M'kay-Platzierung

  • m'kayhat eine zufällige 50% ige Chance , nach den Interpunktionen,.?! hinzugefügt zu werden , und . Wenn dies der Fall ist, wird genau dasselbe Satzzeichen gefolgt von einem Leerzeichen.

    Im Satz Test, test.können beispielsweise zwei Stellen m'kayhinzugefügt werden: Nach dem Komma und nach dem Punkt mit einer Wahrscheinlichkeit von 50% an jeder Stelle. Mögliche Ergebnisse wären Test, m'kay, test. oder Test, test. M'kay.oder Test, m'kay, test. M'kay..

  • Es muss immer mindestens eine m'kayhinzugefügt werden . Darüber hinaus kann es nicht immer am selben Ort sein und jeder gültige Ort, an dem m'kayhinzugefügt werden könnte, muss mit gleicher Wahrscheinlichkeit auftreten. Das heißt, Sie können nicht m'kayimmer am Ende der Zeichenfolge hinzufügen, wenn Sie aufgrund von Zufälligkeiten keine hinzugefügt haben m'kay. Wenn es nur eine gibt m'kay, muss sie dieselbe Wahrscheinlichkeit haben, an jeder gültigen Position zu erscheinen, auch wenn ihre Anwesenheit erzwungen wird.

  • Wenn m'kaynach ist ?, .oder !, das mmuss groß geschrieben werden.

  • Die Zahl der min m'kaymuss gleichmßig zwischen 1 und 3 abgeholt werden Das heißt, m'kay, mm'kayund mmm'kaysind alle möglichen Optionen, die jeweils mit einer Wahrscheinlichkeit von 0,33 ... Wenn es (siehe oben Regel) groß geschrieben werden müssen, alle mmüssen groß geschrieben werden.

Eingänge Ausgänge

  • Eingaben sind ASCII-Zeichenfolgen, die Zeichen von ASCII-Dez. 32 (Leerzeichen) bis ASCII-Dez. 126 (Tilde ~) enthalten. Die Eingabe enthält keine Zeilenumbrüche. Sie können davon ausgehen, dass jede Eingabe mindestens eine der folgenden Angaben enthält , . ? !.

  • Sie können davon ausgehen, dass keine m'kayoder eine der Varianten in der Eingabe enthalten ist.

    Eingaben können über STDIN, Funktionsargumente, Befehlszeile oder ähnliches erfolgen.

  • Die Ausgabe kann über STDOUT, eine Funktionsrückgabe oder ähnliches erfolgen.

Testfälle

  • Eingang: Test.

Mögliche Ausgabe: Test. M'kay.

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

Mögliche Ausgabe: 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.

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

Mögliche Ausgabe: 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.

  • Eingang: Do you understand? Really? Good!

Mögliche Ausgabe: Do you understand? MM'kay? Really? Good! MMM'kay!

Wertung

Das ist , also gewinnt der kürzeste Code in Bytes, m'kay?

Tödlich
quelle
10
+1, M'kay, aber wir brauchen eine Cartman-Herausforderung!
Level River St
16
@steveverrill nicht sicher, ob die Sprache in einer Cartman-Herausforderung hier leider akzeptabel wäre: P
Fatalize
1
Ich möchte eine Antwort in Ook sehen! MM'kay! Aber Sie werden diesen Algorithmus wahrscheinlich für einen Pseudozufallszahlengenerator verwenden wollen .
mbomb007
3
@Fatalize: Es ist alles Kyles Mutter Schuld.
Marinus
4
" M'kayhat eine zufällige 50% ige Chance, nach den Interpunktionen hinzugefügt zu werden ,,.,? und! " scheint nicht kompatibel zu sein mit " Es muss immer mindestens eine m'kayhinzugefügt werden ". Bitte klären Sie das
Luis Mendo

Antworten:

13

CJam, 65 52 49 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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
quelle
22

APL (66)

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

Ergebnis von 10 Läufen:

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

Erläuterung:

  • {... }⍣≢: Wenden Sie die Funktion auf den Eingang an, bis sich der Wert ändert
    • Generiere ein M'kayfür jeden Charakter:
    • {... }¨⍵: für jedes Zeichen in der Eingabe:
      • 'mM'[1+⍵≠',']/⍨?3: 1 bis 3 ms oder Ms generieren, je nachdem, ob das Zeichen ein Komma war oder nicht.
      • '''kay',⍨: füge die Zeichenkette an 'kay.
      • ⍵,⍨: Hänge das Zeichen an
      • ' ',: ein Leerzeichen voranstellen.
    • (¯1+⌈?2×⍵∊',.!?')/¨: Wählen Sie für jedes M'kay'das entsprechende Zeichen mit einer .,!?Wahrscheinlichkeit von 50% aus, andernfalls mit einer Wahrscheinlichkeit von 0%.
    • ⍉⍵⍪⍉⍪: Ordne jede Auswahl ihrem Charakter zu,
    • : liste alle einfachen Elemente (Zeichen) der Reihe nach auf.
Marinus
quelle
Ok, wie erzwingt dies, dass immer eine hinzugefügt wird?
Jerry Jeremiah
6
@JerryJeremiah: Wendet ⍣≢die Funktion so oft an, bis die Eingabe nicht mehr mit der Ausgabe übereinstimmt. Wenn man also hinzugefügt wird, wird die Ausgabe geändert und es stoppt und gibt den Ausgang, und wenn man nicht hinzugefügt wird, der Ausgang bleibt unverändert und es läuft wieder , bis man wird hinzugefügt.
Marinus
Das habe ich irgendwie verpasst. Das ist sehr schlau.
Jerry Jeremiah
2
@DmitryGrigoryev: Wenn Sie eine herkömmliche APL-Codierung verwenden, dauert dies in der Tat nur 1 Byte.
marinus
9

K5, 99-90 Bytes

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

Nun, jemand benötigt , um Kick-Start this!

Mit einer weniger ausgefallenen Methode zur Großschreibung des M 9 Bytes gespart.

Erläuterung

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

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

Julia, mm'kay, 115 114 Bytes

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

Dadurch wird eine rekursive Funktion erstellt, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt.

Ungolfed + Erklärung:

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

Ich mag South Park nicht, aber der Nervenkitzel des Golfs war zu verlockend, um darauf zu verzichten. Vielen Dank an KRyan für die Vereinfachung eines regulären Ausdrucks und die Einsparung von 1 Byte.

Alex A.
quelle
6

JavaScript ES6, 79 86 108 Bytes

Es stellte sich heraus, dass die MWiederholung viele Bytes benötigt.

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

Alte Version (wiederholt sich nicht) (86 Bytes)

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

Ältere Version (wiederholt sich nicht, erfordert nicht mindestens ein m'kay) (79 Bytes) :

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

Älteste Version:

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
quelle
Die neueste Version hat einen ReferenceError: t ist nicht definiert
Neil
Nur die älteste Version arbeitet tatsächlich an der Test.Eingabe.
Neil
@Neil das sollte nicht passieren, funktioniert gut für mich. Können Sie den Code hinzufügen, den Sie in der Konsole verwenden
Downgoat
Ich fasse Ihre Eingabe in Klammern ein und füge ("Test.")sie dann hinzu.
Neil
5

Pyth, 51 50 49

1 Byte dank @Maltysen gespeichert.

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

Probieren Sie es online aus.

Erklärung & mehr Golf in Kürze.

PurkkaKoodari
quelle
4

C 170 Bytes

Erster Riss dabei:

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

Scala, 191 Bytes

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
quelle
3

Mathematica, 202 Bytes

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

Zeilenumbrüche zur besseren Lesbarkeit hinzugefügt. Wird zu einer anonymen Funktion ausgewertet, die die Zeichenfolge als Argument verwendet. ( Ist die Abkürzung für \[Function].)

Ungolfed:

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

heinen Satz char nimmt und macht es " m'kay,", " mm'kay,"etc. zufällig und in geeigneter Weise aktiviert.

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

fNimmt einen String und sucht nach einem Interpunktionszeichen x. wenn es es findet, greift es mit 50% iger Wahrscheinlichkeit das Passende an h[x], und zu 50% einen Ausdruck wie a[3, x]. Es wird auch idie Gesamtanzahl der ersetzten Interpunktionen aktualisiert (in beiden Fällen). So f["X, x."]könnte bewerten zu

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

Schließlich gwerde ich mich mit den a's befassen .

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

Countwird zählen, wieviele awir da reingesteckt haben; Wenn es gleich ider Gesamtanzahl der Interpunktionszeichen ist, haben wir keine m'kays hinzugefügt. In diesem Fall haben wir Ausdrücke wie a[0, _] ... a[i-1, _], und wir definieren a, dass es ein m'kay für genau eines von zurückgibt 0..i-1.

jcai
quelle
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)
Trang Oul
quelle
Ihre Einrückung scheint ziemlich durcheinander zu sein: /
Jazzpi
Ich weiß, Tabs wurden automatisch in Leerzeichen umgewandelt.
Trang Oul
2

> <> 150 Bytes

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 Bytes verschwendet, aber ich habe mich ein wenig gelangweilt, um es neu zu ordnen. Auch Randomisierung in einer Funge ist schwer zu Golf -.-

Sok
quelle
2

Perl, 93 89 88 Bytes

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

Kann definitiv noch mehr golfen werden!

4 Bytes abgeschnitten dank Dom Hastings

Jarmex
quelle
2

C ++ 290

Meine Lösung

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

Die Erklärungsvariable z bestimmt, welches Interpunktionszeichen und z = 0 die Verwendung von 'm' anstelle von 'M' anzeigt.

Prüfung

int main()
{
int x=5;
while(x--){
string S("Do you understand? Really? Good! Yes, I do.");
M(S);
cout<<endl;
}
return 0;
}
Bacchusbeale
quelle
string::npos=> -1oder ~0. Wenn ~0Sie auswählen, können Sie -anstelle von verwenden !=. so dass bedingung wird if(z-~0&&r), spart 11 bytes.
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)

Stürzt ab, wenn die angegebene Zeichenfolge keine geeignete Interpunktion enthält.

Neil
quelle
1

Lua, 162 160 Bytes

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)

Hast du jemals die Tragödie von Darth Plagueis The Wise gehört? MM'kay? Ich dachte nicht. MMM'kay. Es ist keine Geschichte, die die Jedi dir erzählen würden. M'kay. Es ist eine Sith-Legende. Darth Plagueis war ein Dunkler Lord der Sith, m'kay, so mächtig und weise, dass er die Macht nutzen konnte, um die Midichlorianer zu beeinflussen, um Leben zu schaffen etwa vom Sterben. MM'kay. Die dunkle Seite der Macht ist ein Weg zu vielen Fähigkeiten, die manche für unnatürlich halten. MM'kay. Er wurde so mächtig ... das einzige, wovor er Angst hatte, war, seine Macht zu verlieren, mmm'kay, was er schließlich natürlich tat. M'kay. Leider brachte er seinem Lehrling alles bei, was er wusste, und dann tötete ihn sein Lehrling im Schlaf. M'kay. Ironisch. Er konnte andere vor dem Tod retten,

Ausplaudern
quelle