स्टीवी का क्रम: + * - / + * - /


29

आइए चार मूल संचालन, जोड़ +, गुणा *, घटाव -और विभाजन /(फ्लोट, पूर्णांक नहीं) का उपयोग करें।

स्टीवी के अनुक्रम को इस प्रकार परिभाषित किया गया है:

x = [x(1), x(2)]    // Two initial numbers (one indexed)
x(3) = x(1) + x(2)
x(4) = x(2) * x(3)
x(5) = x(3) - x(4)
x(6) = x(4) / x(5)
x(7) = x(5) + x(6)
... and so on.

चुनौती:

दो गैर-नकारात्मक पूर्णांक ( x(1), x(2)), और Nइनपुट के रूप में एक सकारात्मक पूर्णांक लें ।

x(1)और x(2)आपके अनुक्रम के दो पहले नंबर Nहोंगे , और उस अनुक्रम की लंबाई होगी जो आपको आउटपुट करना होगा। (आप 0-सूची की सूची चुन सकते हैं, जिसमें मामला Nलंबाई से कम होगा)।

  • आप ऐसा नहीं मान सकते x(2) >= x(1)
  • Nहमेशा रहेगा >2यदि 1-आधारित, ( >1यदि 0-आधारित है)।
  • आपको शून्य त्रुटियों द्वारा विभाजन को संभालने की आवश्यकता नहीं है।
    • द्वितीय परीक्षण मामले पर ध्यान दें। आप मिल जाएगा नहीं 0, 1है, और N=6इनपुट के रूप में, के बाद से है कि शून्य से भाग में परिणाम होगा, लेकिन आप का समर्थन करना चाहिए 0, 1और N=5
  • मान लें कि केवल वैध इनपुट दिया जाएगा।
  • इनपुट और आउटपुट किसी भी सुविधाजनक प्रारूप पर हो सकते हैं, लेकिन आपको दशमलव अंकों के बाद कम से कम 3 अंकों का समर्थन करना चाहिए यदि आउटपुट नॉन-पूर्णांक है।

परीक्षण के मामलों:

1 3
8
1, 3, 4, 12, -8, -1.5, -9.5, 14.25

0 1
5
0, 1, 1, 1, 0     // N=6 would give division by zero error. You don't need to handle that case.

1 0
9
1, 0, 1, 0, 1, 0, 1, 0, 1

6 3
25
6, 3, 9, 27, -18, -1.5, -19.5, 29.25, -48.75, -0.6, -49.35, 29.61, -78.96, -0.375, -79.335, 29.7506, -109.086, -0.272727, -109.358, 29.825, -139.183, -0.214286, -139.398, 29.8709, -169.269

क्या कोई फ़ंक्शन सूची के रूप में x (1) और x (2) ले सकता है? या अलग तर्क?
फ्लिपकार्ट

जो कुछ भी आपके लिए सुविधाजनक है :)
स्टीवी ग्रिफिन

N0-आधारित हो सकता है? इसलिए अपने उदाहरणों में दिखाए गए एन से इनपुट 1 के रूप में कम लें। मुझे लगता है कि N-2 लेना बहुत अधिक है ...: --P
लुइस मेंडो

जब आप लिखते हैं कि आउटपुट किसी भी सुविधाजनक प्रारूप पर हो सकता है , तो क्या इसमें अंतिम तत्व के साथ एक सूची शामिल है जो शुरुआत में है और अंत में प्रारंभ-तत्व (एक उलट सूची) है?
एमिग्ना

1
@ एमिग्ना, नहीं मुझे नहीं लगता कि यह थोड़ा सा खिंचाव है ... संख्या सही क्रम में होनी चाहिए
स्टीवी ग्रिफिन

जवाबों:


3

MATL , 19 18 17 बाइट्स

q:"y'+*-/'@)hyhUV

इनपुट प्रारूप में है: N(0-आधारित) x(1), x(2)(स्ट्रिंग के रूप में); सभी newlines द्वारा अलग हो गए।

इसे ऑनलाइन आज़माएं! या सभी परीक्षण मामलों को सत्यापित करें (थोड़ा संशोधित कोड; आउटपुट अनुक्रम एक रिक्त लाइन द्वारा अलग किए गए)।

व्याख्या

MATL का एक उचित evalकार्य नहीं है , लेकिन U( str2num) इन्फिक्स ऑपरेटरों के साथ संख्यात्मक अभिव्यक्तियों का मूल्यांकन कर सकता है।

प्रत्येक नए शब्द की गणना और पिछली शर्तों को ध्यान में रखते हुए स्टैक पर की जाती है। पूरे स्टैक को अंत में प्रिंट किया गया है।

