এলারের পদ্ধতি প্রয়োগ করুন


9

এই চ্যালেঞ্জের লক্ষ্যটি হল f (n) (x) = c ফর্মের একটি ডিফারেনশিয়াল সমীকরণের সমাধানের আনুমানিক সমাধান করতে ইউলারের পদ্ধতিটি ব্যবহার করা ।

ইনপুটটি পূর্ণসংখ্যার একটি তালিকা হবে যেখানে n তম মান f (n) (0) এর মান উপস্থাপন করে । প্রথম পূর্ণসংখ্যা হল চ (0), দ্বিতীয়টি চ '(0), এবং আরও। এই তালিকার শেষ পূর্ণসংখ্যাটি ধ্রুবক এবং সর্বদা একই থাকে।

ইনপুট হিসাবে সরবরাহ করা হবে একটি ধনাত্মক (ননজারো) পূর্ণসংখ্যার এক্স , যা লক্ষ্য মানটি উপস্থাপন করে (আপনি চ (এক্স) নির্ধারণের চেষ্টা করছেন)। ইউলারের পদ্ধতির জন্য ধাপের আকারটি সর্বদা 1. থাকবে Thus সুতরাং, আপনাকে মোট এক্স পদক্ষেপ নিতে হবে ।

আপনি ইউলার পদ্ধতি সঙ্গে unfamliar হন, এখানে ইনপুট জন্য একটি ব্যাখ্যা সঙ্গে একটি বিস্তারিত উদাহরণ [4, -5, 3, -1], এক্স = 8।

x       f(x)      f'(x)     f''(x)    f'''(x)
0          4         -5          3         -1
1   4-5 = -1  -5+3 = -2   3-1 =  2         -1
2  -1-2 = -3  -2+2 =  0   2-1 =  1         -1
3  -3+0 = -3   0+1 =  1   1-1 =  0         -1
4  -3+1 = -2   1+0 =  1   0-1 = -1         -1
5  -2+1 = -1   1-1 =  0  -1-1 = -2         -1
6  -1+0 = -1   0-2 = -2  -2-1 = -3         -1
7  -1-2 = -3  -2-3 = -5  -3-1 = -4         -1
8  -3-5 = -8

মূলত, উত্পন্ন টেবিলের প্রতিটি কক্ষটি তার ওপরের ঘরের সমষ্টি এবং উপরের এবং ডানদিকে হয়। সুতরাং, f (a) = f (a-1) + f '(a-1); f '(a) = f' (a-1) + f '' (a-1); এবং f '' (a) = f '' (a-1) + f '' '(a-1)। চূড়ান্ত উত্তর চ (8) ≈ -8। ††

ইনপুট তালিকায় সর্বদা 2 বা ততোধিক উপাদান থাকবে, এর মধ্যে 10 টিরও কম এক্সট্রা মান থাকবে x x ≥ 1 এরও গ্যারান্টিযুক্ত। আউটপুটটি একটি একক পূর্ণসংখ্যা, f (x) এর সমীকরণ। ইনপুট দুটি ক্রমে নেওয়া যেতে পারে ( x এর আগে তালিকা , বা তালিকার আগে x )। x যদি ইচ্ছা হয় তবে তালিকার প্রথম বা শেষ উপাদানও হতে পারে।

পরীক্ষার কেস:

[4, -5, 3, -1], x = 8 => -8
[1, 2, 3, 4, 5, 6], x = 10 => 3198
[1, 3, 3, 7], x = 20 => 8611
[-3, 3, -3, 3, -3, 3, -3, 3, -3], x = 15 => -9009
[1, 1], x = 1 => 2

।: এটি উল্লেখযোগ্য যে এই পরিস্থিতিতে একটি আনুমানিক পদ্ধতি ব্যবহার করা আসলে মূ .়। তবে, এই চ্যালেঞ্জের উদ্দেশ্যে সবচেয়ে সহজতম কার্যটি বেছে নেওয়া হয়েছিল।

।: আসল মান -২⅓⅓ হয় যা এই অনুমানটিকে "খুব ভাল নয়" হিসাবে যোগ্য করে তুলবে।



উত্তর:


3

হাস্কেল , 38 বাইট

l%n|n<1=l!!0|m<-n-1=l%m+tail(l++[0])%m

এটি অনলাইন চেষ্টা করুন!

39 বাইট থেকে উন্নত:

l%0=l!!0
l%n=l%(n-1)+tail(l++[0])%(n-1)

পুনরাবৃত্তভাবে আউটপুট প্রকাশ করে l%n। উপরে সরানো হ্রাসের সাথে মিলে যায় nএবং ডানদিকে tail lসরে যাওয়া সমস্ত তালিকা উপাদানকে একটি স্থান বামে স্থানান্তরিত করার সাথে মিলে যায়। সুতরাং, আউটপুট l%nহ'ল উপরের মান l%(n-1), এবং উপরে এবং ডানদিকে মান(tail l)%(n-1)

