Golfowe wyzwanie, m'kay

51

Pan Mackey jest postacią z South Park znaną z dodawania „m'kay” we wszystkim, co mówi.

Napisz program lub funkcję, która przekształci ciąg tekstu w coś, co powiedziałby pan Mackey.

Dobra lokalizacja

  • m'kayma losowy 50% szans na dodawanych po interpunkcyjne ,, ., ?i! . W takim przypadku po nim będzie dokładnie ten sam znak interpunkcyjny, który go poprzedza, a po nim spacja.

    Na przykład w zdaniu można dodać Test, test.dwa miejsca m'kay: po przecinku i po okresie, z 50% szansą na każde miejsce. Możliwe byłyby takie wyniki Test, m'kay, test. lub Test, test. M'kay.lub Test, m'kay, test. M'kay..

  • Zawsze musi być co najmniej jeden m'kaydodany . Co więcej, nie zawsze może znajdować się w tym samym miejscu i każde prawidłowe miejsce, w którym m'kaymożna je dodać, musi wystąpić z jednakowym prawdopodobieństwem. Oznacza to, że nie możesz dodawać m'kayzawsze na końcu łańcucha, jeśli z powodu losowości nigdy go nie dodałeś m'kay. Jeśli jest tylko jeden m'kay, musi mieć takie samo prawdopodobieństwo pojawienia się na każdej ważnej pozycji, nawet jeśli jego obecność jest wymuszona.

  • Jeśli m'kayjest po ?, .lub !, mmuszą być pisane wielkimi literami.

  • Liczba mIN m'kaymusi być uniformely podniósł między 1 i 3. Oznacza to, że m'kay, mm'kayi mmm'kaysą wszystkie możliwe opcje, każdy z prawdopodobieństwem 0,33 ... Jeśli musi być duże litery (patrz wyżej reguły), wszystko mmusi być duże litery.

Wejścia wyjścia

  • Dane wejściowe to ciągi znaków ASCII zawierające znaki od ASCII Dec 32 (Spacja) do ASCII Dec 126 (tylda ~). Na wejściu nie ma podziałów wierszy. Możesz założyć, że każde wejście będzie zawierało co najmniej jeden z nich , . ? !.

  • Możesz założyć, że m'kayna wejściu nie ma żadnego z jego wariantów.

    Dane wejściowe mogą być pobierane z STDIN, argumentów funkcji, wiersza poleceń lub czegoś podobnego.

  • Dane wyjściowe mogą być przesyłane za pośrednictwem STDOUT, funkcji return lub czegoś podobnego.

Przypadki testowe

  • Wejście: Test.

Możliwe wyjście: Test. M'kay.

  • Wejście: 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.

Możliwe wyjście: 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.

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

Możliwe wyjście: 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.

  • Wejście: Do you understand? Really? Good!

Możliwe wyjście: Do you understand? MM'kay? Really? Good! MMM'kay!

Punktacja

To jest , więc wygrywa najkrótszy kod w bajtach, prawda?

Fatalizować
źródło
10
+1, M'kay, ale potrzebujemy wyzwania Cartmana!
Level River St
16
@steveverrill nie jestem pewien, czy język w wyzwaniu Cartmana byłby tu niestety do przyjęcia: P
Fatalize
1
Chcę zobaczyć odpowiedź w Ooku! MM'kay! Ale prawdopodobnie będziesz chciał użyć tego algorytmu do generowania liczb pseudolosowych .
mbomb007
3
@Fatalize: To wszystko wina mamy Kyle'a.
marinus
4
M'kayma losowe 50% szansy na dodanie po interpunkcji ,,.,? i! ” wydaje się być niezgodne z „ Zawsze musi być co najmniej jeden m'kaydodany ”. Wyjaśnij, że
Luis Mendo

Odpowiedzi:

13

CJam, 65 52 49 bajtów

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

Wypróbuj online w interpretatorze CJam .

Jak to działa

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
źródło
22

APL (66)

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

Wynik 10 przebiegów:

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

