코드 골프 도전, m'kay


51

Mackey 는 자신이 말하는 모든 것에 "m'kay"를 추가 한 것으로 유명한 South Park 캐릭터입니다.

맥키 씨의 말로 텍스트 문자열을 변환하는 프로그램이나 함수를 작성하십시오.

M'kay 배치

  • m'kay갖는 임의의 확률이 50 % 첨가되는 구두점을 후 ,, ., ?! . 이 경우 앞에 오는 공백과 같은 문장 부호가 뒤 따릅니다.

    예를 들어, 문장 에는 쉼표 뒤에 그리고 마침표 뒤에 각 장소에서 50 %의 확률로 추가 할 수있는 Test, test.두 곳이 m'kay있습니다. 가능한 결과는 다음과 같습니다 Test, m'kay, test. 또는 Test, test. M'kay.Test, m'kay, test. M'kay..

  • 항상 하나 이상 m'kay추가 해야합니다 . 또한 항상 같은 장소에 m'kay있을 수는 없으며 추가 할 수있는 각 유효한 장소 는 반드시 같은 확률로 발생해야합니다. 즉, m'kay임의성으로 인해 결코 추가하지 않은 경우 문자열 끝에 항상 추가 할 수는 없습니다 m'kay. 이 하나만있는 경우 존재하는 경우 m'kay에도 유효한 각 위치에 나타날 확률이 동일해야합니다.

  • 경우 m'kay이후 ?, .또는 !의를 m대문자로해야합니다.

  • 의 수 m에서이 m'kayuniformely, 즉 (1)과 (3) 사이에 촬상되어야한다 m'kay, mm'kay그리고 mmm'kay이 대문자로되어야하는 경우 (규칙 위 참조) ... 0.33 확률로 모든 가능한 선택, 각이며, 모두 m대문자되어야한다.

입력, 출력

  • 입력은 ASCII Dec 32 (Space)에서 ASCII Dec 126 (Tilde ~) 까지의 문자를 포함하는 ASCII 문자열 입니다. 입력에 줄 바꿈이 없습니다. 입력 내용 중 하나 이상이 포함되어 있다고 가정 할 수 있습니다 , . ? !.

  • m'kay입력에 해당 변형 이 없거나 있다고 가정 할 수 있습니다 .

    STDIN, 함수 인수, 명령 행 또는 이와 유사한 항목에서 입력을 가져올 수 있습니다.

  • 출력은 STDOUT, 함수 리턴 또는 이와 유사한 것을 통해 이루어질 수 있습니다.

테스트 사례

  • 입력: Test.

가능한 출력 : Test. M'kay.

  • 입력: 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.

가능한 출력 : 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.

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

가능한 출력 : 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.

  • 입력: Do you understand? Really? Good!

가능한 출력 : Do you understand? MM'kay? Really? Good! MMM'kay!

채점

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다. m'kay?


10
+1, 알았지 만 카트 맨 도전이 필요합니다!
Level River St

16
@steveverrill 카트 맨 챌린지의 언어가 슬프게도 여기에서 받아 들여질 지 확신하지 못합니다 : P
Fatalize

1
Ook에서 답을보고 싶습니다! MM'kay! 그러나 의사 난수 생성기 에이 알고리즘을 사용하고 싶을 것입니다 .
mbomb007

3
@ 운명 : 모든 카일의 엄마의 잘못입니다.
marinus

4
" M'kay, 구두점 뒤에 무작위로 50 %의 확률이 추가됩니다..,? 및! "는 " 적어도 하나 이상 m'kay추가 되어야합니다 "와 호환되지 않는 것 같습니다 . 그 명확히하십시오
루이스 Mendo

답변:


13

CJam, 65 52 49 바이트

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

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

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 회 실행 결과 :

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

