Mengapa? Untuk menyenangkan programmer kaya!

21

Pernahkah Anda ingin bertanya kepada kompiler "Mengapa?" Sebagian besar dari kita merasa frustrasi ketika kode tidak berfungsi sebagaimana mestinya. Karena itu Mathworks menerapkan fungsi kecil yang menyenangkan why,, yang menjawab pertanyaan. Untuk memberikan beberapa contoh dari 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.

Tugas Anda adalah mengimplementasikan whyfungsi dalam bahasa Anda. Fungsi harus bekerja dengan dan tanpa argumen input (sebagai alternatif, gunakan input 0atau -1). Fungsi harus dinamai why(atau, menulis why(n)dalam STDIN harus menghasilkan string yang sesuai untuk dicetak).

Jika tidak ada argumen yang diberikan, atau argumen itu nol atau negatif, string keluaran harus berupa frase acak dan valid. Jadi, harus ada fungsi why, why(), why(0)atau why(-1)yang kembali kalimat acak.

Jika argumen input, ndiberikan (argumen fungsi, bukan STDIN), output harus menjadi string ke-n (didefinisikan di bawah). Jadi, why(1)harus selalu menampilkan (mencetak / menampilkan) hasil yang sama.

Kalimat-kalimat dibangun sebagai berikut (Tipe 1, Tipe 2 dan Khusus). Semua kalimat diakhiri dengan !.

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

Daftar orang:

Stewie
Peter
Homer
The programmer
The system manager
You

Daftar akhiran:

suggested it
insisted on it
did it

Daftar kata kerja adalah:

To fool
To satisfy
To please

Daftar kata sifat:

the smart
the bald
the tall
the rich
the stupid

Daftar kasus khusus:

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

Cara untuk memilih yang bernomor adalah:

Jenis kalimat:

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

Nama: Nama ke-n didefinisikan menggunakan modulus (%).

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!

Akhir: Akhir n juga didefinisikan menggunakan modulus. Asumsikan akhir (1, 2 dan 3) terdaftar seperti (1 2 2 3). Karena angkanya selalu aneh, gunakan((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

Kata sifat: Kata sifat n didefinisikan dengan menggunakan modulus. Karena angkanya selalu genap, gunakan:(n % 10)/2

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

Kata kerja: Kata kerja n juga didefinisikan menggunakan modulus. Asumsikan kata kerja (1, 2 dan 3) terdaftar seperti (1 2 2 3)Karena angkanya selalu genap untuk kata kerja, gunakan(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

Sekarang, cara membuat yang acak harus cukup sederhana, cukup pilih yang acak n.

Beberapa contoh:

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!

Aturan golf kode standar berlaku. Pemenang akan dipilih satu minggu dari hari tantangan diposting.

Stewie Griffin
sumber
menulis mengapa di stdin harus mengembalikan string saya mungkin bisa bekerja dengannya. Apakah itu harus huruf kecil whyatau WHYdapat diterima?
Dennis
Huruf kecil dan huruf besar keduanya baik-baik saja.
Stewie Griffin
Juga Akhiran tidak perlu /2bekerja. Itu memberikan nilai fraksional. 13juga harus insisted(14/2 = 7% 4 = 3 = ke-2 dari yang bersikeras).
Jonathan Leech-Pepin
3
Apakah masalah jika Anda berakhir dengan kasus seperti the rich The programmeryang ditentukan the?
Jonathan Leech-Pepin
1
@StewieGriffin Kata-kata Thedan Todalam daftar Anda mungkin harus huruf kecil agar sesuai dengan contoh Anda ...
mbomb007

Jawaban:

5

JavaScript (ES6) 345

Tidak yakin tentang angka-angkanya, tapi ini usahaku.

Tes menjalankan cuplikan di bawah ini di peramban yang mendukung 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>

edc65
sumber
Jawaban bagus! Tidak dapat berbicara secara otoritatif tentang validitas angka, tetapi Anda dapat menghemat 1 byte (!) Menggunakan 0pembatas string Anda, bukan ,!
Dom Hastings
1
@HomHastings Saya pikir trik itu tidak lagi diperlukan dengan string template. split(0)memiliki panjang yang sama split','(berpura-pura ini adalah backticks)
edc65
Ahhh, maaf, saya pikir Anda bisa kehilangan tanda kurung, ini bukan naskah kopi! :)
Dom Hastings
3

C #, 502 byte

Proyek ini perlu memiliki AssemblyName diatur ke mengapa yang akan menghasilkan executable dengan nama yang benar.

Sepenuhnya golf:

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

Lekukan dan baris baru untuk kejelasan:

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

Contoh input / output:

>Why
To fool the bald Homer!
>Why 1
Stewie suggested it!
Makanan Tangan
sumber
2

Powershell 437 461 453 Bytes

Sunting: Kehilangan duplikat kata kerja

Membagi antara corpus dan perhitungan untuk byte-count

  • 267 Bytes = text Pra-kode (tidak termasuk to, the, itdan !tempat-tempat karena mereka telah tetap).
  • 186 Bytes = perhitungan

Tetapkan argumen default ke 0 jika tidak ditentukan. Jika argumen <1maka mendapat nomor acak <99 fn:1dan tayangan ulang. Secara teknis ini berarti -50akan berfungsi juga, diperlakukan sebagai kasus acak.

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

Penjelasan:

# 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 Dipilih untuk menyimpan byte. Jika ada lebih dari 99 kemungkinan kalimat di atas (tidak dihitung) naik menjadi 999 atau 9999 sebagaimana berlaku (+1/2 byte)

Jonathan Leech-Pepin
sumber
2

MUMPS, 379 byte

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)_"!"

Ketika tidak ada input yang diberikan, angka acak dalam 0,839 dihasilkan.

Pemakaian:

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

Strategi evaluasi kiri-ke-kanan MUMPS menghemat beberapa byte pada tanda kurung di sini.

Catatan: lihat string-string yang terlihat seperti itu "foo^bar^baz^qux"? Itulah yang disebut "string dibatasi", dan merupakan cara standar menyimpan daftar yang sesuai dengan batas ukuran string maksimum, karena MUMPS sebenarnya tidak memiliki daftar / array (atau, memang, struktur data selain pohon). Untuk daftar yang terlalu besar untuk ditampung dalam satu string, kami menggunakan pohon dengan kedalaman 1 dan meletakkan nilai pada daun pohon. Menyenangkan!

senshin
sumber
+1: MUMPS, dari semua bahasa, sangat membutuhkan whyfungsi. ;)
DLosc
1

