どうして?金持ちのプログラマーを喜ばせるために!


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またはを使用します-1)。関数には名前を付ける必要がありますwhy(または、why(n)STDIN に書き込むと、適切な文字列が出力されるはずです)。

引数が指定されていない場合、または引数がゼロまたは負の場合、出力文字列はランダムで有効なフレーズでなければなりません。だから、機能があるはずwhywhy()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

さて、ランダムなものを作成する方法は非常に簡単で、単にrandomを選択する必要があります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週間で勝者が選ばれます。


なぜ標準入力で文字列返す必要があるのか​​を書くと、私はそれで作業できるかもしれません。小文字にするwhy必要がWHYありますか?
デニス

大文字小文字はどちらでも構いません。
スティーヴィーグリフィン

また、エンディングは機能する必要はありません/2。それは小数値を与えます。13またなければならないinsisted(14/2 = 7%主張の4 = 3 = 2)。
ジョナサンリーチペピン

3
あなたthe rich The programmerが指定されたためのようなケースで終わるかどうかは問題theですか?
ジョナサンリーチペピン

1
@StewieGriffin あなたのリストの単語TheToリストは、おそらくあなたの例に合わせて小文字にする必要があります
...-mbomb007

回答:


5

JavaScript(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バイト(!)を節約できます。
ドムヘイスティングス

1
@DomHastingsテンプレート文字列ではトリックはもう必要ないと思います。split(0)同じ長さですsplit','(これらはバック
ティックの

ああ、ごめんなさい、かっこを失うかもしれないと思っていました、これはコーヒースクリプトではありません!:)
ドムヘイスティングス

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バイト=プリコーディングされたテキストは(除くtotheitおよび!ので、それらが固定されている箇所)。
  • 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

ムンプス、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

Emacs 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
ピーターレンケフィ

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を使用したことがないので、ヒントを取り上げます。私は知らないトリックがたくさんあると確信しています!

(これを「なぜ」と呼ばれる関数と名付ける方法がわかりませんでした-CJamには関数が存在しないようです-CJamの答えが大丈夫かどうかはわかりません...)


関数存在しますが、有効な関数名は26個のみです(AからZ)。
デニス

1

Luaの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

Python(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の有無にかかわらず動作します。

toから乱数を生成し、正しいケースで文を表示-sys.maxint - 1するsys.maxintなど、コードの正確性を可能な限り強調するようにしました。

コードは、より効率的な場所に置き換えることができると確信しているif文に大きく依存しています。

フィードバックは大歓迎です!

Ungolfed(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/…を読むことをお勧めします。特に、そのページの最初のヒントを使用すると、多くのバイトを節約できます。また、動詞リストの後ろからインデックスを作成して、1つだけの「満足」が必要ですargument%8/2-1。2番目の「使用」と「削除」を使用します。また、置き換えることができ==0<1
リトシアスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.