Wyjaśnienie:

  • {... }⍣≢: zastosuj funkcję do wejścia, dopóki wartość się nie zmieni
    • Wygeneruj a M'kaydla każdej postaci:
    • {... }¨⍵: dla każdego znaku na wejściu:
      • 'mM'[1+⍵≠',']/⍨?3: generuj 1 do 3 ms lub Ms w zależności od tego, czy znak był przecinkiem, czy nie.
      • '''kay',⍨: dołącz ciąg 'kay.
      • ⍵,⍨: dodaj znak
      • ' ',: wstaw spację.
    • (¯1+⌈?2×⍵∊',.!?')/¨: dla każdego M'kay”, jeśli odpowiadająca mu postać jest jedną z nich .,!?, wybierz ją z 50% szansą, w przeciwnym razie wybierz ją z szansą 0%.
    • ⍉⍵⍪⍉⍪: dopasuj każdy wybór do jego charakteru,
    • : wymień wszystkie proste elementy (znaki) w kolejności.
marinus
źródło
Ok, w jaki sposób wymusza to, że zawsze jest dodawany?
Jerry Jeremiah
6
@JerryJeremiah: ⍣≢stosuje tę funkcję wielokrotnie, aż dane wejściowe nie będą pasować do danych wyjściowych. Więc jeśli jeden zostanie dodany, wyjście zostanie zmienione i zatrzyma się i zwróci wyjście, a jeśli nie zostanie dodane, wyjście pozostanie niezmienione i będzie działać ponownie, dopóki nie zostanie dodane.
marinus
Jakoś mi tego brakowało. To bardzo sprytne.
Jerry Jeremiah
2
@DmitryGrigoryev: jeśli używasz tradycyjnego kodowania APL, zajmuje to rzeczywiście 1 bajt.
marinus
9

K5, 99 90 bajtów

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

Cóż, ktoś musiał to rozpocząć!

Zaoszczędzono 9 bajtów, stosując mniej fantazyjną metodę przewijania M.

Wyjaśnienie

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

Wersja 99-bajtowa

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

Julia, mm'kay, 115 114 bajtów

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

Tworzy to funkcję rekurencyjną, która akceptuje ciąg i zwraca ciąg.

Niegolfowane + wyjaśnienie:

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

Nie lubię South Park, ale emocje związane z golfem były zbyt kuszące, aby to pominąć. Dziękujemy KRyanowi za uproszczenie wyrażenia regularnego, oszczędzając 1 bajt.

Alex A.
źródło
6

JavaScript ES6, 79 86 108 bajtów

Okazuje się, że Mpowtórzenie zajmuje dużo bajtów.

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

Stara wersja (nie powtarza się) (86 bajtów)

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

Starsza wersja (nie powtarza się, nie wymaga co najmniej jednego m'kay) (79 bajtów) :

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

Najstarsza wersja:

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
źródło
Najnowsza wersja ma błąd ReferenceError: t nie jest zdefiniowany
Neil
Tylko najstarsza wersja faktycznie działa na Test.wejściu.
Neil
@Neil to nie powinno się dziać, działa dobrze dla mnie. Czy możesz dodać kod, którego używasz w konsoli
Downgoat
Zawijam twoje zgłoszenie w nawiasach, a następnie przyrostek ("Test.").
Neil
5

Pyth 51 50 49

Zaoszczędzono 1 bajt dzięki @Maltysen.

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

Wypróbuj online.

Wyjaśnienie i więcej golfa już wkrótce.

PurkkaKoodari
źródło
4

C, 170 bajtów

Pierwsze pęknięcie:

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

Nie golfowany:

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
źródło
4

Scala, 191 bajtów

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
źródło
3

Mathematica, 202 bajty

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

Dodano podział linii dla czytelności. Ocenia anonimową funkcję, biorąc ciąg za argument. ( jest skrótem od \[Function].)

Nie golfowany:

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

htrwa char interpunkcyjny i czyni je " m'kay,", " mm'kay,"itp losowo i odpowiednio skapitalizowane.

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

fpobiera ciąg znaków i szuka znaków interpunkcyjnych x; gdy go znajdzie, atakuje z 50% prawdopodobieństwem h[x], a 50% z wyrażeniem podobnym do a[3, x]. Aktualizuje także icałkowitą liczbę zastąpionych znaków interpunkcyjnych (w obu przypadkach). Więc f["X, x."]może ocenić

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

Wreszcie gporadzę sobie z a.

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

Countpoliczy, ile aich tam umieścimy; jeśli jest równy icałkowitej liczbie znaków interpunkcyjnych, to nie dodaliśmy żadnych m'kays. W tym przypadku będziemy mieli wyrażenia podobne a[0, _] ... a[i-1, _]i zdefiniujemy je atak, aby zwracało m'kay dla dokładnie jednego z nich 0..i-1.

jcai
źródło
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)

Nie golfowany:

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
źródło
Twoje wcięcie wydaje się dość
popsute
Wiem, tabulatory są automatycznie konwertowane na spacje.
Trang Oul,
2

> <>, 150 bajtów

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 zmarnowanych bajtów, ale trochę się nudzę próbując to zmienić. Również losowanie w Funge jest trudne do gry w golfa.

Sok
źródło
2

Perl, 93 89 88 bajtów

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

Zdecydowanie można jeszcze zagrać w golfa!

4 bajty odcięte dzięki Dom Hastings

Jarmex
źródło
2

C ++ 290

Moje rozwiązanie

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

Objaśnienie zmienna oo określa, który znak interpunkcyjny i z = 0 oznacza użycie „M” zamiast „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;
}
Bacchusbeale
źródło
string::npos=> -1lub ~0. Wybór ~0pozwala używać -zamiast !=; tak, że staje się warunkowe if(z-~0&&r), oszczędzając 11 bajtów.
Schizm
1

JavaScript ES6, 121 bajtów

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

Awarie, jeśli podany ciąg nie zawiera odpowiedniej interpunkcji.

Neil
źródło
1

Lua, 162 160 bajtów

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)

Czy słyszałeś kiedyś o tragedii Dartha Plagueisa Mądrego? MM? Myślałem, że nie. MMM'kay. To nie jest opowieść, którą opowie Jedi. Okej. To legenda Sithów. Darth Plagueis był Mrocznym Władcą Sithów, m'kay, tak potężny i tak mądry, że mógł użyć Mocy, aby wpłynąć na midichlorianów, aby stworzyć życie… Miał taką wiedzę o ciemnej stronie, że mógł nawet zatrzymać tych, na których mu zależało. o śmierci. MM'kay. Ciemna strona Mocy jest ścieżką do wielu umiejętności, które niektórzy uważają za nienaturalne. MM'kay. Stał się tak potężny ... jedyne, czego się obawiał, to utrata władzy, mmmka, co ostatecznie, mm'kay, oczywiście, zrobiło się. Okej. Niestety nauczył swojego ucznia wszystkiego, co wiedział, a potem zabił go we śnie. Okej. Ironiczny. Mógł ocalić innych przed śmiercią,

Paplać
źródło