Emacs Lisp 473 Bytes

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

'Pemborosan' terbesar mungkin adalah format, %s... bagian. Jika variabel bisa dimasukkan ke dalam string tanpa spesifikasi itu akan menghemat 10 byte %sdan 12 lagiformat

Jonathan Leech-Pepin
sumber
1

Ruby 396 378 372 byte

Saya yakin ini bukan golf maksimal.

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!'}

Sunting: Saya baru menyadari bahwa saya tidak tahu prioritas operator. Baiklah..

Peter Lenkefi
sumber
rand (21) tampaknya terlalu kecil
edc65
Bagaimana dengan 99? : P
Peter Lenkefi
Ada 108 kalimat majemuk + 3 kasus khusus. Urutan kalimat adalah periodik tetapi periode ... Saya tidak tahu
edc65
Periode ini mungkin 840 ... pilihan angka yang bagus
edc65
1

CJam, 281 byte

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!"]\(=}?

Permalink

Belum pernah menggunakan CJam sebelumnya, jadi saya akan ambil kiat. Saya yakin ada banyak trik yang saya tidak tahu!

(Saya tidak tahu bagaimana menamai ini sebagai fungsi yang disebut "mengapa" - tampaknya fungsi tidak ada di CJam - jadi saya tidak yakin apakah jawaban CJam baik-baik saja atau tidak ...)

tobii
sumber
Fungsi memang ada, tetapi hanya ada 26 nama fungsi yang valid (A hingga Z).
Dennis
1

Lua 5.3.0, 452 460 446 byte

Ini adalah upaya pertama saya di kode golf, jadi tolong perbaiki saya jika saya melakukan sesuatu yang salah!

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

Tidak Disatukan:

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
MeepDarknessMeep
sumber
0

Python (2), 692 byte

Saya masih belajar, jadi harap lembut! :)

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

Bekerja dengan atau tanpa int sebagai argumen baris perintah.

Saya mencoba untuk menekankan kebenaran kode sebanyak mungkin, seperti menghasilkan angka acak dari -sys.maxint - 1kesys.maxint dan menampilkan kalimat dalam kasus yang tepat.

Kode ini sangat bergantung pada pernyataan if yang saya yakin dapat diganti dengan sesuatu yang lebih efisien.

Umpan balik sangat diterima!

Tidak dikumpulkan (1341 bytes)

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

sumber
2
Saya sarankan Anda membaca [ codegolf.stackexchange.com/questions/54/… —khususnya, Anda dapat menyimpan banyak byte dengan menggunakan tip pertama pada halaman itu. Anda juga dapat mengindeks dari bagian belakang daftar kata kerja sehingga Anda hanya perlu satu "memuaskan": gunakan argument%8/2-1dan hapus yang kedua. Anda juga bisa mengganti ==0dengan <1.
lirtosiast