왜? 풍부한 프로그래머를 기쁘게합니다!


21

컴파일러에게 "왜?" 우리 대부분은 코드가 제대로 작동하지 않을 때 좌절했습니다. 따라서 Mathworks는 why질문에 답하는 멋진 작은 기능을 구현했습니다 . MATLAB에서 몇 가지 예를 제공하려면 :

why
The programmer suggested it.

why
To fool the tall good and smart system manager.    

why(2)
You insisted on it.

why(46)
Bill insisted on it.

당신의 임무는 why당신의 언어로 기능 을 구현하는 것입니다. 이 함수는 입력 인수를 사용 0하거나 사용하지 않고 작동해야합니다 ( 또는 input 또는 -1). 함수의 이름을 지정해야합니다 why(또는 why(n)STDIN으로 쓰면 적절한 문자열이 인쇄됩니다).

인수가 제공되지 않거나 인수가 0 또는 음수이면 출력 문자열은 임의의 유효한 구문이어야합니다. 그래서,이 함수해야한다 why, why(), why(0)또는 why(-1)반환하는 임의의 문장.

입력 인수 n가 제공 되면 (STDIN이 아닌 함수 인수) 출력은 n 번째 문자열이어야합니다 (아래에 정의 됨). 따라서 why(1)항상 동일한 결과를 출력 (인쇄 / 표시)해야합니다.

문장은 다음과 같이 구성됩니다 (유형 1, 유형 2 및 특수). 모든 문장은로 끝납니다 !.

"Person" "ending" !
"Verb" "adjective" "Person" !
A list of special cases

명단 :

Stewie
Peter
Homer
The programmer
The system manager
You

엔딩 목록 :

suggested it
insisted on it
did it

동사 목록은 다음과 같습니다.

To fool
To satisfy
To please

형용사 목록 :

the smart
the bald
the tall
the rich
the stupid

특별한 경우 목록 :

How should I know?
Stop asking!
Don't ask!

번호가 매겨진 것을 선택하는 방법은 다음과 같습니다.

문장의 종류 :

Odd number => Type 1
Even number => Type 2
n % 7 = 0 => Type 3 (% is the modulus operator)

이름 : n 번째 이름은 모듈러스 (%)를 사용하여 정의됩니다.

n = 1:   1 % 7  => Stewie
n = 2:   2 % 7  => Peter
...
n = 6:   6 % 7  => You
n = 7:   7 % 7  => How should I know?
n = 11:  11 % 7 => The programmer
n = 14:  14 % 7 => Stop asking!
n = 21:  21 % 7 => Don't ask!

엔딩 : n 번째 엔딩은 모듈러스를 사용하여 정의됩니다. 엔딩 (1, 2 및 3)이 다음과 같이 나열되어 있다고 가정합니다 (1 2 2 3). 숫자가 항상 홀수이므로((n+1)/2 % 4)

n = 1:    ((1+1)/2 % 4)  => suggested it
n = 3:    ((3+1)/2 % 4)  => insisted on it
n = 13:   ((13+1)/2 % 4) => did it

형용사 : n 번째 형용사는 모듈러스를 사용하여 정의됩니다. 숫자는 항상 짝수이므로 다음을 사용하십시오.(n % 10)/2

n = 2:   (2 % 10)/2 => Smart
n = 6:   (6 % 10)/2 => The tall
...

동사 : n 번째 동사는 모듈러스를 사용하여 정의됩니다. 동사 (1, 2 및 3)가 다음과 (1 2 2 3)같이 나열되어 있다고 가정하십시오 . 숫자는 항상 동사에 대해 짝수이므로(n % 8) / 2

n = 2:   (2 % 8)/2 => To fool
n = 4:   (4 % 8)/2 => To satisfy
n = 6:   (6 % 8)/2 => To satisfy
n = 8:   (8 % 8)/2 => To please

이제 랜덤을 생성하는 방법은 매우 간단해야합니다 n. 랜덤을 선택하면 됩니다.

몇 가지 예 :

why
You suggested it!

why
To fool the tall Homer!

why
Don't ask!

why(1)
Stewie suggested it!

why(14)
Stop asking!

why(8)
To please the rich Stewie!