বেস কেসটি n==0প্রথম তালিকার উপাদানটি গ্রহণ করা হয়।

আদর্শভাবে, ইনপুটটি ডানদিকে অসীম বহু শূন্যের সাথে প্যাড করা হবে, যেহেতু বহুবর্ষের ডেরিভেটিভগুলি শেষ পর্যন্ত শূন্য হয়ে যায়। আমরা 0যখন এটি গ্রহণ করি তখন আমরা এটি সংযোজন করে এটি অনুকরণ করি tail

অদ্ভুত ওয়েট 41:

(iterate(\q l->q l+q(tail l++[0]))head!!)


3

জেলি , 6 5 বাইট

Ḋ+$¡Ḣ

এটি অনলাইন চেষ্টা করুন!

-1 বাইট @ ডুরকনবকে ধন্যবাদ

ব্যাখ্যা

Ḋ+$¡Ḣ  - Main dyadic link. First input list, second x
       - (implicit) on the previous iteration (starting at input list)
Ḋ      - Dequeue. e.g. [-5,3,-1]
 +     - Add this to
       - (implicit) the previous iteration. e.g. [4+(-5),-5+3,3+(-1),-1+0]
  $¡   - apply this successively x times
    Ḣ  - get the first element from the resultant list

3

ব্র্যাচল্যাগ , 13 12 বাইট

{,0s₂ᶠ+ᵐ}ⁱ⁾h

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

{,0s₂ᶠ+ᵐ}ⁱ⁾h
{       }ⁱ⁾   iterate the previous predicate
              to the array specified by first element of input
              as many times as the second element of input
           h  and get the first element

              example input to predicate: [4, _5, 3, _1]
 ,0           append 0: [4, _5, 3, _1, 0]
   s₂ᶠ        find all substrings with length 2:
              [[4, _5], [_5, 3], [3, _1], [_1, 0]]
      +ᵐ      "add all the elements" mapped to each subarray:
              [_1, _2, _2, _1]

পূর্ববর্তী 13-বাইট সমাধান

{b,0;?z+ᵐ}ⁱ⁾h

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

{b,0;?z+ᵐ}ⁱ⁾h
{        }ⁱ⁾   iterate the previous predicate
               to the array specified by first element of input
               as many times as the second element of input
            h  and get the first element

               example input to predicate: [4, _5, 3, _1]
 b             remove the first element: [_5, 3, _1]
  ,0           append 0: [_5, 3, _1, 0]
    ;?         pair with input: [[_5, 3, _1, 0], [4, _5, 3, _1]]
      z        zip: [[_5, 4], [3, _5], [_1, 3], [0, _1]]
       +ᵐ      "add all the elements" mapped to each subarray:
               [_1, _2, _2, _1]

2

গণিত, 32 বাইট