q          % Implicitly input N (0-based). Subtract 1
:"         % Repeat that many times
  y        %   Duplicate x(n-1), where n is the number of already computed terms
           %   In the first iteration, which corresponds to n=2, this implicitly 
           %   inputs x(1) and x(2) as strings (and then duplicates x(1))
  '+*-/'   %   Push this string
  @)       %   Push iteration number and apply as modular index into the string. 
           %   So this gives '+' in the first iteration, '*' in the second etc
  h        %   Concatenate horizontally. This gives a string of the form
           %   '*x(n-1)+', where '+' is the appropriate operator 
  &y       %   Duplicate x(n)
  hh       %   Concatenate horizontally. This gives a string of the form
           %   'x(n-1)+x(n)'
  U        %   Convert to number. This evaluates the string
  V        %   Convert back to string. This is the new term, x(n+1)
           % Implicitly end loop and display stack

7

हास्केल, 69 68 64 बाइट्स

x#n=take n$x++zipWith3 id(cycle[(+),(*),(-),(/)])(x#n)(tail$x#n)

x1और x2एक सूची के रूप में लिया जाता है। प्रयोग उदाहरण: [1,3] # 8-> [1.0,3.0,4.0,12.0,-8.0,-1.5,-9.5,14.25]

आलस्य एक अनंत पुनरावर्ती सूची को परिभाषित करना संभव बनाता है जहां हम पहले एन तत्वों को लेते हैं।

हास्केल, 66 बाइट्स

(h%g)y x=x:g(h x y)y
a=(+)%b
b=(*)%c
c=(-)%d
d=(/)%a
(.a).(.).take 

अलग दृष्टिकोण, थोड़ा लंबा। तर्क क्रम है N, x2, x1। प्रयोग उदाहरण: ( (.a).(.).take ) 8 3 1-> [1.0,3.0,4.0,12.0,-8.0,-1.5,-9.5,14.25]

परिभाषित करता है 4 कार्यों a, b, cऔर dजो दो तर्क ले y, x और रख कर एक सूची बनाने के xसाथ अगले फ़ंक्शन की कॉल के सामने yदूसरा तर्क के रूप में और x op yपहले के रूप में। उदाहरण के लिए a: है a y x = x : (b (x+y) y), bगुणा करता है: b y x = x : (c (x*y) y)आदि।

