क्यूं कर? अमीर प्रोग्रामर को खुश करने के लिए!


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)एसटीडीआईएन में लिखना उचित स्ट्रिंग में मुद्रित होना चाहिए)।

यदि कोई तर्क नहीं दिया जाता है, या तर्क शून्य या नकारात्मक है, तो आउटपुट स्ट्रिंग एक यादृच्छिक, वैध वाक्यांश होना चाहिए। तो, वहाँ एक समारोह होना चाहिए why, why(), why(0)या why(-1)एक यादृच्छिक वाक्य है कि रिटर्न।

यदि एक इनपुट तर्क, nदिया जाता है (फ़ंक्शन तर्क, एसटीडीआईएन नहीं), तो आउटपुट n'th स्ट्रिंग (नीचे परिभाषित) होना चाहिए। तो, 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)

नाम: nth नाम को मापांक (%) का उपयोग करके परिभाषित किया गया है।

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!

एंडिंग्स: nth एंडिंग को भी मापांक के उपयोग से परिभाषित किया गया है। मान लें कि अंत (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

विशेषण: nth विशेषण को मापांक के उपयोग से परिभाषित किया गया है। जैसा कि संख्याएँ हमेशा होती हैं, उपयोग करें:(n % 10)/2

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

क्रिया: nth क्रिया को मापांक के उपयोग से भी परिभाषित किया जाता है। क्रियाओं को मानें (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!

मानक कोड गोल्फ नियम लागू होते हैं। जिस दिन चैलेंज पोस्ट किया गया था, उसमें से एक सप्ताह एक विजेता का चयन किया जाएगा।


स्टिंग में लेखन क्यों स्ट्रिंग को वापस करना चाहिए मैं इसके साथ काम करने में सक्षम हो सकता हूं। क्या यह लोअरकेस होना चाहिए whyया WHYस्वीकार्य होगा ?
डेनिस

लोअर और अपर केस दोनों ठीक हैं।
स्टेवि ग्रिफिन

साथ ही एंडिंग्स /2को काम करने की आवश्यकता नहीं होनी चाहिए । यह भिन्नात्मक मूल्य देता है। 13भी होना चाहिए insisted(१४ / २ = =% ४ = ३ = २ पर जोर)।
जोनाथन लीच-पेपिन

3
यदि आप the rich The programmerनिर्दिष्ट के कारण जैसे मामलों को समाप्त करते हैं तो क्या यह महत्वपूर्ण है the?
जोनाथन लीच-पेपिन

1
@StewieGriffin शब्द Theऔर Toआपकी सूचियों में संभवतः आपके उदाहरणों से मेल खाने के लिए कम होना चाहिए ...
mbomb007

जवाबों:


5

जावास्क्रिप्ट (ईएस 6) 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>


अच्छा जवाब! संख्या वैधता पर आधिकारिक रूप से बात नहीं कर सकते हैं, लेकिन आप 1 बाइट (!) के 0बजाय अपने स्ट्रिंग सीमांकक के रूप में उपयोग करके बचा सकते हैं ,
डोम हेस्टिंग्स

1
@DomHastings मुझे लगता है कि टेम्पलेट स्ट्रिंग्स के साथ चाल की अधिक आवश्यकता नहीं है। split(0)की समान लंबाई है split','(दिखावा ये
बैकटिक्स हैं

आह, क्षमा करें, मैं सोच रहा था कि आप कोष्ठक खो सकते हैं, यह ताबूत नहीं है! :)
डोम हेस्टिंग्स

3

सी #, 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

पॉवर्सशेल 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 एक बाइट को बचाने के लिए चुना। यदि ऊपर ९९ से अधिक संभव वाक्य हैं (गणना नहीं की है) तो ९९९ या ९९९ तक बढ़ जाते हैं जैसा कि लागू होता है (+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

एमएसीएस लिस्प 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!'}

संपादित करें: मुझे बस एहसास हुआ है कि मुझे ऑपरेटर पूर्वता नहीं पता है। ओह अच्छा..


रैंड (21) का रास्ता बहुत छोटा लगता है
edc65

99 के बारे में क्या? : पी
20:30 पर पीटर लेनकेफी

108 यौगिक वाक्य + 3 विशेष मामले हैं। वाक्यों का क्रम आवधिक है लेकिन अवधि ... मुझे नहीं पता
edc65

अवधि शायद 840 है ... संख्याओं का अच्छा विकल्प
edc65

1

सीजेएम, 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!"]\(=}?

Permalink

पहले सीजेएम का उपयोग नहीं किया, इसलिए मैं कोई भी सुझाव दूंगा। मुझे यकीन है कि बहुत सारी चालें हैं जो मुझे नहीं पता!

(मैं यह पता नहीं लगा सका कि इसे "क्यों" नामक एक फ़ंक्शन के रूप में नाम दिया गया है - ऐसा प्रतीत होता है कि फ़ंक्शन CJam में मौजूद नहीं हैं - इसलिए मुझे यकीन नहीं है कि CJam उत्तर ठीक है या नहीं ...)


कार्य करना मौजूद हैं, लेकिन वहाँ केवल 26 मान्य फ़ंक्शन नाम (A से Z) कर रहे हैं।
डेनिस

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

Ungolfed:

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

कमांड लाइन तर्क के रूप में इंट के साथ या बिना काम करता है।

मैंने यथासंभव सही कोड पर ज़ोर देने की कोशिश की, ताकि सही मामले में वाक्यों -sys.maxint - 1को रैंडम संख्याओं से उत्पन्न किया जा सके sys.maxintऔर प्रदर्शित किया जा सके।

यह कोड बहुत अधिक निर्भर करता है यदि कथन-कि मुझे यकीन है कि इसे कुछ और जगह से कुशल बनाया जा सकता है।

प्रतिक्रिया बहुत स्वागत है!

अनगोल्डेड (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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.