Un desafío de código de golf, m'kay

51

El Sr. Mackey es un personaje de South Park conocido por agregar "m'kay" en todo lo que dice.

Escriba un programa o función que transforme una cadena de texto en algo que diría el Sr. Mackey.

Colocación de M'kay

  • m'kaytiene un 50% de probabilidad aleatoria de ser añadido después de que los signos de puntuación ,, ., ?y! . Si ese es el caso, irá seguido del mismo signo de puntuación que lo precede y precedido por un espacio.

    Por ejemplo, en la oración Test, test., hay dos lugares donde m'kayse pueden agregar: después de la coma y después del punto, con un 50% de probabilidad en cada lugar. Posibles resultados serían Test, m'kay, test. o Test, test. M'kay.o Test, m'kay, test. M'kay..

  • Siempre debe haber al menos uno m'kayagregado . Además, no siempre puede estar en el mismo lugar y cada lugar válido donde se m'kaypueda agregar debe ocurrir con la misma probabilidad. Es decir, no puede agregar m'kaysiempre al final de la cadena si, debido a la aleatoriedad, nunca agregó ninguno m'kay. Si solo hay uno m'kay, debe tener la misma probabilidad de aparecer en cada posición válida, aunque su presencia se haga cumplir.

  • Si m'kayes después ?, .o !, el mdebe uppercased.

  • El número de men m'kaydebe ser recogido de manera uniforme entre 1 y 3. Es decir, m'kay, mm'kayy mmm'kayson todas las opciones posibles, cada uno con una probabilidad de 0.33 ... Si hay que uppercased (véase más arriba regla), todos mdeben ser uppercased.

Salidas, entradas

  • Las entradas son cadenas ASCII que contienen caracteres desde ASCII Dec 32 (Espacio) hasta ASCII Dec 126 (Tilde ~). No hay saltos de línea en la entrada. Puede suponer que cualquier entrada contendrá al menos uno de , . ? !.

  • Puede suponer que no hay m'kayninguna de sus variantes en la entrada.

    Las entradas pueden tomarse de STDIN, argumentos de función, línea de comando o cualquier cosa similar.

  • La salida puede ser a través de STDOUT, un retorno de función o algo similar.

Casos de prueba

  • Entrada: Test.

Salida posible: Test. M'kay.

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

Salida posible: 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.

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

Salida posible: 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.

  • Entrada: Do you understand? Really? Good!

Salida posible: Do you understand? MM'kay? Really? Good! MMM'kay!

Puntuación

Este es el , por lo que gana el código más corto en bytes, ¿vale?

Fatalizar
fuente
10
+1, M'kay, ¡pero necesitamos un desafío Cartman!
Level River St
16
@steveverrill no está seguro de que el lenguaje en un desafío de Cartman sea aceptable aquí tristemente: P
Fatalize
1
¡Quiero ver una respuesta en Ook! MM'kay! Pero probablemente querrá usar este algoritmo para un generador de números pseudoaleatorio .
mbomb007
3
@Fatalize: todo es culpa de la madre de Kyle.
marinus
44
" M'kaytiene una probabilidad aleatoria del 50% de ser agregado después de los signos de puntuación".,? y! "parece ser incompatible con" Siempre debe haber al menos uno m'kayagregado ". Por favor aclare eso
Luis Mendo

Respuestas:

13

CJam, 65 52 49 bytes

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

Pruébelo en línea en el intérprete de CJam .

Cómo funciona

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

APL (66)

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

Resultado de 10 carreras:

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