संपादित करें: @ मिचेल क्लेन ने 1 संस्करण ( #) में एक बाइट को बचाया । सौभाग्य से मुझे दूसरे संस्करण के लिए एक बाइट भी मिली, इसलिए दोनों की लंबाई एक ही है।

संपादित करें II: @Zgarb को बचाने के लिए दूसरे संस्करण में 2 बाइट्स मिले, और I 4 पहले में, इसलिए वे अब एक ही लंबाई के नहीं हैं।


एक बाइट के लिए एक सूची (अनुमत) के रूप में तर्क स्वीकार करें
माइकल क्लेन

मैं हमेशा भ्रमित हो (.)जाता हूं अगर अन्य कार्यों के साथ बना है: पी
15

g x=(`take`f)whereएक बाइट नहीं बचाता: - /
बर्गी

वैकल्पिक दृष्टिकोण में 2 बाइट्स सहेजें:(h%g)y x=x:g(h x y)y
जर्ब

@Zbb: ओह, यह अच्छा है। धन्यवाद! BTW, जब आपके सुझावों का संपादन करते हुए मुझे पहले संस्करण में रास्ते में बचाने के लिए 4 बाइट्स मिले।
४।

6

ईएस 6 (जावास्क्रिप्ट), 79, 67, 65 बाइट्स

अद्यतन करें

  • शून्य से 2 बाइट्स, i = 2 से शुरू करके, जैसा कि @ETHProductions द्वारा सुझाया गया है
  • सहेजे गए 3 बाइट्स, @Neil की उत्कृष्ट सलाह के लिए धन्यवाद!

golfed

S=(n,a,i=2)=>i<n?S(n,a,a.push(eval(a[i-2]+"-/+*"[i%4]+a[i-1]))):a

परीक्षा

S=(n,a,i=2)=>i<n?S(n,a,a.push(eval(a[i-2]+"-/+*"[i%4]+a[i-1]))):a

>S(8,[1,3])
Array [ 1, 3, 4, 12, -8, -1.5, -9.5, 14.25 ]

>S(5,[0,1])
Array [ 0, 1, 1, 1, 0 ]

>S(9,[1,0])
Array [ 1, 0, 1, 0, 1, 0, 1, 0, 1 ]

>S(25,[6,3])
Array [ 6, 3, 9, 27, -18, -1.5, -19.5, 29.25, -48.75, -0.6, ...]

1
क्या आप ++i1 से iदो बार जोड़ने से बचने के लिए उपयोग नहीं कर सकते हैं ?
नील

1
या, वैकल्पिक रूप से, लेखन ?S(n,a,i+1,a.push(...)):aआपको कुछ बाइट्स बचा सकता है।
नील

1
या हो सकता है कि आप इस तथ्य का उपयोग कर सकते हैं कि a.pushनई लंबाई लौटाती है,S=(n,a,i=2)=>i<n?S(n,a,a.push(...)):a
नील

1
मुझे अभी भी लगता है कि आप अधिक बाइट्स को i=2हालांकि शुरू करके बचा सकते हैं ।
नील

1
नील के सुझाव के साथ, मुझे लगता है कि आप S=(n,a,i=2)=>i<n?S(n,a,a.push(eval(a[i-2]+"+*-/"[i%4]+a[i-1]))):a2 बाइट बचाने के लिए कर सकते हैं ।
4

5

पायथन 3, 90 80 74 बाइट्स

xnor शायद आने वाला है और इस समाधान को नष्ट कर रहा है ...

def F(s,n,i=2):
 while i<n:s+=eval('%s'*3%(s[-2],'-/+*'[i%4],s[-1])),;i+=1

फ़ंक्शन इसमें दी गई सूची को संशोधित करता है। इस तरह का उपयोग करें:

s = [1,3] 
F(s,8)

Repl.it पर प्रयास करें!

-6 बाइट्स कॉपर के लिए धन्यवाद


चूँकि आप केवल Oएक बार उपयोग करते हैं , आप '-/+*'[i%4]घोषणा करके और हटाकर कुछ बाइट्स बचा सकते हैं O। इसके अलावा, आप strकुछ ऐसा करके बार-बार कॉल करने में सक्षम हो सकते हैं eval('%s'*3%(s[-2],'-/+*'[i%4],s[-1]))
कॉपर

अरे हाँ, और s+=[...]द्वारा प्रतिस्थापित किया जा सकता है s+=...,(ध्यान रखें अल्पविराम)।
कॉपर

xnor एकमात्र ऐसा नहीं है जो आपके समाधान को नष्ट कर सकता है। एक और व्यक्ति भी है: डेनिस (आधुनिक)।
आउटगोल्फर

आपको iइनपुट के रूप में प्राप्त करने की गारंटी है , इसलिए आपको इसके लिए डिफ़ॉल्ट मान की आवश्यकता नहीं है ( i=2बस हो सकता है i)। दो बाइट्स बंद।
ArtOfCode

1
यदि इसके nबजाय वें आइटम को अनुक्रम में वापस करने की अनुमति दी गई है , तो यह 1 बाइट पुनरावृत्ति के साथ कम है:f=lambda x,n:n<2and x[n-1]or eval('%s'*3%(f(x,n-2),'*-/+'[n%4],f(x,n-1)))
mbomb007

5

पर्ल 6 ,  75 71  61 बाइट्स

->\a,\b,\c{$_=[|(&[+],&[*],&[-],&[/])xx*];(a,b,{.shift.($^a,$^b)}...*)[^c]}

झसे आज़माओ

{$_=[|(&[+],&[*],&[-],&[/])xx*];($^a,$^b,{.shift.($^a,$^b)}...*)[^$^c]}

झसे आज़माओ

{($^a,$^b,{(&[+],&[*],&[-],&[/])[$++%4]($^a,$^b)}...*)[^$^c]}

झसे आज़माओ

विस्तारित:

{ # bare block lambda with placeholder parameters 「$a」 「$b」 「$c」

  # generate sequence
  (
    # initialize sequence
    $^a, # declare and use first argument
    $^b, # second argument

    {  # bare block lambda with two placeholder parameters 「$a」 「$b」

      (

        &[+], &[*], &[-], &[/] # the four operators

      )[             # index into the list of operators

         $++        # increment (++) an anonymous state variable ($)
         % 4        # modulo 4

      ]( $^a, $^b ) # and use it on the previous two values in sequence

    }

    ...  # repeat that until

    *    # indefinitely

  )[     # take only

    ^    # upto and excluding:     ( Range object )
    $^c  # third argument

  ]
}

4

गणितज्ञ, 68 बाइट्स

(±1=#;±2=#2;±n_:=1##[#-#2,#/#2,+##][[n~Mod~4]]&[±(n-2),±(n-1)];±#3)&

3 जगह पर बमुश्किल सूंघा! तीन तर्कों का कार्य, जो एक सहायक सहायक ऑपरेटर का उपयोग करता है, जो ±कि ±nस्टैपी अनुक्रम का बिल्कुल nth तत्व x (n) है। पहले दो तर्क x (1) और x (2) हैं, और तीसरा तर्क है N का संकेत है कि हम किस x (N) को आउटपुट करते हैं।

प्रत्यक्ष कार्यान्वयन, पिछले दो शब्दों पर लागू करने के लिए कौन सा बाइनरी फ़ंक्शन चुनने के लिए एक मॉड -4 गणना का उपयोग करता है। सही बाइनरी फ़ंक्शन को चुनना, जो कि इसके 1##[#-#2,#/#2,+##]साथ मदद करता है, इनमें से कुछ का उपयोग करता है Mathematica golfing गुर


3

05AB1E , 21 19 18 बाइट्स

इनपुट एन (0-आधारित), x (2) , x (1) क्रम में लिया जाता है । Carusocomputing
के लिए 1 बाइट का धन्यवाद सहेजा गया

GUDXsX"/+*-"Nè.V})