#&@@Nest[#+Rest@#~Append~0&,##]&
                               &  make a pure function
    Nest[                 &,##]   call inner function as many times as specified
           Rest@#                 drop the first element of the list
                 ~Append~0        and add a 0 to get [b,c,d,0]
         #+                       add original list to get [a+b,b+c,c+d,d]
#&@@                              take the first element after x iterations

2

পাইথন , 80 58 বাইট

এই চ্যালেঞ্জের জন্য গণিতকে ভালবাসুন।

f=lambda a,x:x and f(map(sum,zip(a,a[1:]+[0])),x-1)or a[0]

এটি কীভাবে কাজ করে (কেবল অজগর 2 দিয়ে কাজ করে):

f=lambda a,x:                                              - new lambda function
             x and                                         - iterate itself x times
                     map(sum,zip(a,a[1:]+[0]))             - e.g; f(a) = f(a-1) + f'(a-1)
                   f(                         ,x-1)        - iterate new array into itself
                                                   or a[0] - return first element

এটি অনলাইন চেষ্টা করুন!

পাস্কাল ত্রিভুজ ব্যবহারের সাথে 100 বাইট বিকল্প

from math import factorial as F
f=lambda a,x:sum([(a+[0]*x)[i]*F(x)/(F(x-i)*F(i))for i in range(x)])

এটি কীভাবে কাজ করে (অজগর 2 এবং 3 এর জন্য কাজ করে):

sum([                                                ]) - take the sum of array
     (a+[0]*x)                                        - append x zeros
              [i]*F(x)/(F(x-i)*F(i))                  - multiply each element by x choose i
                                    for i in range(x) - do this for every element

এই সূত্র সারির কোফিসিয়েন্টস ম্যাপিং করে কাজ করে xএর প্যাস্কাল ত্রিভুজ অ্যারের সম্মুখের। পাস্কাল ত্রিভুজের প্রতিটি উপাদান সারি এবং সূচকের পছন্দগুলি দ্বারা নির্ধারিত হয়। এই নতুন অ্যারের যোগফল আউটপুট সমান x। এটি নিউটনের পদ্ধতির পুনরাবৃত্ত প্রক্রিয়া হিসাবে (যেমন উদাহরণে দেখানো হয়েছে) প্যাসেলস ত্রিভুজটির নির্মাণের মতো কাজ করে int

এটি অনলাইন চেষ্টা করুন!

লুপকে পুনরাবৃত্ত ফাংশনে রূপান্তরিত করে 22 বাইট হ্রাস করার জন্য ovs কে বড় ধন্যবাদ


এখানে একটি উন্নত সংস্করণ। আমি
লুপটির

আহ, দুর্দান্ত ধারণা @ovs
গ্রাভিটন

এমনকি আরও সংক্ষিপ্ত নোট করুন যে এটি শুধুমাত্র পাইথন 2
ovs

1

হাস্কেল, 52 45 বাইট

l#n=iterate(zipWith(+)=<<tail.(++[0]))l!!n!!0

ব্যবহারের উদাহরণ: [-3,3,-3,3,-3,3,-3,3,-3] # 15-> -9009এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

iterate(      )l          -- apply the function again and again starting with l
                          -- and collect the intermediate results in a list
                          -- the function is
          (++[0])         -- append a zero 
  zipWith(+)=<<tail       -- and build list of neighbor sums
                     !!0  -- take the first element from
                  !!n     -- the nth result

সম্পাদনা করুন: @ এক্সনর 7 বাইট সংরক্ষণ করেছেন ধন্যবাদ!


আমি মনে করি পুনরাবৃত্ত ফাংশনটি হতে পারে zipWith(+)=<<tail.(++[0]), অর্থাত্‍ পরবর্তী সময়ের চেয়ে তালিকাটি আগেই ঠিক করে ফেলুন।
xnor

@ এক্সনর: হ্যাঁ, এটি প্রচুর বাইট সংরক্ষণ করে। ধন্যবাদ!
নিমি

আমি =<<এখানে ব্যবহার সম্পর্কে আমার মন
গুটিয়ে রাখতে পারি

@flawr: =<<ফাংশন প্রেক্ষাপটে ব্যবহার করা হয় এবং হিসাবে সংজ্ঞায়িত করা হয়: (=<<) f g x = f (g x) x। এখানে আমরা =<<ইনফিক্স ব্যবহার করি : (f =<< g) xসাথে f = zipWith(+)এবং g = tail, যা অনুবাদ করে zipWith(+) (tail x) x
নিমি

বিস্তারিত ব্যাখ্যার জন্য আপনাকে ধন্যবাদ, আমি ফাংশন মোনাড সম্পর্কে সচেতন ছিলাম না!
flawr

1

সিজেম , 12 বাইট

q~{_(;.+}*0=

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

কোডটি চ্যালেঞ্জে বর্ণিত পদ্ধতিটি সরাসরি কার্যকর করে।

q~            e# Read input and evaluate. Pushes the array and the number x
  {     }*    e# Do the following x times
   _          e# Duplicate array
    (;        e# Remove first element
      .+      e# Vectorized sum. The last element in the first array, which doesn't 
              e# have a corresponding entry in the second, will be left as is
          0=  e# Get first element. Implicitly display




1

অক্টাভা , 42 বাইট

@(a,x)conv(a,diag(flip(pascal(x+1))))(x+1)

এটি একটি বেনামী ফাংশন সংজ্ঞায়িত করে। এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

সমাধানটি বারবার ইনপুট অ্যারে এবং ফলস্বরূপ অ্যারেগুলি সংশোধন করে গণনা করা যেতে পারে [1, 1]। তবে দুবার, বা তিনবার সংশ্লেষ করা, বা ... এর সাথে [1, 1]একবার সংলগ্ন হওয়ার সাথে মিল রয়েছে [1, 2 ,1], বা [1, 3, 3, 1], বা ...; এটি হ'ল পাস্কাল ত্রিভুজের একটি সারি। এটি পাস্কল ম্যাট্রিক্স অফ অর্ডারের অ্যান্টি-ডায়াগোনাল হিসাবে প্রাপ্ত x+1


0

জাভাস্ক্রিপ্ট (ES6), 41 বাইট

f=(a,x,[b,...c]=a)=>x--?f(a,x)+f(c,x):b|0

@ Xnor এর দুর্দান্ত হাস্কেল উত্তরটির বন্দর। পূর্ববর্তী 47-বাইট সমাধান।

f=(a,x)=>x--?f(a.map((e,i)=>e+~~a[i+1]),x):a[0]

0

নম্পির সাথে পাইথন 3 , 82 বাইট

import numpy
def f(a,x):
 for n in range(x):a=numpy.convolve(a,[1,1])
 return a[x]

আমার এমএটিএল উত্তরের অনুরূপ , তবে পূর্ণ-আকারের সমঝোতা ব্যবহার করে এবং ফলস্বরূপ xচূড়ান্ত অ্যারে-য় প্রবেশ entry

এটি অনলাইন চেষ্টা করুন!


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.