Explicación:

  • {... }⍣≢: aplica la función a la entrada hasta que el valor cambie
    • Genera un M'kaypara cada personaje:
    • {... }¨⍵: para cada carácter en la entrada:
      • 'mM'[1+⍵≠',']/⍨?3: genera de 1 a 3 mso Ms dependiendo de si el personaje era una coma o no.
      • '''kay',⍨: agrega la cadena 'kay.
      • ⍵,⍨: agrega el personaje
      • ' ',: anteponer un espacio.
    • (¯1+⌈?2×⍵∊',.!?')/¨: para cada M'kay', si su carácter correspondiente es uno de .,!?, selecciónelo con 50% de probabilidad, de lo contrario, selecciónelo con 0% de probabilidad.
    • ⍉⍵⍪⍉⍪: asocia cada selección con su carácter,
    • : enumera todos los elementos simples (caracteres) en orden.
marinus
fuente
Ok, ¿cómo se impone que siempre se agregue uno?
Jerry Jeremiah
66
@JerryJeremiah: ⍣≢aplica la función repetidamente hasta que la entrada no coincide con la salida. Entonces, si se agrega uno, la salida se cambia y se detiene y devuelve la salida, y si no se agrega, la salida permanece sin cambios y se ejecuta nuevamente hasta que se agrega uno .
marinus
Me perdí eso de alguna manera. Eso es muy inteligente.
Jerry Jeremiah
2
@DmitryGrigoryev: si usa una codificación APL tradicional, de hecho solo toma 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}

Bueno, ¡ alguien necesitaba poner esto en marcha!

Ahorró 9 bytes usando un método menos sofisticado para poner en mayúscula la M.

Explicación

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

Versión de 99 bytes

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

Esto crea una función recursiva que acepta una cadena y devuelve una cadena.

Ungolfed + explicación:

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

No me gusta South Park, pero la emoción del golf era demasiado tentadora para dejarlo pasar. Gracias a KRyan por simplificar una expresión regular, ahorrando 1 byte.

Alex A.
fuente
6

JavaScript ES6, 79 86 108 bytes

Resulta que hacer que la Mrepetición tome muchos bytes.

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

Versión anterior (no se repite) (86 bytes)

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

Versión anterior (no se repite, no requiere al menos un m'kay) (79 bytes) :

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

Versión más antigua:

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
fuente
La última versión tiene un ReferenceError: t no está definido
Neil
Solo la versión más antigua realmente funciona en la Test.entrada.
Neil
@Neil, eso no debería estar sucediendo, funciona bien para mí. ¿Puedes agregar el código que estás usando en la consola
Downgoat
Envuelvo su presentación entre paréntesis y luego sufijo ("Test.").
Neil
5

Pyth 51 50 49

Guardado 1 byte gracias a @Maltysen.

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

Pruébalo en línea.

Explicación y más golf próximamente.

PurkkaKoodari
fuente
4

C, 170 bytes

Primero descifrarlo:

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

Sin golf:

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

Saltos de línea añadidos para facilitar la lectura. Evalúa una función anónima tomando la cadena como argumento. ( es la abreviatura de \[Function])

Sin golf:

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

htoma un char puntuacion y hace que sea " m'kay,", " mm'kay,", etc. azar y capitalizado apropiadamente.

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

ftoma una cadena y busca cualquier carácter de puntuación x; cuando lo encuentra, agrega con un 50% de probabilidad lo apropiado h[x]y un 50% de una expresión como a[3, x]. También se actualiza ial número total de puntuación reemplazada (con ambos casos). Entonces f["X, x."]podría evaluar a

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

Finalmente, gse ocupará de los a's.

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

Countcontará cuántos aponemos allí; si es igual ial número total de puntuación, entonces no agregamos ningún m'kays. En este caso, tendremos expresiones como a[0, _] ... a[i-1, _], y las definiremos apara que devuelva un m'kay para exactamente uno de 0..i-1.

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

Sin golf:

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
fuente
Su sangría parece estar bastante desordenada: /
jazzpi
Lo sé, las pestañas se convirtieron automáticamente en espacios.
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 desperdiciados, pero me aburrí un poco tratando de reorganizarlo. Además, la aleatorización en un Funge es difícil de jugar golf.

Sok
fuente
2

Perl, 93 89 88 bytes

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

¡Definitivamente se puede jugar un poco más!

4 bytes cortados gracias a Dom Hastings

Jarmex
fuente
2

C ++ 290

Mi solución

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 variable de explicación z determina qué signo de puntuación y z = 0 indica usar 'm' en lugar de 'M'.

Prueba

int main()
{
int x=5;
while(x--){
string S("Do you understand? Really? Good! Yes, I do.");
M(S);
cout<<endl;
}
return 0;
}
bacchusbeale
fuente
string::npos=> -1o ~0. Elegir ~0te permite usar en -lugar de !=; para que se convierta en condicional if(z-~0&&r), ahorrando 11 bytes.
Cisma
1

JavaScript ES6, 121 bytes

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

Se bloquea si la cadena dada no contiene puntuación adecuada.

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

¿Alguna vez escuchaste la tragedia de Darth Plagueis The Wise? MM'kay? No pensé. MMM'kay. No es una historia que los Jedi te contarían. Bien. Es una leyenda Sith. Darth Plagueis era un Señor Oscuro de los Sith, bueno, tan poderoso y tan sabio que podía usar la Fuerza para influir en los midiclorianos para crear vida ... Tenía tal conocimiento del lado oscuro que incluso podía quedarse con los que le importaban. acerca de morir MM'kay. El lado oscuro de la Fuerza es un camino hacia muchas habilidades que algunos consideran antinaturales. MM'kay. Se volvió tan poderoso ... lo único que temía era perder su poder, mmm'kay, que eventualmente, mm'kay, por supuesto, m'kay, lo hizo. Bien. Desafortunadamente, le enseñó a su aprendiz todo lo que sabía, luego su aprendiz lo mató mientras dormía. Bien. Irónico. Podía salvar a otros de la muerte,

Cotilla
fuente