Bir kod golf mücadelesi.


51

Bay Mackey , söylediği her şeye "m'kay" ı eklediği bilinen bir South Park karakteri.

Mackey'nin söyleyeceği bir şeye bir metin dizisi dönüştüren bir program veya işlev yazın.

M'kay yerleştirme

  • m'kayBir sahip rasgele% 50 olasılıkla ilave edilme noktalamalar sonra ,, ., ?ve! . Bu durumda, onu önceden belirleyen ve boşluk bırakan aynı noktalama işaretini izleyecektir.

    Örneğin, cümlede Test, test., m'kayeklenebilecek iki yer var : virgülten sonra ve dönemden sonra, her yerde% 50 şans. Olası sonuçlar olurdu Test, m'kay, test. veya Test, test. M'kay.veya Test, m'kay, test. M'kay..

  • Her zaman en az bir tane m'kayeklenmelidir . Ayrıca, her zaman aynı yerde m'kayolamaz ve eklenebilecek her geçerli yer eşit olasılıkla gerçekleşmelidir. Başka bir deyişle, hiçbir m'kayzaman eklememiş olduğunuz rasgele olduğu için dizenin sonuna her zaman ekleyemezsiniz m'kay. Sadece bir tane varsa m'kay, varlığı geçerli olsa bile, her geçerli pozisyonda görünme ihtimalinin aynı olması gerekir.

  • Eğer m'kaysonradır ?, .ya !, mBüyük harfli olmalıdır.

  • Sayısı min m'kaymuntazam olduğu Yani 1 ve 3 arasında tahsil edilmesi gerektiğini m'kay, mm'kayve mmm'kaybunun Büyük harfli gerekiyorsa (kural yukarıya bakınız) ... olasılık 0.33 ile tüm olası seçenekleri, her biri, bütün mBüyük harfli olmalıdır.

Girişler, çıkışlar

  • Girişler, ASCII Dec 32 (Space) ile ASCII Dec 126 (Tilde ~) arasındaki karakterleri içeren ASCII dizeleridir . Girişte satır sonu yok. Herhangi bir girişin en az birini içereceğini varsayabilirsiniz , . ? !.

  • Girdide m'kayvaryantlarının hiçbirinin ya da hiçbirinin olmadığını varsayabilirsiniz .

    Girdiler STDIN, işlev argümanları, komut satırı veya benzeri herhangi bir şeyden alınabilir.

  • Çıkış, STDOUT, bir fonksiyon dönüşü veya benzeri bir şey olabilir.

Test durumları

  • Giriş: Test.

Mümkün çıktı: Test. M'kay.

  • Giriş: 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ümkün çıktı: 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.

  • Giriş: 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ümkün çıktı: 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.

  • Giriş: Do you understand? Really? Good!

Mümkün çıktı: Do you understand? MM'kay? Really? Good! MMM'kay!

puanlama

Bu , yani bayttaki en kısa kod kazanıyor, tamam mı?


10
+1, M'kay, ama bir Cartman mücadelesine ihtiyacımız var!
Level River St

16
@steveverrill, Cartman mücadelesindeki dilin burada ne yazık ki kabul edilebilir olacağından emin değil: P
Fatalize,

1
Ook'ta bir cevap görmek istiyorum! MM'kay! Fakat muhtemelen bu algoritmayı sözde rasgele sayı üreteci için kullanmak isteyeceksiniz .
mbomb007

3
@ Falize: Hepsi Kyle'ın annesinin suçu.
marinus

4
" M'kay?. Noktalama işaretleri ,, sonra eklenen rastgele% 50 şansı var ve! " "Uyumsuz görünüyor her zaman en az bir tane olmalıdır m'kayeklendi ". Lütfen açıklığa kavuşturmak
Luis Mendo

Yanıtlar:


13

CJam, 65 52 49 bayt

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

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

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

10 çalışmanın sonucu:

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