표준 코드 골프 규칙이 적용됩니다. 당첨자는 챌린지가 게시 된 날로부터 1 주일 후에 선정됩니다.


stdin에서 왜 내가 사용할 수 있는 문자열을 반환 해야하는지 쓰기 . 이 소문자 할 필요가 있습니까 why또는 것 WHY받아 들일 수?
Dennis

소문자와 대문자 모두 괜찮습니다.
Stewie Griffin

또한 엔딩이 /2작동 하지 않아도 됩니다. 분수 값을 제공합니다. 13또한 insisted(14 / 2 = 7 % 4 = 3 = 2 차 주장) 이어야합니다 .
Jonathan Leech-Pepin

3
당신 the rich The programmer이 특정으로 인해 같은 경우로 끝나는 경우 중요합니까 the?
Jonathan Leech-Pepin

1
@StewieGriffin 단어 TheTo목록에 있는 단어 는 아마도 귀하의 예와 일치하는 소문자 여야합니다.
mbomb007

답변:


5

자바 스크립트 (ES6) 345

숫자에 대해서는 확실하지 않지만 여기 내 시도가 있습니다.

EcmaScript 호환 브라우저에서 아래 스 니펫을 테스트하십시오.

why=n=>(n<1?n=Math.random()*840|0:0,s="suggested,insisted on,did,fool,satisfy,please,stupid,smart,bald,tall,rich,Don't ask!,How should I know?,Stop asking!,Stewie,Peter,Homer,programmer,system manager,You".split`,`,n%7?(p=s[n%7+13],n&1?(p>'a'?'The ':'')+p+` ${s['2011'[-~n/2%4]]} it!`:`To ${s['5344'[n%8/2]]} the ${s[n/2%5+6]} ${p}!`):s[11+n%3])  

for(o='',i=0;++i<1e3;)o+=i+':'+why(i)+'\n';O.innerHTML=o

function test() { R.innerHTML=why(+I.value) }

// Less golfed

WHY=n=>(
  n=n<1?Math.random()*999|0:n,
  s=["suggested", "insisted on", "did", "fool", "satisfy", "please",
     "stupid", "smart", "bald", "tall", "rich",
     "Don't ask!", "How should I know?", "Stop asking!",
     "Stewie", "Peter", "Homer", "programmer", "system manager", "You"],
  n%7
    ? ( p=s[n%7+13],
        n&1
        ? (p>'a'?'The ':'')+p+` ${s['2011'[-~n/2%4]]} it!`
        : `To ${s['5344'[n%8/2]]} the ${s[n/2%5+6]} ${p}!`)
    : s[11+n%3]
)  
#O { height:300px; width:50%; overflow:auto }
#I { width:2em }
Why(<input id=I>)<button onclick=test()>-></button><span id=R></span>
<pre id=O>


좋은 대답입니다! 숫자의 유효성에 대해 권위있게 말할 수는 없지만 0대신 문자열 구분 기호로 1 바이트 (!)를 절약 할 수 있습니다 ,!
Dom Hastings

1
@DomHastings 템플릿 문자열에는 트릭이 더 이상 필요하지 않다고 생각합니다. split(0)의 길이는 동일합니다 split','(이것은 백틱 인 척)
edc65

아, 죄송합니다. 대괄호를 잃을 수 있다고 생각했습니다. 이것은 커피 스크립트가 아닙니다! :)
Dom Hastings

3

C #, 502 바이트

이 프로젝트에는 AssemblyName 이 올바른 이름으로 실행 파일을 생성하는 이유로 설정 되어 있어야합니다 .

완전 골프 :

using System;class W{static void Main(string[]i)int n=i.Length>0?int.Parse(i[0]):new Random().Next();string[]s={"Don't ask!","How should I know?","Stop asking!"},v={"To please ","To fool ","To satisfy ",null},a={"the stupid","the smart","the bald","the tall","the rich"},p={"","Stewie","Peter","Homer","The programmer","The system manager","You"},e={"suggested it!","insisted on it!",null,"did it!"};Console.Write(n%7<1?s[n%3]:n%2<1?(v[n%8/2]??v[2])+a[n%10/2]+" {0}!":"{0} "+(e[n/2%4]??e[1]),p[n%7]);}}

명확성을위한 들여 쓰기 및 줄 바꿈 :

