Una sfida di codice golf, okay


51

Mr. Mackey è un personaggio di South Park noto per aver aggiunto "may" in tutto ciò che dice.

Scrivi un programma o una funzione che trasforma una stringa di testo in qualcosa che direbbe Mr. Mackey.

Posizionamento giusto

  • m'kayha una a caso il 50% di probabilità di essere aggiunto dopo i segni di interpunzione ,, ., ?e! . In tal caso, sarà seguito dallo stesso segno di punteggiatura che lo precede e preceduto da uno spazio.

    Ad esempio, nella frase Test, test., ci sono due posti in cui è m'kaypossibile aggiungere: dopo la virgola e dopo il punto, con una probabilità del 50% in ogni luogo. I risultati possibili sarebbero Test, m'kay, test. o Test, test. M'kay.o Test, m'kay, test. M'kay..

  • Deve esserci sempre almeno uno m'kayaggiunto . Inoltre, non può sempre essere nello stesso posto e ogni luogo valido in cui m'kaypotrebbe essere aggiunto deve avvenire con uguale probabilità. Cioè, non puoi aggiungere m'kaysempre alla fine della stringa se a causa della casualità non ne hai mai aggiunta alcuna m'kay. Se ce n'è solo uno m'kay, deve avere la stessa probabilità di apparire in ogni posizione valida, anche se la sua presenza è forzata.

  • Se m'kayè dopo ?, .o !, il carattere mdeve essere maiuscolo.

  • Il numero di min m'kaydeve essere scelto uniformemente tra 1 e 3. Cioè m'kay, mm'kaye mmm'kaysono tutte le possibili scelte, ognuna con probabilità 0,33 ... Se deve essere maiuscolo (vedi regola sopra), tutto mdeve essere maiuscolo.

Entrate uscite

  • Gli input sono stringhe ASCII contenenti caratteri da ASCII Dec 32 (Spazio) a ASCII Dec 126 (Tilde ~). Non ci sono interruzioni di riga nell'input. Si può presumere che qualsiasi input conterrà almeno uno di , . ? !.

  • Si può presumere che non ci siano m'kayo nessuna delle sue varianti nell'input.

    Gli input possono essere presi da STDIN, argomenti di funzioni, riga di comando o qualcosa di simile.

  • L'output può essere tramite STDOUT, un ritorno di funzione o qualcosa di simile.

Casi test

  • Ingresso: Test.

Uscita possibile: Test. M'kay.

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

Uscita possibile: 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.

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

Uscita possibile: 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.

  • Ingresso: Do you understand? Really? Good!

Uscita possibile: Do you understand? MM'kay? Really? Good! MMM'kay!

punteggio

Questo è , quindi vince il codice più corto in byte, ok?


10
+1, okay, ma abbiamo bisogno di una sfida Cartman!
Level River St

16
@steveverrill non è sicuro che la lingua in una sfida Cartman sarebbe accettabile qui tristemente: P
Fatalizza il

1
Voglio vedere una risposta in Ook! MM'kay! Ma probabilmente vorrai usare questo algoritmo per un generatore di numeri pseudo-casuale .
mbomb007,

3
@Fatalize: è tutta colpa della mamma di Kyle.
Marin

4
" M'kayha una probabilità casuale del 50% di essere aggiunto dopo la punteggiatura ,,.?? e! " sembra essere incompatibile con " Deve essercene sempre almeno uno m'kayaggiunto ". Si prega di chiarire che
Luis Mendo,

Risposte:


13

CJam, 65 52 49 byte

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

Provalo online nell'interprete CJam .

Come funziona

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

Risultato di 10 corse:

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