Açıklama:

  • {... }⍣≢: değer değişene kadar işlevi girişe uygulayın
    • M'kayHer karakter için bir tane oluşturun :
    • {... }¨⍵: girişteki her karakter için:
      • 'mM'[1+⍵≠',']/⍨?3: karakterin virgül olup olmamasına bağlı olarak 1 ila 3 ms veya Ms üret .
      • '''kay',⍨: dizeyi ekler 'kay.
      • ⍵,⍨: karakteri ekle
      • ' ',: bir boşluk hazırla.
    • (¯1+⌈?2×⍵∊',.!?')/¨: Her biri için M'kay, eğer karşılık gelen karakterlerden biri ise .,!?,% 50 şansla seç, yoksa% 0 şansla seç.
    • ⍉⍵⍪⍉⍪: her seçimi karakteriyle eşleştirin,
    • : Tüm basit elemanları (karakterleri) sırayla listeler.


Tamam, bu her zaman bir eklenen olduğunu nasıl zorlar?
Jerry Jeremiah

6
@JerryJeremiah: ⍣≢giriş çıkışla uyuşmayana kadar işlevi tekrar tekrar uygular. Biri eklenirse Yani, çıkış değiştirilir ve durana ve çıkışı verir ve bir ilave değilse, çıkış değişmeden kalır ve bir kadar tekrar çalıştırır edilir ekledi.
marinus

Bunu bir şekilde özledim. Bu çok zekice.
Jerry Jeremiah

2
@DmitryGrigoryev: Eğer geleneksel bir APL kodlaması kullanıyorsanız, gerçekten sadece 1 byte alıyor.
marinus

9

K5, 99 90 bayt

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

Eh, birileri bu tekme-başlatmak için gereken!

M. üst harekette daha az süslü bir yöntem kullanarak 9 bayt kurtarıldı

açıklama

{                                                                                        }  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 bayt sürümü

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

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

Bu, bir dizeyi kabul eden ve bir dize döndüren özyinelemeli bir işlev oluşturur.

Ungolfed + açıklama:

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

South Park'tan hoşlanmıyorum, ancak golfün heyecanı bunu başaramayacak kadar cazip geldi. Bir regex basitleştirmek için KRyan için teşekkürler, 1 bayt tasarruf.


6

JavaScript ES6, 79 86 108 bayt

Yapım çıkıyor Mtekrar bayt çok zaman alır.

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

Eski versiyon (tekrar etmiyor) (86 bayt)

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

Eski sürüm (tekrarlamaz, en az bir m'kay gerektirmez) (79 bayt) :

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

En eski sürüm:

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

Son sürüm bir ReferenceError'a sahip: t tanımlanmadı
Neil,

Sadece en eski sürüm aslında Test.girdi üzerinde çalışır .
Neil,

@Bunun olmaması gereken, benim için gayet iyi çalışıyor. Konsolda kullandığın kodu ekleyebilir misin
Downgoat

Gönderinizi parantez içinde ve sonra ("Test.")ona ekliyorum .
Neil,


4

C, 170 bayt

Ona ilk çatlak:

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 bayt

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 bayt

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

Okunabilirlik için satır sonları eklendi. Dizgiyi argüman olarak alarak isimsiz bir işlevi değerlendirir. ( kısaca \[Function].)

Ungolfed:

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

hBir noktalama kömürü alır ve yapar " m'kay,", " mm'kay,"rastgele ve uygun harfle vb.

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

fbir dize alır ve noktalama işaretlerini arar x; bulduğu zaman,% 50 olasılıkla uygun olanı h[x]ve% 50 gibi bir ifadeyi kullanır a[3, x]. Ayrıca i, değiştirilen noktalama işaretlerinin sayısı da güncellenir (her iki durumda da). Öyleyse f["X, x."]değerlendirebilir

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

Sonunda, 'ler gile ilgilenecek a.

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

CountaOraya kaç tane koyduğumuzu sayar ; eşitse i, noktalama işaretlerinin toplam sayısı, o zaman herhangi bir m'kay eklemedik. Bu durumda, gibi ifadelerimiz olacak a[0, _] ... a[i-1, _]ve atam olarak biri için bir m'kay döndürecek şekilde tanımladık 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)

Girintiniz oldukça berbat görünüyor: /
jazzpi

Biliyorum, sekmeler otomatik olarak boşluklara çevrilmiş.
Trang Oul

2

> <>, 150 bayt

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 boşa bayt, ancak yeniden düzenlemek için biraz sıkıldım. Ayrıca, bir Funge'de randomizasyon yapmak, golf oynamak zordur.


2

Perl, 93 89 88 bayt

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

Kesinlikle biraz daha golf oynayabilirsin!

Dom Hastings sayesinde 4 bayt kesildi


2

C ++ 290

Çözümüm

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çıklama değişkeni z, hangi noktalama işaretinin ve z = 0 'M' yerine 'm' kullandığını belirtir.

Ölçek

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=> -1veya ~0. Seçmek yerine ~0kullanmanıza izin verir ; Böylece koşullu hale gelir , 11 bayt tasarruf sağlar. -!=if(z-~0&&r)
Schism,

1

JavaScript ES6, 121 bayt

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

Verilen dize uygun noktalama işareti içermiyorsa kilitlenir.


1

Lua, 162 160 bayt

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)

Darth Plagueis The Wise'in trajedisini hiç duydunuz mu? MM'kay? Öyle düşünmemiştim. MMM'kay. Bu Jedi'nın size söyleyeceği bir hikaye değil. T'mam. Bu bir Sith efsanesi. Darth Plagueis, Sith'in Karanlık Lordu'ydu, tamam, o kadar güçlü ve o kadar akıllı ki, Midikloryalıları hayat yaratmak için etkilemek için Gücü kullanabilirdi. ölmek üzere. MM'kay. Gücün karanlık tarafı, bazılarının doğal olmadığını düşündüğü birçok yeteneğe giden yoldur. MM'kay. O kadar güçlüydü ki… korktuğu tek şey gücünü kaybetti, mmm'kay, ki sonunda, mm'kay, elbette, o yaptı. T'mam. Ne yazık ki, çıraklarına bildiği her şeyi öğretti, sonra çırağı uykusunda öldürdü. T'mam. İronik. Diğerlerini ölümden kurtarabilirdi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.