using System;
class W{
    static void Main(string[]i)
        int n=i.Length>0
            ?int.Parse(i[0])
            :new Random().Next();
        string[]
            s={"Don't ask!","How should I know?","Stop asking!"},
            v={"To please ","To fool ","To satisfy ",null},
            a={"the stupid","the smart","the bald","the tall","the rich"},
            p={"","Stewie","Peter","Homer","The programmer","The system manager","You"},
            e={"suggested it!","insisted on it!",null,"did it!"};
        Console.Write(
            n%7<1
                ?s[n%3]
                :n%2<1
                    ?(v[n%8/2]??v[2])+a[n%10/2]+" {0}!"
                    :"{0} "+(e[n/2%4]??e[1]),
            p[n%7]
        );
    }
}

입력 / 출력 예 :

>Why
To fool the bald Homer!
>Why 1
Stewie suggested it!

2

Powershell 437 461 453 바이트

편집 : 중복 동사를 놓쳤다

코퍼스와 바이트 수 계산 사이의 분할

  • 267 바이트 = 프리 코딩 된 텍스트 (제외 to, the, it그리고 !이후 그들이 해결 한 곳).
  • 186 바이트 = 계산

지정하지 않으면 기본 인수를 0으로 설정합니다. 인수가 <1임의의 숫자 인 경우 <99 fn:1다시 실행됩니다. 기술적으로 이것은 -50임의의 경우로 취급되어 작동합니다.

function why{param($b=0)$p=@('Stewie','Peter','Homer','The programmer','The system manager','You');$e=@('did','suggested','insisted on','insisted on');$v=@('please','fool','satisfy','satisfy');$a=@('stupid','smart','bald','tall','rich');$s=@("Don't ask!",'How should I know?','Stop asking!');if($b-le0){why(Get-Random 99)}elseif(!($b%7)){$s[$b/7%3]}else{$n=$p[$b%7-1];if($b%2){"$n $($e[($b+1)/2%4]) it!"}else{"To $($v[$b%8/2]) the $($a[$b%10/2]) $n!"}}}

설명:

# Any -1 in calculations is to account for arrays starting at index 0
# Final key placed in position 0 for indexing (4%4 = 0)
# Powershell 1 = True, 0 = False
if($b-le0){why(Get-Random 99)}          # If not positive, choose random number
elseif(!($b%7))                         # $b%7 means special so use that
  {$s[$b/7%3]}                          # Divide by 7 and find modulo, use that phrase.
else{$n=$p[$b%7-1]                      # Get the correct person (Used in both types). 6 max
if($b%2){"$n $($e[($b+1)/2%4]) it!"}    # Create type 1 sentence
else{"To $($v[$b%8/2]) the $($a[$b%10/2]) $n!"} # Type 2

fn:199 바이트 저장을 선택했습니다. 위의 99 개 이상의 가능한 문장이있는 경우 (계산하지 않은 경우) 해당되는 경우 999 또는 9999로 증가시킵니다 (+1/2 바이트)


2

MUMPS, 379 바이트

f(s,i) s:'i i=$L(s,"^") q $P(s,"^",i)
why(n) s:'n n=$R(840) s p="Stewie^Peter^Homer^The programmer^The system manager^You",e="suggested^insisted on^did",v="fool^satisfy^please",a="smart^bald^tall^rich^stupid",s="How should I know?^Stop asking!^Don't ask!" q:n#7=0 $$f(s,n#3) q:n#2 $$f(p,n#7)_" "_$$f(e,n+1/2#4)_" it!" q "To "_$$f(v,n#8/2)_" the "_$$f(a,n#10/2)_" "_$$f(p,n#7)_"!"

입력이 없으면 0..839의 난수가 생성됩니다.

용법:

>w $$why(15)
Stewie did it!
>w $$why()
Don't ask!

MUMPS의 왼쪽에서 오른쪽으로 평가 전략은 여기에서 괄호로 몇 바이트를 절약합니다.

참고 사항 : 다음과 같은 문자열을 보 "foo^bar^baz^qux"시겠습니까? MUMPS에는 실제로 목록 / 배열 (또는 실제로 트리 이외의 데이터 구조)이 없기 때문에 소위 "구분 된 문자열"이며 최대 문자열 크기 제한에 맞는 목록을 저장하는 표준 방법입니다. 단일 문자열에 맞추기에는 너무 큰 목록의 경우 대신 깊이 1의 나무를 사용하고 값을 나무의 잎에 놓습니다. 장난!


+1 : 모든 언어 중에서 MUMPS에는 실제로 why기능 이 필요 합니다. ;)
DLosc

