Tại sao? Để làm hài lòng các lập trình viên giàu có!


21

Bạn đã bao giờ muốn hỏi trình biên dịch "Tại sao?" Hầu hết chúng ta đã thất vọng khi mã không hoạt động như bình thường. Mathworks do đó đã thực hiện một chức năng nhỏ why, trả lời câu hỏi. Để đưa ra một vài ví dụ từ 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.

Nhiệm vụ của bạn là thực hiện whychức năng trong ngôn ngữ của bạn. Hàm nên hoạt động có và không có đối số đầu vào (sử dụng thay thế đầu vào 0hoặc -1). Hàm phải được đặt tên why(hoặc, viết bằng why(n)STDIN sẽ dẫn đến chuỗi thích hợp được in).

Nếu không có đối số nào được đưa ra hoặc đối số bằng 0 hoặc âm, chuỗi đầu ra phải là cụm từ ngẫu nhiên, hợp lệ. Vì vậy, cần có một chức năng why, why(), why(0)hoặc why(-1)rằng lợi nhuận một câu ngẫu nhiên.

Nếu một đối số đầu vào, nđược đưa ra (đối số hàm, không phải STDIN), đầu ra phải là chuỗi thứ n (được xác định bên dưới). Vì vậy, why(1)phải luôn luôn xuất (in / hiển thị) cùng một kết quả.

Các câu được xây dựng như sau (Loại 1, Loại 2 và Đặc biệt). Tất cả các câu kết thúc bằng !.

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

Danh sách những người:

Stewie
Peter
Homer
The programmer
The system manager
You

Danh sách kết thúc:

suggested it
insisted on it
did it

Danh sách các động từ là:

To fool
To satisfy
To please

Danh sách các tính từ:

the smart
the bald
the tall
the rich
the stupid

Danh sách các trường hợp đặc biệt:

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

Cách để chọn một số được đánh số là:

Loại câu:

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

Tên: Tên thứ n được xác định bằng mô-đun (%).

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!

