Um desafio de código de golfe, m'kay

51

Mackey é um personagem de South Park conhecido por adicionar "m'kay" em tudo o que diz.

Escreva um programa ou função que transforme uma sequência de texto em algo que o Sr. Mackey diria.

Colocação M'kay

  • m'kaytem uma possibilidade aleatória de 50% de ser adicionado após as pontuações ,, ., ?e! . Se for esse o caso, será seguido exatamente pelo mesmo sinal de pontuação que o antecede e é precedido por um espaço.

    Por exemplo, na sentença Test, test., há dois locais que m'kaypodem ser adicionados: após a vírgula e após o período, com 50% de chance em cada local. Possíveis resultados seriam Test, m'kay, test. ou Test, test. M'kay.ou Test, m'kay, test. M'kay..

  • Sempre deve haver pelo menos um m'kayadicionado . Além disso, nem sempre pode estar no mesmo local e cada local válido onde m'kaypode ser adicionado deve ocorrer com igual probabilidade. Ou seja, você não pode adicionar m'kaysempre no final da string se, por causa da aleatoriedade, você nunca adicionou nenhuma m'kay. Se houver apenas um m'kay, ele deve ter a mesma probabilidade de aparecer em cada posição válida, mesmo que sua presença seja imposta.

  • Se m'kayé depois ?, .ou !, o mdeve ser uppercased.

  • O número de mnos m'kaydeve ser maneira uniforme escolhido entre 1 e 3. Ou seja, m'kay, mm'kaye mmm'kaysão todas as escolhas possíveis, cada um com probabilidade 0,33 ... Se ele deve ser uppercased (veja acima regra), todos mdevem ser uppercased.

Entradas saídas

  • As entradas são sequências ASCII que contêm caracteres de ASCII Dec 32 (Space) a ASCII Dec 126 (Tilde ~). Não há quebras de linha na entrada. Você pode assumir que qualquer entrada conterá pelo menos uma das , . ? !.

  • Você pode assumir que não há nenhuma m'kayou nenhuma de suas variantes na entrada.

    As entradas podem ser obtidas de STDIN, argumentos de função, linha de comando ou qualquer coisa semelhante.

  • A saída pode ser via STDOUT, um retorno de função ou algo semelhante.

Casos de teste

  • Entrada: Test.

Saída possível: 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.

Saída possível: 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.

Saída possível: 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!

Saída possível: Do you understand? MM'kay? Really? Good! MMM'kay!

Pontuação

Isso é , então o código mais curto em bytes vence, certo?

Fatalizar
fonte
10
+1, M'kay, mas precisamos de um desafio Cartman!
Level River St
16
@steveverrill não tenho certeza se o idioma em um desafio de Cartman seria aceitável aqui infelizmente: P
Fatalize
11
Eu quero ver uma resposta em Ook! MM'kay! Mas você provavelmente desejará usar esse algoritmo para um gerador de números pseudo-aleatórios .
mbomb007
3
@Fatalize: É tudo culpa da mãe de Kyle.
marinus
4
" M'kaytem 50% de chance aleatória de ser adicionado após as pontuações ,,.,? e! " parece ser incompatível com " Sempre deve haver pelo menos um m'kayadicionado ". Por favor, esclareça que
Luis Mendo

Respostas:

13

CJam, 65 52 49 bytes

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

Experimente online no intérprete CJam .

Como 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
fonte
22

APL (66)

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

Resultado de 10 execuções:

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