1

이맥스 Lisp 473 바이트

(defun why(n)(if(and n(> n 0))(let*((p'(t"Stewie""Peter""Homer""The programmer""The system manager""You"))(e'("did""suggested""insisted on""insisted on"))(v'("please""fool""satisfy""satisfy"))(a'("stupid""smart""bald""tall""rich"))(s'("Don't ask!""How should I know?""Stop asking!"))(q(nth(% n 7)p)))(cond((=(% n 7)0)(nth(%(/ n 7)3)s))((=(% n 2)1)(format"%s %s it!"q(nth(%(/(1+ n)2)4)e)))(t(format"To %s the %s %s!"(nth(/(% n 8)2)v)(nth(/(% n 10)2)a)q))))(why(random 99))))

가장 큰 '낭비'아마입니다 format, %s... 섹션. 변수가 사양없이 문자열에 인라인 될 수 있다면 10 바이트를 절약 %s하고 다른 12 바이트를 절약 할 수 있습니다format


1

루비 396 378 372 바이트

나는 이것이 최대로 골프되지 않았다고 확신합니다.

p=%w[a Stewie Peter Homer The\ programmer The\ system\ manager You]
why=->n{n<1 ? why[rand(99)+1]:n%7<1 ? $><<%w[a How\ should\ I\ know? Stop\ asking! Don't\ ask!][n/7]:n%2<1 ? $><<'To '+%w[fool satisfy satisfy please][n%8/2-1]+' the '+%w[smart bald tall rich stupid][n%10/2-1]+' '+p[n%7]+?!:$><<p[n%7]+' '+%w[a suggested insisted\ on insisted\ on did][(n+1)/2%4]+' it!'}

편집 : 나는 연산자 우선 순위를 모른다는 것을 깨달았습니다. 오 잘 ..


rand (21)은 너무 작게 보입니다
edc65

99 는요? : P
Peter Lenkefi

108 개의 복합 문장과 3 개의 특수한 경우가 있습니다. 문장의 순서는 주기적이지만 기간은 ... 모르겠다
edc65

기간은 아마 840 ... 좋은 숫자 선택
edc65

1

CJam, 281 바이트

99mrqi_])0>=i:A7md{;A2%{S["suggested""insisted on""did"]A2/=+" it"+}{"To "["fool""satisfy"_"please"]A(2/:B=" the "["smart""bald""tall""rich""stupid"]B=SM}?[M"Stewie""Peter""Homer""The programmer""The system manager""You"]A=\'!}{["How should I know?""Stop asking!""Don't ask!"]\(=}?

퍼머 링크

CJam을 사용하지 않았으므로 팁을 드리겠습니다. 내가 모르는 트릭이 많이 있다고 확신합니다!

(이를 "why"라는 함수로 이름을 지정하는 방법을 알 수 없었습니다. CJam에는 함수가 존재하지 않는 것 같습니다. 따라서 CJam의 대답이 맞는지 확실하지 않습니다 ...)


함수 존재하지만 유효한 함수 이름은 26 개 (A ~ Z)입니다.
Dennis

1

루아 5.3.0, 452 460 446 바이트

이것은 코드 골프에서 처음 시도한 것이므로 내가 잘못한 것을 수정하십시오!

a={"Stewie","Peter","Homer","The Programmer","The system manager","You"}b={"fool ","satisfy ",n,"please "}b[3]=b[2]why=function(n)pcall(math.randomseed,n and n>0 and n)n=math.random(1e9)q=n>>4r=n>>8return 1>n&7 and({"How should I Know?","Stop asking!","Don't ask!"})[q%3+1]or 0<n%2 and a[q%6+1]..({" suggested"," insisted on"," did"})[r%3+1].." it"or"To "..b[q%4+1].."the "..({"smart ","bald ","tall ","rich ","stupid "})[r%5+1]..a[(r>>4)%6+1]end

언 골프 드 :

a={
    "Stewie",
    "Peter",
    "Homer",
    "The Programmer",
    "The system manager",
    "You"
}
b={
    "fool ",
    "satisfy ",
    n,
    "please "
}
b[3]=b[2]
why=function(n)
    pcall(math.randomseed,n and n>0 and n)
    n=math.random(1e9)
    q=n>>4
    r=n>>8
    return
            1>n&7 and
                ({"How should I Know?","Stop asking!","Don't ask!"})[q%3+1]
            or 0<n%2 and
                a[q%6+1]..({" suggested"," insisted on"," did"})[r%3+1].." it"
            or
                "To "..b[q%4+1].."the "..({"smart ","bald ","tall ","rich ","stupid "})[r%5+1]..a[(r>>4)%6+1]
end

0

파이썬 (2), 692 바이트

나는 아직도 배우고 있으므로 조심하십시오! :)

from sys import argv,maxint
import random
def why(*O):
 P=["You","Stewie","Peter","Homer","programmer","system manager"];E=["did","suggested","insisted on","insisted on"];I=["please","fool","satisfy","satisfy"];Q=["stupid","smart","bald","tall","rich"];S=["Don't ask!","How should I know?","Stop asking!"]
 if len(argv)>1:A=O[0]
 else:A=random.randint(-maxint-1,maxint)
 if A%7==0:print S[A%3]
 else:
  M=P[A%6]
  if A%11==0:
   M=P[4]
  if A%2==0:
   if M==P[0]:M="you"
   U=I[(A%8)/2];Z=Q[(A%10)/2];print"To %s the %s %s!"%(U,Z,M)
  if A%2==1:
   if M==P[4]:M="The %s"%P[4]
   if M==P[5]:M="The %s"%P[5]
   C=E[((A+1)/2)%4];print"%s %s it!"%(M,C)
if len(argv)>1:why(int(argv[1]))
else:why()

int와 함께 또는 명령 줄 인수로 int없이 작동합니다.

나는에서 난수를 생성하는 것과 같이, 가능한 한 코드의 정확성을 강조하기 위해 노력 -sys.maxint - 1sys.maxint하고 오른쪽 경우 문장을 표시.

이 코드는 if 문이 더 효율적인 장소로 대체 ​​될 수 있다고 확신합니다.

피드백은 매우 환영합니다!

언 골프 (1341 바이트)

from sys import argv, maxint
import random

def Why(*Optional):
    Persons = ["You", "Stewie", "Peter", "Homer", "programmer", "system manager"]
    Endings = ["did it", "suggested it", "insisted on it", "insisted on it"]
    Verbs = ["please", "fool", "satisfy", "satisfy"]
    Adjectives = ["stupid", "smart", "bald", "tall", "rich"]
    SpecialCases = ["Don't ask!", "How should I know?", "Stop asking!"]

    if len(argv) > 1:
        Argument = Optional[0]
    else:
        Argument = random.randint(-maxint - 1, maxint)

    if Argument % 7 is 0:
        print SpecialCases[Argument % 3]
    else:
        Person = Persons[(Argument) % 6]
        if Argument % 11 is 0:
            Person = "programmer"
        if Argument % 2 is 0:
            if Person is "You":
                Person = "you"
            Verb = Verbs[(Argument % 8) / 2]
            Adjective = Adjectives[(Argument % 10) / 2]
            print "To %s the %s %s!" % (Verb, Adjective, Person)
        if Argument % 2 is 1:
            if Person is "programmer":
                Person = "The programmer"
            if Person is "system manager":
                Person = "The system manager"
            Ending = Endings[((Argument + 1) / 2) % 4]
            print "%s %s!" % (Person, Ending)

if len(argv) > 1:
    Why(int(argv[1]))
else:
    Why()

2
[ codegolf.stackexchange.com/questions/54/… 를 읽는 것이 좋습니다 . 특히 해당 페이지의 첫 번째 팁을 사용하여 많은 바이트를 절약 할 수 있습니다. 동사 목록의 뒷면에서 색인을 생성 할 수 있으므로 하나의 "만족"만 필요합니다 argument%8/2-1. 두 번째 것을 사용 하고 제거하십시오. 또한 대체 할 수 있습니다 ==0<1.
lirtosiast
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.