Kết thúc: Kết thúc thứ n cũng được xác định bằng cách sử dụng mô đun. Giả sử các kết thúc (1, 2 và 3) được liệt kê như thế nào (1 2 2 3). Vì các số luôn là số lẻ, hãy sử dụng((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

Tính từ: Tính từ thứ n được xác định bằng cách sử dụng mô đun. Vì các số luôn luôn chẵn, sử dụng:(n % 10)/2

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

Động từ: Động từ thứ n cũng được xác định bằng cách sử dụng mô đun. Giả sử các động từ (1, 2 và 3) được liệt kê như (1 2 2 3)As Các số luôn luôn chẵn cho các động từ, sử dụng(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

Bây giờ, cách tạo ngẫu nhiên khá đơn giản, chỉ cần chọn ngẫu nhiên n.

Vài ví dụ:

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!

Quy tắc golf tiêu chuẩn áp dụng. Một người chiến thắng sẽ được chọn một tuần kể từ ngày thử thách được đăng.


viết tại sao trong stdin nên trả về chuỗi tôi có thể làm việc với nó. Nó có phải là chữ thường whyhoặc sẽ WHYđược chấp nhận?
Dennis

Cả chữ thường và chữ hoa đều ổn.
Stewie Griffin

Ngoài ra, kết thúc không cần /2phải làm việc. Điều đó mang lại giá trị phân số. 13cũng nên insisted(14/2 = 7% 4 = 3 = thứ 2 nhấn mạnh).
Jonathan Leech-Pepin

3
Có vấn đề gì nếu bạn kết thúc với các trường hợp như the rich The programmerdo quy định the?
Jonathan Leech-Pepin

1
@StewieGriffin Các từ TheTotrong danh sách của bạn có lẽ nên viết thường để phù hợp với ví dụ của bạn ...
mbomb007

Câu trả lời:


5

JavaScript (ES6) 345

Không chắc chắn về những con số, nhưng đây là nỗ lực của tôi.

Kiểm tra chạy đoạn mã dưới đây trong trình duyệt tuân thủ 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>


Câu trả lời tốt đẹp! Không thể nói một cách có thẩm quyền về tính hợp lệ của số, nhưng bạn có thể lưu 1 byte (!) Bằng cách sử dụng 0làm dấu phân cách chuỗi thay vì ,!
Dom Hastings

1
@DomHastings Tôi nghĩ rằng thủ thuật đó không còn cần thiết với các chuỗi mẫu. split(0)có cùng độ dài của split','(giả vờ đây là backticks)
edc65

Ahhh, xin lỗi, tôi đã nghĩ rằng bạn có thể mất dấu ngoặc, đây không phải là cà phê! :)
Dom Hastings

3

C #, 502 byte

Dự án này cần phải có tên hội đặt Tên tại sao sẽ tạo ra một tệp thực thi với tên chính xác.

Chơi golf đầy đủ:

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

Sự thụt lề và dòng mới cho rõ ràng:

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

Ví dụ đầu vào / đầu ra:

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

2

Powershell 437 461 453 Byte

Chỉnh sửa: Bỏ lỡ các động từ trùng lặp

Chia tách giữa kho và tính toán cho số đếm byte

  • 267 văn bản Bytes = Pre-mã hóa (không bao gồm to, the, it! những nơi kể từ khi họ đã cố định).
  • 186 byte = tính toán

Đặt đối số mặc định thành 0 nếu không được chỉ định. Nếu đối số là <1nó sẽ nhận được một số ngẫu nhiên <99 fn:1và chạy lại. Về mặt kỹ thuật điều này có nghĩa là -50sẽ hoạt động tốt, được coi là một trường hợp ngẫu nhiên.

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

Giải trình:

# 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 Chọn để lưu một byte. Nếu có hơn 99 câu có thể ở trên (không tính toán) tăng lên 999 hoặc 9999 như áp dụng (+1/2 byte)


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

Khi không có đầu vào nào được đưa ra, một số ngẫu nhiên trong 0..839 được tạo.

Sử dụng:

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

Chiến lược đánh giá từ trái sang phải của MUMPS lưu một vài byte tốt trên dấu ngoặc đơn ở đây.

Lưu ý bên: xem những chuỗi đó trông như thế "foo^bar^baz^qux"nào? Chúng được gọi là "chuỗi phân tách" và là cách lưu trữ danh sách tiêu chuẩn phù hợp với giới hạn kích thước chuỗi tối đa, vì MUMPS không thực sự có danh sách / mảng (hoặc, thực sự, bất kỳ cấu trúc dữ liệu nào ngoài cây). Đối với các danh sách quá lớn để vừa trong một chuỗi, thay vào đó, chúng tôi sử dụng các cây có độ sâu 1 và đặt các giá trị trên lá của cây. Vui vẻ!


+1: MUMPS, trong tất cả các ngôn ngữ, thực sự cần một whychức năng. ;)
DLosc

1

Emacs Lisp 473 Byte

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

'Chất thải' lớn nhất có lẽ là format, %s... phần. Nếu các biến có thể được nội tuyến vào các chuỗi mà không có đặc điểm kỹ thuật thì nó sẽ tiết kiệm được 10 byte %svà 12 khác vàoformat


1

Ruby 396 378 372 byte

Tôi chắc chắn rằng điều này không được đánh gôn đến mức tối đa.

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

Chỉnh sửa: Tôi vừa nhận ra rằng tôi không biết quyền ưu tiên của nhà điều hành. Ồ tốt ..


rand (21) dường như quá nhỏ
edc65

Còn 99 thì sao? : P
Peter Lenkefi 7/10/2015

Có 108 câu ghép + 3 trường hợp đặc biệt. Trình tự các câu là định kỳ nhưng giai đoạn ... Tôi không biết
edc65

Khoảng thời gian có lẽ là 840 ... sự lựa chọn tốt về các con số
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

Trước đây tôi chưa sử dụng CJam, vì vậy tôi sẽ thực hiện bất kỳ mẹo nào. Tôi chắc chắn có rất nhiều mánh khóe tôi không biết!

(Tôi không thể tìm ra cách đặt tên này là một hàm gọi là "tại sao" - có vẻ như các hàm đó không tồn tại trong CJam - vì vậy tôi không chắc câu trả lời của CJam có ổn hay không ...)


Chức năng làm tồn tại, nhưng chỉ có 26 tên hàm hợp lệ (A đến Z).
Dennis

1

Lua 5.3.0, 452 460 446 byte

Đây là nỗ lực đầu tiên của tôi tại một sân golf mã, vì vậy hãy sửa cho tôi nếu tôi làm sai!

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

Ung dung:

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 byte

Tôi vẫn đang học, vì vậy hãy nhẹ nhàng! :)

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

Hoạt động có hoặc không có int làm đối số dòng lệnh.

Tôi đã cố gắng nhấn mạnh tính chính xác của mã càng nhiều càng tốt, như với việc tạo các số ngẫu nhiên từ -sys.maxint - 1đến sys.maxintvà hiển thị các câu trong trường hợp đúng.

Mã này phụ thuộc rất nhiều vào các câu lệnh if mà tôi chắc chắn có thể được thay thế bằng một cái gì đó hiệu quả hơn.

Phản hồi rất đáng hoan nghênh!

Ungolfed (1341 byte)

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
Tôi khuyên bạn nên đọc [ codegolf.stackexchange.com/questions/54/ Nói cách khác , bạn có thể lưu nhiều byte bằng cách sử dụng mẹo đầu tiên trên trang đó. Bạn cũng có thể lập chỉ mục từ phía sau danh sách động từ để bạn chỉ cần một "thỏa mãn": sử dụngargument%8/2-1 và xóa cái thứ hai. Bạn cũng có thể thay thế ==0bằng <1.
lirtosiast
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.