Spiegazione:

  • {... }⍣≢: applica la funzione all'ingresso fino a quando il valore non cambia
    • Genera a M'kayper ogni personaggio:
    • {... }¨⍵: per ogni carattere nell'input:
      • 'mM'[1+⍵≠',']/⍨?3: genera da 1 a 3 msecondi a Mseconda che il carattere sia una virgola o meno.
      • '''kay',⍨: aggiungi la stringa 'kay.
      • ⍵,⍨: aggiungi il personaggio
      • ' ',: anteporre uno spazio.
    • (¯1+⌈?2×⍵∊',.!?')/¨: per ciascuno M'kay', se il suo personaggio corrispondente è uno di .,!?, selezionalo con una probabilità del 50%, altrimenti selezionalo con una probabilità dello 0%.
    • ⍉⍵⍪⍉⍪: abbina ogni selezione al suo personaggio,
    • : elenca tutti gli elementi semplici (caratteri) in ordine.


Ok, come si impone che ce ne sia sempre uno aggiunto?
Jerry Jeremiah,

6
@JerryJeremiah: ⍣≢applica ripetutamente la funzione fino a quando l'ingresso non corrisponde all'uscita. Quindi, se ne viene aggiunto uno, l'output viene modificato e si arresta e restituisce l'output, e se non viene aggiunto, l'output rimane invariato e continua a funzionare fino a quando non viene aggiunto.
Marin

Mi è mancato in qualche modo. È molto intelligente.
Jerry Jeremiah,

2
@DmitryGrigoryev: se si utilizza una codifica APL tradizionale, richiede effettivamente solo 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}

Bene, qualcuno doveva iniziare questo!

Hai salvato 9 byte usando un metodo meno elaborato per mettere in maiuscolo il M.

Spiegazione

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

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

Ciò crea una funzione ricorsiva che accetta una stringa e restituisce una stringa.

Ungolfed + spiegazione:

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

Non mi piace South Park, ma il brivido del golf era troppo allettante per lasciar perdere. Grazie a KRyan per semplificare un regex, risparmiando 1 byte.


6

JavaScript ES6, 79 86 108 byte

Risulta che la Mripetizione richiede molti 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)

Vecchia versione (non si ripete) (86 byte)

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

Versione precedente (non si ripete, non richiede almeno un m'kay) (79 byte) :

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

Versione più vecchia:

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

L'ultima versione ha un ReferenceError: t non definito
Neil

Solo la versione più vecchia funziona effettivamente Test.sull'input.
Neil,

@Neil che non dovrebbe succedere, funziona bene per me. Puoi aggiungere il codice che stai utilizzando nella console
Downgoat

Metto la tua presentazione tra parentesi e poi suffisso ("Test.").
Neil,

5

Pyth, 51 50 49

Salvato 1 byte grazie a @Maltysen.

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

Provalo online.

Spiegazione e più golf in arrivo.


4

C, 170 byte

Prima crack:

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

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

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

Interruzioni di riga aggiunte per leggibilità. Valuta una funzione anonima che prende la stringa come argomento. ( è una scorciatoia per \[Function].)

Ungolfed:

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

hprende un char punteggiatura e rende " m'kay,", " mm'kay,"ecc casualmente e capitalizzata adeguatamente.

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

fprende una stringa e cerca qualsiasi carattere di punteggiatura x; quando lo trova, attacca con il 50% di probabilità l'appropriata h[x]e il 50% con un'espressione simile a[3, x]. Si aggiorna anche ial numero totale di punteggiatura sostituita (con entrambi i casi). Quindi f["X, x."]potrebbe valutare

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

Infine, gtratterà di a.

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

Countconterà quanti ne aabbiamo messi lì; se è uguale i, il numero totale di punteggiatura, quindi non abbiamo aggiunto alcun m'kay. In questo caso, avremo espressioni simili a[0, _] ... a[i-1, _]e definiremo in amodo che restituisca un m'kay esattamente per uno di 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)

La tua indentazione sembra essere piuttosto incasinata: /
jazzpi,

Lo so, le schede sono state convertite automaticamente in spazi.
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 sprecati, ma mi sono annoiato un po 'cercando di riordinarlo. Inoltre, la randomizzazione in un tuffo è difficile da golf -.-


2

Perl, 93 89 88 byte

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

Si può sicuramente giocare a golf ancora un po '!

4 byte tagliati grazie a Dom Hastings


2

C ++ 290

La mia soluzione

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

La variabile di spiegazione z determina quale segno di punteggiatura e z = 0 indica di utilizzare 'm' anziché 'M'.

Test

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=> -1o ~0. La scelta ~0ti consente di utilizzare -invece di !=; in modo che il condizionale diventi if(z-~0&&r), salvando 11 byte.
Scisma

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)

Si blocca se la stringa specificata non contiene punteggiatura adatta.


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)

Hai mai sentito la tragedia di Darth Plagueis The Wise? MM'kay? Non ho pensato. MMM'kay. Non è una storia che i Jedi ti direbbero. M'kay. È una leggenda di Sith. Darth Plagueis era un Dark Lord of the Sith, forse così potente e così saggio da poter usare la Forza per influenzare i midichloriani per creare la vita ... Aveva una tale conoscenza del lato oscuro che poteva persino mantenere quelli a cui teneva di morire. MM'kay. Il lato oscuro della Forza è un percorso verso molte abilità che alcuni considerano innaturali. MM'kay. È diventato così potente ... l'unica cosa di cui aveva paura era perdere il suo potere, mmm'kay, che alla fine, mmkay, ovviamente, mkay, ha fatto. M'kay. Sfortunatamente, insegnò al suo apprendista tutto ciò che sapeva, quindi il suo apprendista lo uccise nel sonno. M'kay. Ironico. Poteva salvare gli altri dalla morte,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.