Explicação:

  • {... }⍣≢: aplica a função à entrada até o valor mudar
    • Gere a M'kaypara cada caractere:
    • {... }¨⍵: para cada caractere na entrada:
      • 'mM'[1+⍵≠',']/⍨?3: gere 1 a 3 ms ou Ms, dependendo de o caractere ser uma vírgula ou não.
      • '''kay',⍨: acrescenta a string 'kay.
      • ⍵,⍨: acrescenta o caractere
      • ' ',: acrescente um espaço.
    • (¯1+⌈?2×⍵∊',.!?')/¨: para cada M'kay', se o caractere correspondente for um deles .,!?, selecione-o com 50% de chance; caso contrário, selecione-o com 0% de chance.
    • ⍉⍵⍪⍉⍪: combine cada seleção com seu caractere,
    • : lista todos os elementos simples (caracteres) em ordem.
marinus
fonte
Ok, como isso impõe que sempre haja um adicionado?
Jerry Jeremiah
6
@JerryJeremiah: ⍣≢aplica a função repetidamente até que a entrada não corresponda à saída. Portanto, se um é adicionado, a saída é alterada e para e retorna a saída; se não for adicionado, a saída permanece inalterada e é executada novamente até que seja adicionado.
marinus
Eu senti falta disso de alguma forma. Isso é muito inteligente.
Jerry Jeremiah
2
@DmitryGrigoryev: se você usa uma codificação APL tradicional, ela realmente leva apenas 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}

Bem, alguém precisava dar um pontapé inicial nisso!

Economizou 9 bytes usando um método menos sofisticado de colocar maiúsculas no M.

Explicação

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

Versão 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
fonte
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))

Isso cria uma função recursiva que aceita uma string e retorna uma string.

Ungolfed + explicação:

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

Não gosto de South Park, mas a emoção do golfe era muito atraente para deixar passar. Obrigado ao KRyan por simplificar uma regex, economizando 1 byte.

Alex A.
fonte
6

JavaScript ES6, 79 86 108 bytes

Acontece que fazer a Mrepetição leva muitos 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)

Versão antiga (não se repete) (86 bytes)

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

Versão mais antiga (não se repete, não requer pelo menos um minuto) (79 bytes) :

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

Versão mais antiga:

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
fonte
A versão mais recente possui um ReferenceError: t não está definido
Neil
Somente a versão mais antiga realmente funciona na Test.entrada.
Neil
@ Neil que não deveria estar acontecendo, funciona muito bem para mim. Você pode adicionar o código que está usando no console
Downgoat
Envolvo sua submissão entre parênteses e depois o sufixo ("Test.").
295 Neil
5

Pyth, 51 50. 49.

Guardou 1 byte graças a @Maltysen.

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

Experimente online.

Explicação e mais golfe em breve.

PurkkaKoodari
fonte
4

C, 170 bytes

Primeira rachadura:

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

Quebras de linha adicionadas para facilitar a leitura. Avalia como uma função anônima, levando a string como argumento. ( é uma abreviação de \[Function].)

Ungolfed:

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

hleva um char pontuação e torna " m'kay,", " mm'kay,"etc. aleatoriamente e capitalizado apropriadamente.

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

fpega uma string e procura qualquer caractere de pontuação x; quando o encontra, adota com 50% de probabilidade o apropriado h[x]e 50% com uma expressão como a[3, x]. Ele também é atualizado ipara o número total de pontuação substituída (nos dois casos). Então, f["X, x."]pode avaliar para

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

Finalmente, gvai lidar com os a's.

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

Countcontará quantos anós colocamos lá; se for igual iao número total de pontuação, não adicionamos m'kays. Nesse caso, teremos expressões como a[0, _] ... a[i-1, _]e definimos apara que retorne um m'kay para exatamente um de 0..i-1.

jcai
fonte
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
fonte
Seu recuo parece estar bem confuso: /
jazzpi
Eu sei, as guias foram convertidas automaticamente em espaços.
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 desperdiçados, mas fiquei um pouco entediado tentando reorganizá-lo. Além disso, a randomização em um Funge é difícil de jogar -.-

Sok
fonte
2

Perl, 93 89 88 bytes

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

Definitivamente pode ser jogado um pouco mais!

4 bytes cortados graças a Dom Hastings

Jarmex
fonte
2

C ++ 290

Minha solução

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

A variável de explicação z determina qual sinal de pontuação e z = 0 indica o uso de 'm' em vez de 'M'.

Teste

int main()
{
int x=5;
while(x--){
string S("Do you understand? Really? Good! Yes, I do.");
M(S);
cout<<endl;
}
return 0;
}
bacchusbeale
fonte
string::npos=> -1ou ~0. Escolher ~0permite usar em -vez de !=; para que se torne condicional if(z-~0&&r), economizando 11 bytes.
Schism
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)

Falha se a sequência especificada não contiver pontuação adequada.

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

Você já ouviu a tragédia de Darth Plagueis The Wise? MM'kay? Eu pensei que não. MMM'kay. Não é uma história que os Jedi lhe contariam. M'kay. É uma lenda dos Sith. Darth Plagueis era um Lorde das Trevas dos Sith, ok, tão poderoso e sábio que ele poderia usar a Força para influenciar os midiclorianos a criar vida ... Ele tinha tanto conhecimento do lado sombrio que podia até manter os que se importavam. sobre morrer. MM'kay. O lado sombrio da Força é um caminho para muitas habilidades que alguns consideram antinaturais. MM'kay. Ele se tornou tão poderoso ... a única coisa que ele temia era perder seu poder, mmm'kay, o que eventualmente, mm'kay, é claro, m'kay, ele conseguiu. M'kay. Infelizmente, ele ensinou ao aprendiz tudo o que sabia, e o aprendiz o matou enquanto dormia. M'kay. Irônico. Ele poderia salvar outros da morte,

Blab
fonte