설명:

  • {... }⍣≢: 값이 변경 될 때까지 입력에 기능을 적용합니다
    • M'kay각 문자에 대해를 생성하십시오 .
    • {... }¨⍵: 입력의 각 문자에 대해 :
      • 'mM'[1+⍵≠',']/⍨?3: 문자가 쉼표인지 아닌지에 따라 1 ~ 3 m초 를 생성 M합니다.
      • '''kay',⍨: 문자열을 추가하십시오 'kay.
      • ⍵,⍨: 캐릭터 추가
      • ' ',: 공백을 추가합니다.
    • (¯1+⌈?2×⍵∊',.!?')/¨: 각 M'kay' 에 대해 해당 문자가 중 하나 인 .,!?경우 50 % 확률로 선택하고 그렇지 않으면 0 % 확률로 선택하십시오.
    • ⍉⍵⍪⍉⍪: 각 선택을 캐릭터와 일치시킵니다.
    • : 모든 간단한 요소 (문자)를 순서대로 나열합니다.


좋아, 이것은 항상 추가되는 것을 어떻게 강화합니까?
Jerry Jeremiah

6
@JerryJeremiah : ⍣≢입력이 출력과 일치하지 않을 때까지 함수를 반복해서 적용합니다. 하나를 추가한다면, 출력이 변경되고이 정지하고 출력을 반환하고, 하나가 추가되어 있지 않은 경우, 출력은 그대로 유지 하나가 될 때까지 다시 실행 됩니다 덧붙였다.
marinus

나는 어떻게 든 그것을 놓쳤다. 매우 영리합니다.
Jerry Jeremiah

2
@DmitryGrigoryev : 전통적인 APL 인코딩을 사용하는 경우 실제로 1 바이트 만 걸립니다.
marinus

9

K5, 99 90 바이트

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

글쎄, 누군가 가 이것을 시작해야했습니다!

덜 복잡한 M을 대문자로 사용하여 9 바이트를 절약했습니다.

설명

{                                                                                        }  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 바이트 버전

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

7

줄리아 mm'kay, 115 114 바이트

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

문자열을 받아들이고 문자열을 반환하는 재귀 함수를 만듭니다.

언 골프 + 설명 :

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

나는 사우스 파크를 싫어하지만 골프의 스릴은 이것을 넘기에는 너무 유혹적이었습니다. 1 바이트를 절약하여 정규식을 단순화 한 KRyan에게 감사합니다.


6

자바 스크립트 ES6, 79 (86) 108 바이트

제작 밝혀 M반복 바이트 많이 걸립니다.

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

이전 버전 (반복되지 않음) (86 바이트)

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

이전 버전 (반복하지 않고 적어도 하나의 m'kay가 필요하지 않음) (79 바이트) :

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

가장 오래된 버전 :

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

최신 버전에는 ReferenceError가 있습니다 : t is not defined
Neil

가장 오래된 버전 만 실제로 Test.입력에서 작동 합니다.
Neil

@Neil이 발생해서는 안되며 나에게 잘 작동합니다. 콘솔에서 사용중인 코드를 추가 할 수 있습니까
Downgoat

제출물을 괄호로 묶은 다음 접미사 ("Test.")로 묶 습니다.
Neil


4

C, 170 바이트

먼저 균열 :

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

언 골프 드 :

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

스칼라, 191 바이트

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

수학, 202 바이트

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

가독성을 위해 줄 바꿈이 추가되었습니다. 문자열을 인수로 사용하는 익명 함수로 평가합니다. (의 줄임말입니다 \[Function].)

언 골프 드 :

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

h구두점 문자를 받아 그것을하게 " m'kay,", " mm'kay,"무작위로 적절하게 대문자, 등.

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

f문자열을 사용하여 문장 부호 문자를 찾습니다 x. 그것을 찾으면, 적절한 확률로 50 % 확률로 h[x], 그리고 같은 식으로 50 %를 차지합니다 a[3, x]. 또한 i교체 된 총 구두점 수 (두 경우 모두)로 업데이트 됩니다. 따라서 f["X, x."]평가할 수 있습니다

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

마지막으로의 g를 처리합니다 a.

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

Counta우리가 거기에 얼마나 많은 것을 넣었 는지 계산할 것입니다. i총 구두점 수 와 같으면 m'kays를 추가하지 않았습니다. 이 경우와 같은 표현식이 있으며 정확히 하나에 대해 m'kay를 반환하도록 a[0, _] ... a[i-1, _]정의 합니다.a0..i-1


2

파이썬 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)

언 골프 드 :

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)

들여 쓰기가 엉망인 것 같습니다 : /
jazzpi

탭이 자동으로 공백으로 변환되었습니다.
Trang Oul

2

> <>, 150 바이트

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 바이트가 낭비되었지만 재배치하려고 조금 지루했습니다. 또한, Funge에서의 무작위 배정은 골프하기가 어렵습니다.


2

펄, 93 89 88 바이트

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

확실히 더 골프를 칠 수 있습니다!

Dom Hastings 덕분에 4 바이트 차단


2

C ++ 290

내 솔루션

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

설명 변수 Z는 구두점 및 z = 0이 아닌 'M'보다 'm'을 사용 나타내는 결정.

테스트

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=> -1또는 ~0. 선택 ~0하면 -대신 사용할 수 있습니다 !=. 따라서 조건부는 if(z-~0&&r)11 바이트 가 절약됩니다.
Schism

1

자바 스크립트 ES6, 121 바이트

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

주어진 문자열에 적절한 문장 부호가 없으면 충돌이 발생합니다.


1

루아, 162160 바이트

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)

다스 플라 게이스 와이즈의 비극을 들어 본 적이 있습니까? MM'kay? 나는 생각하지 않았다. 음. 그것은 제다이가 당신에게 말할 이야기가 아닙니다. 알았어 시스 전설입니다. Darth Plagueis는 Sith의 어두운 군주였습니다. m'kay, 매우 강력하고 현명하게도 힘을 사용하여 midichlorians에 영향을 주어 생명을 창조 할 수있었습니다. 죽어가는 것에서. MM'kay. 힘의 어두운면은 일부 사람들이 부 자연스럽게 생각하는 많은 능력의 통로입니다. MM'kay. 그는 너무 강력 해졌습니다. 그가 두려워하는 유일한 것은 그의 힘을 잃는 것이 었습니다. 알았어 불행히도, 그는 도제에게 그가 아는 ​​모든 것을 가르쳤다. 알았어 아이러니 그는 다른 사람들을 죽음에서 구할 수있었습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.