इसे ऑनलाइन आज़माएं!

व्याख्या

 G                   # for N in [0 ... n-1] do:
  U                  # save top element of stack in X
   D                 # duplicate top of stack
    X                # push X
     s               # swap top 2 elements on stack
      X              # push X
       "/+*-"Nè      # index into the string with the current iteration number
               .V    # evaluate
                 }   # end loop
                  )  # wrap stack in list

हम क्रमिक रूप से शीर्ष पर अनुक्रम में नवीनतम तत्व के साथ स्टैक का निर्माण करते हैं, जबकि सभी पिछले तत्वों को क्रम में रखते हैं।
फिर हम एक बार में सभी मानों को प्रदर्शित करने के लिए स्टैक को एक सूची में लपेटते हैं।


1
मैं यह पता लगा सकता है नहीं है, लेकिन का उपयोग कर XYऔर UVआप बाइट्स सहेज सकते हैं।
मैजिक ऑक्टोपस Urn

1
@carusocomputing: अच्छा कैच! उस बाइट को सहेजा जो मैंने रजिस्टर से खो दिया था, जिसमें निहित इनपुट पर काम नहीं किया गया UX:)
Emigna

2

आम लिस्प, 158

(lambda(x y n)(loop repeat n for a = x then b for b = y then r for o in '#1=(+ * - / . #1#)for r =(ignore-errors(funcall o a b))collect(coerce a'long-float)))

वास्तव में प्रतिस्पर्धी नहीं है, लेकिन मुझे पसंद है कि यह कैसे स्वाभाविक रूप से व्यक्त किया जाता है:

(lambda (x y n)
  (loop 
    repeat n
    for a = x then b
    for b = y then r
    for o in '#1=(+ * - / . #1#)
    for r = (ignore-errors (funcall o a b))
    collect (coerce a 'long-float)))

आर की गणना करते समय हम त्रुटियों को अनदेखा करते हैं, जो आर (और फिर बी) बनाता है संभवतः एनआईएल मूल्य लेते हैं। यदि वर्तमान मूल्य अपरिभाषित है, तो भी वर्तमान परिणाम को आउटपुट करने की अनुमति देता है। फिर, अंततः लूप विफल हो जाएगा, लेकिन यह नियमों के भीतर है।

टेस्ट

हम फ़ंक्शन को नाम देते हैं Fऔर सत्यापित करते हैं कि अपेक्षित मान लगभग एक परीक्षण के बराबर हैं।

(loop
  for (args expected)
    in
  '(((1 3 8)
     (1 3 4 12 -8 -1.5 -9.5 14.25))

    ((0 1 5)
     (0 1 1 1 0))

    ((1 0 9)
     (1 0 1 0 1 0 1 0 1))

    ((6 3 25)
     (6 3 9 27 -18 -1.5 -19.5 29.25 -48.75 -0.6 -49.35 29.61 -78.96 -0.375 -79.335 29.7506 -109.086 -0.272727 -109.358 29.825 -139.183 -0.214286 -139.398 29.8709 -169.269)))

  for result = (apply #'f args)
  always (every (lambda (u v) (< (abs (- u v)) 0.001)) result expected))

=> T

अनुमानित परीक्षण का कारण यह है क्योंकि गणना किए गए मान आवश्यकता से थोड़ा अधिक सटीक हैं; यहां, इसके लिए (f 6 3 25):

(6.0d0 3.0d0 9.0d0 27.0d0 -18.0d0 -1.5d0 -19.5d0 29.25d0 -48.75d0 -0.6d0
 -49.35d0 29.61d0 -78.96d0 -0.375d0 -79.335d0 29.750625d0 -109.085625d0
 -0.2727272727272727d0 -109.35835227272727d0 29.825005165289255d0
 -139.18335743801654d0 -0.21428571428571427d0 -139.39764315230224d0
 29.870923532636194d0 -169.26856668493843d0)

2

डीसी, 112 110 108 बाइट्स

5k?sarfsmsn[pSnla1-Sa]sh[lmlndSm]sv[lvx/lhx]sb[lvx+lhx]sc[lvx*lhx]sd[lvx-lhx]se[lcx2la>d2la>e2la>b2la>j]dsjx

कभी-कभी dcउत्तर सुपर लंबे हो सकते हैं, और कभी-कभी वे सुपर शॉर्ट हो सकते हैं। यह सब सिर्फ हाथ में चुनौती पर निर्भर करता है जैसा कि कई अन्य भाषाओं के साथ होता है। वैसे भी, यह 3 पूर्णांक के अंतरिक्ष-अलग-अनुक्रमित एक-अनुक्रमित कमांड लाइन इनपुट के लिए संकेत देता है x(1), x(2), N, मंगलाचरण पर, और अनुक्रम के प्रत्येक तत्व को गैर-पूर्णांक आउटपुट के साथ अलग-अलग लाइनों पर दशमलव बिंदु के बाद 5 अंकों वाले आउटपुट देता है।

उदाहरण के लिए, इनपुट 6 3 25निम्न आउटपुट में होता है:

6
3
9
27
-18
-1.50000
-19.50000
29.25000
-48.75000
-.60000
-49.35000
29.61000
-78.96000
-.37500
-79.33500
29.75062
-109.08562
-.27272
-109.35834
29.82420
-139.18254
-.21428
-139.39682
29.86995
-169.26677

2

पर्ल, 62 + 3 ( -plaध्वज) = 65 बाइट्स

push@F,eval$F[-2].qw(* - / +)[$_%4].$F[-1]for 3..pop@F;$_="@F"

का उपयोग करते हुए:

perl -plae 'push@F,eval$F[-2].qw(* - / +)[$_%4].$F[-1]for 3..pop@F;$_="@F"' <<< '1 3 8'

1

रूबी, 79 बाइट्स

->(b,c,d){a=[b,c];(d-2).times{|i|a<<a[i].send(%i{+ * - /}[i%4],a[i+1]).to_f};a}

मुझे संदेह है कि यह इष्टतम से बहुत दूर है (और मैंने अभी तक अन्य उत्तरों पर ध्यान नहीं दिया है), लेकिन फिर भी यह मजेदार है।

मैं कुछ मज़ा लेना चाहता था Enumerable#cycle, लेकिन दुख की बात है कि यह सिर्फ उपयोग करने के लिए 4 कम अक्षर हैं %4


1

सी ++ 14, 118 बाइट्स

[](auto&v,int N){for(int i=0;++i<N-1;){auto p=v.rbegin(),q=p+1;v.push_back(i%4?i%4<2?*q+*p:i%4<3?*q**p:*q-*p:*q/ *p);}

अनाम लैंबडा अपने इनपुट को संशोधित करने के रूप में। या vहोना आवश्यक है ।vector<double>vector<float>

अधूरा और उपयोग:

#include<iostream>
#include<vector>

auto f=
[](auto&v,int N){
  for(int i=0; ++i<N-1;){
    auto p=v.rbegin(),q=p+1;
    v.push_back(
      i%4 ?
        i%4<2 ? *q+*p : 
          i%4<3 ? *q**p : *q-*p
      : *q/ *p
    );
  }
};

int main(){
  std::vector<double> v={1,3};
  f(v,8);
  for (auto x:v) std::cout << x << ", ";
  std::cout << "\n";
}

1

x86-64 मशीन कोड, 34 बाइट्स

सम्मेलन बुलाना = x86-64 सिस्टम V x32 ABI (लंबे मोड में 32-बिट पॉइंटर्स के साथ रजिस्टर होता है)।

फ़ंक्शन हस्ताक्षर है void stewie_x87_1reg(float *seq_buf, unsigned Nterms);। फ़ंक्शन सरणी के पहले दो तत्वों में x0 और X1 बीज मान प्राप्त करता है, और अनुक्रम को कम से कम एन अधिक तत्वों तक बढ़ाता है। बफर को 2 + एन-राउंडेड-अप-टू-नेक्स्ट-ऑफ-मल्टीपल ऑफ -4 में से एक होना चाहिए। (यानी 2 + ((N+3)&~3), या सिर्फ N + 5)।

उच्च प्रदर्शन या SIMD- वेक्टरकृत कार्यों के लिए असेंबली में गद्देदार बफ़र्स सामान्य है, और यह अनियंत्रित लूप समान है, इसलिए मुझे नहीं लगता कि यह नियमों को बहुत दूर झुका रहा है। कॉल करने वाला आसानी से (और चाहिए) सभी पैडिंग तत्वों को अनदेखा करता है।

एक फ़ंक्शन के रूप में x0 और X1 पास करना पहले से ही बफर में नहीं है, हमें केवल 3 बाइट्स ( movlps [rdi], xmm0या एक के लिए movups [rdi], xmm0) खर्च होंगे, हालांकि यह एक गैर-मानक कॉलिंग कन्वेंशन होगा क्योंकि सिस्टम वी struct{ float x,y; };दो अलग-अलग एक्सएमएम रजिस्टरों में गुजरता है।

यह objdump -drw -Mintelटिप्पणियों को जोड़ने के लिए कुछ स्वरूपण के साथ आउटपुट है

0000000000000100 <stewie_x87_1reg>:
       ;; load inside the loop to match FSTP at the end of every iteration
       ;; x[i-1] is always in ST0
       ;; x[i-2] is re-loaded from memory
 100:   d9 47 04                fld    DWORD PTR [rdi+0x4]
 103:   d8 07                   fadd   DWORD PTR [rdi]
 105:   d9 57 08                fst    DWORD PTR [rdi+0x8]
 108:   83 c7 10                add    edi,0x10            ; 32-bit pointers save a REX prefix here

 10b:   d8 4f f4                fmul   DWORD PTR [rdi-0xc]
 10e:   d9 57 fc                fst    DWORD PTR [rdi-0x4]

 111:   d8 6f f8                fsubr  DWORD PTR [rdi-0x8]
 114:   d9 17                   fst    DWORD PTR [rdi]

 116:   d8 7f fc                fdivr  DWORD PTR [rdi-0x4]
 119:   d9 5f 04                fstp   DWORD PTR [rdi+0x4]

 11c:   83 ee 04                sub    esi,0x4
 11f:   7f df                   jg     100 <stewie_x87_1reg>
 121:   c3                      ret    

0000000000000122 <stewie_x87_1reg.end>:
## 0x22 = 34 bytes

यह C संदर्भ कार्यान्वयन gcc -Osकुछ समान कोड के साथ (साथ ) संकलित करता है । gcc ने एक ही कार्यनीति को एक रजिस्टर में पिछले मूल्य को ध्यान में रखते हुए किया।

void stewie_ref(float *seq, unsigned Nterms)
{
    for(unsigned i = 2 ; i<Nterms ; ) {
        seq[i] = seq[i-2] + seq[i-1];       i++;
        seq[i] = seq[i-2] * seq[i-1];       i++;
        seq[i] = seq[i-2] - seq[i-1];       i++;
        seq[i] = seq[i-2] / seq[i-1];       i++;
    }
}

मैंने अन्य तरीकों के साथ प्रयोग किया, जिसमें दो-रजिस्टर x87 संस्करण शामिल है जिसमें कोड है जैसे:

; part of loop body from untested 2-register version.  faster but slightly larger :/
; x87 FPU register stack    ;       x1, x2   (1-based notation)
fadd    st0, st1            ; x87 = x3, x2
fst     dword [rdi+8 - 16]  ; x87 = x3, x2

fmul    st1, st0            ; x87 = x3, x4
fld     st1                 ; x87 = x4, x3, x4
fstp    dword [rdi+12 - 16] ; x87 = x3, x4
; and similar for the fsubr and fdivr, needing one fld st1

यदि आप गति के लिए जा रहे थे तो आप इसे इस तरह से करेंगे (और SSE उपलब्ध नहीं था)

एंट्री पर एक बार के बजाय लूप के अंदर मेमोरी से लोड डालने से मदद मिल सकती है, क्योंकि हम सबम और डिव रिजल्ट को ऑर्डर से स्टोर कर सकते हैं, लेकिन फिर भी एंट्री पर स्टैक सेट करने के लिए दो FLD निर्देशों की जरूरत होती है।

मैंने SSE / AVX स्केलर गणित (xmm0 और xmm1 में मूल्यों के साथ शुरू) का उपयोग करने की भी कोशिश की, लेकिन बड़ा निर्देश आकार हत्यारा है। का उपयोग करना addps(क्योंकि यह 1 बी से कम है addss) एक छोटे से मदद करता है। मैंने गैर-कम्यूटेटिव निर्देशों के लिए AVX VEX-उपसर्गों का उपयोग किया, क्योंकि VSUBSS SUBPS (और SUBSS के समान लंबाई) से केवल एक बाइट है।

; untested.  Bigger than x87 version, and can spuriously raise FP exceptions from garbage in high elements
addps   xmm0, xmm1      ; x3
movups  [rdi+8 - 16], xmm0
mulps   xmm1, xmm0      ; xmm1 = x4,  xmm0 = x3
movups  [rdi+12 - 16], xmm1
vsubss  xmm0, xmm1, xmm0      ; not commutative.  Could use a value from memory
movups  [rdi+16 - 16], xmm0
vdivss  xmm1, xmm0, xmm1      ; not commutative
movups  [rdi+20 - 16], xmm1

इस परीक्षण-दोहन के साथ परीक्षण किया गया:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main(int argc, char**argv)
{
    unsigned seqlen = 100;
    if (argc>1)
        seqlen = atoi(argv[1]);
    float first = 1.0f, second = 2.1f;
    if (argc>2)
        first = atof(argv[2]);
    if (argc>3)
        second = atof(argv[3]);

    float *seqbuf = malloc(seqlen+8);  // not on the stack, needs to be in the low32
    seqbuf[0] = first;
    seqbuf[1] = second;

    for(unsigned i=seqlen ; i<seqlen+8; ++i)
        seqbuf[i] = NAN;

    stewie_x87_1reg(seqbuf, seqlen);
//  stewie_ref(seqbuf, seqlen);
    for (unsigned i=0 ; i< (2 + ((seqlen+3)&~3) + 4) ; i++) {
        printf("%4d: %g\n", i, seqbuf[i]);
    }

    return 0;
}

संकलन nasm -felfx32 -Worphan-labels -gdwarf2 golf-stewie-sequence.asm &&
gcc -mx32 -o stewie -Og -g golf-stewie-sequence.c golf-stewie-sequence.o

के साथ पहला परीक्षण-केस चलाएं ./stewie 8 1 3

यदि आपके पास x32 लाइब्रेरी स्थापित नहीं है, nasm -felf64तो डिफ़ॉल्ट का उपयोग करके gcc का उपयोग करें और छोड़ें -m64। मैं वास्तव में x32 के रूप में बनाने के लिए एक कम पता प्राप्त करने के लिए (ढेर पर) के mallocबजाय इस्तेमाल किया float seqbuf[seqlen+8]


मजेदार तथ्य: YASM में एक बग है: यह लूप शाखा के लिए rel32 jcc का उपयोग करता है, जब शाखा लक्ष्य का वैश्विक प्रतीक के समान पता होता है।

global stewie_x87_1reg
stewie_x87_1reg:
   ;; ended up moving all prologue code into the loop, so there's nothing here
.loop:

...
sub    esi, 4
jg     .loop

असेंबल करना ... 11f: 0f 8f db ff ff ff jg 100 <stewie_x87_1reg>




0

बैश, 224 बाइट्स (कोई संपर्क नहीं)

BASH में एक जबरदस्त कार्यान्वयन ।

कार्य को काफी शाब्दिक रूप से लेता है, और एक निरंतर पाइप, डब्ल्यू / ओ में किसी भी अपवित्र नियंत्रण प्रवाह संरचनाओं या पुनरावृत्ति में सब कुछ करता है।

इनपुट

$ 1, $ 2 - प्रारंभिक तत्व

$ 3 - लक्ष्य अनुक्रम आकार

golfed

{ echo "a[0]=$1;a[1]=$2;a[0];a[1]";paste <() <(seq 2 $[$3-1]) <(seq 0 $[$3-3]) <(printf '%.0s+*-/' `seq $[$3/4]`|fold -1|head -$[$3-2]) <(seq 1 $[$3-2]);}|sed -r '1 ! s/(.+)\s(.+)\s(.+)\s(.)/a[\1]=a[\2]\3a[\4];a[\1];/'|bc -l

कम गोल्फ वाला

{ 
 echo "a[0]=$1;a[1]=$2;a[0];a[1]";
 paste <() <(seq 2 $[$3-1]) <(seq 0 $[$3-3]) <(printf '%.0s+*-/' `seq $[$3/4]`|fold -1|head -$[$3-2]) <(seq 1 $[$3-2]);
}\
|sed -r '1 ! s/(.+)\s(.+)\s(.+)\s(.)/a[\1]=a[\2]\3a[\4];a[\1];/' \
|bc -l

परीक्षा

>./stewie.sh 1 3 8
1
3
4
12
-8
-1.50000000000000000000
-9.50000000000000000000
14.25000000000000000000

पाइपलाइन चरणों

प्रत्येक आउटपुट अनुक्रम तत्व (प्रति पंक्ति एक) के लिए, तत्व सूचकांकों की तालिका बनाएं:

...
2   0   +   1
3   1   *   2
4   2   -   3
5   3   /   4
6   4   +   5
7   5   *   6
...

का प्रयोग करें sed एक रेखीय में इस कन्वर्ट करने के लिए ईसा पूर्व कार्यक्रम:

...
a[2]=a[0]+a[1];a[2];
a[3]=a[1]*a[2];a[3];
a[4]=a[2]-a[3];a[4];
a[5]=a[3]/a[4];a[5];
a[6]=a[4]+a[5];a[6];
a[7]=a[5]*a[6];a[7];
...

इसे bc को खिलाएं और इसे सभी काम करने दें


0

पायथ - 20 बाइट्स

सभी का उत्पादन nमुझे लागत।

u+Gvj@"+*-/"H>2GttEQ

Eval के ऑनलाइन cuz काम नहीं करता है।


0

सीलोन, 195 बाइट्स

Float[]s(Integer a,Integer b,Integer n)=>loop([a.float,b.float,[Float.divided,Float.plus,Float.times,Float.minus].cycled.rest])(([x,y,o])=>[y,(o.first else nothing)(x)(y),o.rest]).take(n)*.first;

प्रारूपित और टिप्पणी की गई:

// Print the first n entries of the Stewies sequence with given starting entries.
//
// Question:  http://codegolf.stackexchange.com/q/101145/2338
// My answer: http://codegolf.stackexchange.com/a/101251/2338

// Declare a function `s` which takes three integers, and returns a tuple
// of floats. (The more common syntax for the return value is [Float*],
// but Float[] is shorter.)
Float[] s(Integer a, Integer b, Integer n)
       // it is implemented by evaluating the following expression for each call.
         =>
        // start a loop with ...
        loop([
              // ... float versions of the integers, and ...
              a.float, b.float,
              // ... an infinite sequence of the four operators, ever repeating.
              // I needed the `.rest` here so the whole thing gets a {...*} type
              // instead of {...+}, which doesn't fit to what o.rest returns.
              // Each operator has the type Float(Float)(Float), i.e. you apply
              // it twice to one float each to get a Float result.
              [Float.divided, Float.plus, Float.times, Float.minus].cycled.rest])
               // in each iteration of the loop, map the triple of two numbers
               // and a sequence of operators to a triple of ... 
            (([x, y, o]) => [
               // the second number, 
                y,
               //the result of the first operator with both numbers
               // (using this "else nothing" here to convince the
               //  compiler that o.first is not null),
                   (o.first else nothing)(x)(y),
               // and the sequence of operators without its first element.
               // (that one unfortunately has a {...*} type, i.e. a possibly
               //  empty sequence.)
                                                 o.rest])
            // now we got an infinite sequence of those triples.
            // We just want the first n of them ...
                .take(n)
            // and of each triple just the first element.
            // (The *. syntax produces a tuple, non-lazily.
            //  We could also have used .map((z) => z.first)
            //  or .map(Iterable.first) or .map((z) => z[0]), each of
            //  which would return a (lazy) sequence, but they all would be
            //  longer.)
                *.first;

उदाहरण का उपयोग:

shared void run() {
    print(s(1, 3, 8));
    print(s(0,1,11));
    print(s(1,0,9));
    print(s(6, 3, 29));
}

उदाहरण आउटपुट:

[1.0, 3.0, 4.0, 12.0, -8.0, -1.5, -9.5, 14.25]
[0.0, 1.0, 1.0, 1.0, 0.0, Infinity, Infinity, Infinity, NaN, NaN, NaN]
[1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0]
[6.0, 3.0, 9.0, 27.0, -18.0, -1.5, -19.5, 29.25, -48.75, -0.6, -49.35, 29.61, -78.96000000000001, -0.37499999999999994, -79.33500000000001, 29.750625, -109.08562500000001, -0.2727272727272727, -109.35835227272727, 29.825005165289255, -139.18335743801651, -0.2142857142857143, -139.39764315230224, 29.870923532636194, -169.26856668493843, -0.17647058823529413, -169.44503727317374, 29.90206540114831, -199.34710267432206]

दूसरा उदाहरण दिखाता है कि यह शून्य से विभाजन को कैसे संभालता है। अंतिम उदाहरण से पता चलता है कि परिणाम किस तरह के अंकगणित (और गोलाई) का उपयोग कर रहे हैं, इसके आधार पर थोड़ा सा विचलन करता है ... मुझे लगता है कि सीलोन के 64 बिट फ्लोटिंग अंक अंकगणित प्रश्न के पोस्ट में जो होना चाहिए उससे थोड़ा अधिक है। ।


0

क्लोजर, 99 बाइट्स

#(let[ops[+ * - /]](take %3(map first(iterate(fn[[a b i]][b((ops i)a b)(mod(inc i)4)])[%1 %2 0]))))

यह संस्करण व्यवहार में उपयोग करने के लिए अच्छा है लेकिन इसमें 110 बाइट्स हैं:

(defn f[a b n](let[ops[+ * - /]](take n(map first(iterate(fn[[a b i]][b((ops i)a b)(mod(inc i)4)])[a b 0])))))

मुझे पुनरावृत्त समारोह और संचालन के एक चक्रीय अनुक्रम को समझने में परेशानी हुई, इसलिए मुझे इसके बजाय एक काउंटर का उपयोग करना पड़ा। इसके अलावा FSM संक्रमण तालिका का उपयोग करने की कोशिश की, {+ * * - - / / +}लेकिन मैं इसे कम कोड को निचोड़ नहीं सका।

एक अनाम फ़ंक्शन के रूप में व्यक्त किया जा सकता है

संयुक्त राष्ट्र के golfed:

(defn f [a b n]
  (let [ops [+ * - /]]
    (->> [a b 0]
         (iterate (fn [[a b i]]
                    [b
                     ((ops i) a b)
                     (mod (inc i) 4)]))
         (map first)
         (take n))))

झांकियों के साथ बुलाया जाना चाहिए जैसे (f 6.0 3.0 25)अन्यथा आप तर्कसंगत संख्याएं निकालते हैं। वैकल्पिक रूप से पुनरावृति शुरू की जा सकती है [a (float b) 0]जिसमें से कुछ अतिरिक्त अक्षर आते हैं।


0

ऑक्टेव , 91 बाइट्स

@(x,n)eval 'for i=3:n,x(i)=eval([(n=@num2str)(x(i-2)),"*-/+"(mod(i,4)+1),n(x(i-1))]);end,x'

इसे ऑनलाइन आज़माएं!

कुछ गोल्फ:

  • पहली evalकॉल के लिए कोई कोष्ठक नहीं
  • पहली evalकॉल के लिए कोई सहमति नहीं
  • इनलाइन असाइनमेंट *-/+(MATLAB में संभव नहीं)
  • संयुक्त 'और "apostrophes से बचने से बचने के लिए (MATLAB में संभव नहीं)
  • भंडारण n=@num2strदो बार (MATLAB में संभव नहीं है)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.