কোনও ভেক্টরের সীমিত সংখ্যক যোগফল গণনা করুন


19

কোনও ভেক্টরের সংযোজিত যোগফলটি পূর্ববর্তী সমস্ত উপাদানের যোগফল ধরে গণনা করা হয়। এই ক্ষেত্রে:

vec =     [1  1  1 -1 -1 -1 -1 -1  1  1  1  1 -1]
cum_vec = [1  2  3  2  1  0 -1 -2 -1  0  1  2  1]

এখন, একটি উচ্চতর এবং একটি নিম্ন সীমা চাপান, এর অর্থ হল যে আপনি যদি উচ্চতর সীমাতে থাকে তবে সংশ্লেষফলকে বৃদ্ধি করা বন্ধ করে দিন এবং যদি নিম্ন সীমাতে থাকে তবে সংশ্লেষফলের পরিমাণ কমিয়ে দেওয়া বন্ধ করুন। একটি সহজ উদাহরণ:

upper_lim = 2
lower_lim = -1
vec =     [1  1  1 -1 -1 -1 -1 -1  1  1  1  1 -1]
cum_vec = [1  2  2  1  0 -1 -1 -1  0  1  2  2  1]

ইনপুট ভেক্টরটি কেবলমাত্র 1এবং -1ধনাত্মক এবং নেতিবাচক উভয়ই পূর্ণসংখ্যার সমন্বয় করে। ধরুন upper_lim >= lower_lim। যদি ভেক্টরের প্রথম উপাদানটি সীমানার বাইরে থাকে তবে সরাসরি সীমানায় লাফিয়ে যান (শেষ উদাহরণটি দেখুন)।

ইনপুট হিসাবে পূর্ণসংখ্যার ভেক্টর এবং উপরের এবং নীচের সীমাটি উপস্থাপন করে এমন দুটি পূর্ণসংখ্যার একটি ফাংশন লিখুন। উপরের সংজ্ঞায়িত হিসাবে চৌম্বক संचयी ভেক্টর আউটপুট করুন। ইনপুট হয় ফাংশন আর্গুমেন্ট হিসাবে বা STDIN থেকে হতে পারে।

স্ট্যান্ডার্ড কোড গল্ফ বিধি প্রযোজ্য।

উদাহরণ:

upper_lim = 6
lower_lim = -2
vec =     [1  4  3 -10  3  2  2  5 -4]
cum_vec = [1  5  6  -2  1  3  5  6  2]

upper_lim = 100
lower_lim = -100
vec =     [1  1  1  1  1  1]
cum_vec = [1  2  3  4  5  6]

upper_lim = 5
lower_lim = 0
vec =     [10 -4 -3  2]
cum_vec = [5   1  0  2]

upper_lim = 0
lower_lim = 0
vec =     [3  5 -2  1]
cum_vec = [0  0  0  0]

upper_lim = 10
lower_lim = 5
vec =     [1  4  6]
cum_vec = [5  9 10]
           |
           Note, jumped to 5, because 5 is the lower bound.

উত্তর:


5

পাইথ, 14 বাইট

t.u@S+Q+NY1vwZ

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ বা পরীক্ষার স্যুট

ব্যাখ্যা

t.u@S+Q+NY1vwZ  implicit: Q = first input list [upper_lim, lower_lim]
 .u        vwZ  for each number Y in the next input list, update N = 0 with:
       +NY         N + Y
     +Q            append this to Q
    S              sort this list
   @      1        take the middle element
                .u returns a list with all intermediate values of N
t                  remove the first value, print the rest

5

সিজেম, 16 15 বাইট

l~f{\T++$1=:T}`

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

এটি প্রথম আর্গুমেন্ট হিসাবে তালিকাটি গ্রহণ করে এবং দ্বিতীয় 2-উপাদান তালিকার হিসাবে উপরের / নিম্ন সীমাটির জুড়ি। উদাহরণ ইনপুট:

[1 4 3 -10 3 2 2 5 -4] [6 -2]

সর্বশেষতম সংস্করণটি সর্বাধিক এবং ন্যূনতম ক্রিয়াকলাপটি ব্যবহার না করে 3 টি মানকে বাছাই করে এবং মধ্যমূল্যটি গ্রহণ করে 1 বাইট সংরক্ষণ করে। এটি জাকুবের সমাধানেও ব্যবহৃত হয়েছিল, পাশাপাশি মার্টিনের পরামর্শও।

ব্যাখ্যা:

l~    Get and parse input. This leaves the value and bounds lists on the stack.
f{    Apply block with value (the bounds list).
  \     Swap new value to top.
  T     Get previous value from variable T (which is default initialized to 0).
  +     Add new value and previous value.
  +     Append new value to bounds list, producing a 3 value list.
  $     Sort it...
  1=    And take the middle value.
  :T    Store in variable T for next iteration.
}     End of apply loop.
`     Convert list to string.

4

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

(l,u,v,p=0)=>v.map(c=>p=(p+=c)<l?l:p>u?u:p)

একটি বেনামী ফাংশন সংজ্ঞায়িত করে যা ফর্ম্যাটে ইনপুট নেয় lower bound, upper bound, vector (as JS Array)। আমি জানি না এটি আরও কম হতে পারে তবে আমি চেষ্টা করব। পরামর্শ স্বাগত!


4

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

u#l=tail.scanl(((min u.max l).).(+))0

ব্যবহারের উদাহরণ: 6 # (-2) $ [1,4,3,-10,3,2,2,5,-4]-> [1,5,6,-2,1,3,5,6,2]

0সীমা ছাড়াই প্রাথমিক মানগুলি ঠিক করার জন্য যোগফলটি শুরু করুন । নিন tailচূড়ান্ত ফলাফল থেকে সরাতে।


3

আর, 61 বাইট

function(x,l,u,s=0)sapply(x,function(i)s<<-min(u,max(l,s+i)))

sapplyকোনও ভেক্টরের প্রতিটি উপাদানগুলিতে কোনও ফাংশন প্রয়োগ করার জন্য এটি এখানে ফাংশন (এখানে x) তবে এটি সাধারণত এমন একটি প্রসঙ্গে করা হয় যেখানে সমস্ত মূল্যায়নগুলি স্বাধীন এবং পার্শ্ব-প্রতিক্রিয়া ছাড়াই হয়। এখানে, তবে আমি <<-অপারেটরটিকে প্যারেন্ট / কলিং পরিবেশে একটি অ্যাসাইনমেন্ট তৈরি করতে ব্যবহার করি sapplyযাতে সংযোজক যোগফল sপুনরাবৃত্তির মূল্যায়নের বাইরে সঞ্চয় করতে পারে। এটি খুব খারাপ অনুশীলন ...


3

গণিত, 46 বাইট

Rest@FoldList[{a,b}Min[a+b,#2]~Max~#3,0,#]&

মজার চরিত্রটি হ'ল U + F4A1 \[Function]। প্রথম উপাদানটি যদি পরিসরের মধ্যে অনুমান করা যায় তবে আমি 7 বাইট সঞ্চয় করতে পারি।


3

জুলিয়া, 44 42 38 বাইট

f(x,l,u,s=0)=[s=clamp(s+i,l,u)for i=x]

এটি এমন একটি ফাংশন তৈরি করে fযা একটি অ্যারে এবং দুটি পূর্ণসংখ্যা গ্রহণ করে এবং একটি অ্যারে প্রদান করে।

Ungolfed:

function f(v::Array, u::Int, l::Int, s::Int = 0)
    # The parameter s is the cumulative sum, which begins
    # at 0

    # For each element i of v, define s to be s+i if
    # l ≤ s+i ≤ u, l if s+i < l, or u if s+i > u
    x = [s = clamp(s + i, l, u) for i = v]

    return x
end

ফাংশন প্যারামিটার হিসাবে ক্রমসংখ্যা যোগ করে এবং গ্লেন ও-কে ধন্যবাদ 1 বাইট যোগ করে ইটিএইচ প্রডাকশনগুলির ধারণা ব্যবহার করে 2 বাইট সংরক্ষণ করা


3

পাইথন 2, 67 বাইট

lambda u,l,v:reduce(lambda x,y:x+[max(min(x[-1]+y,u),l)],v,[0])[1:]

2

মিনকোল্যাং 0.9 , 30 বাইট

0I3-[2g+d0c`,3&x0cd1c`3&x1cdN]

এই একটি ফাংশন হিসাবে, অনুমান স্ট্যাকে প্রাক সক্রিয়া করা হয়েছে high, low, vector। সম্পূর্ণ প্রোগ্রামটি নীচে ( 37 বাইট ) এবং ইনপুট হিসাবে গ্রহণ করে high, low, vector

(n$I$)0I4-[2g+d0c`,3&x0cd1c`3&x1cdN].

এখানে চেষ্টা করুন।

ব্যাখ্যা

(n$I$)                                   Read in integers from input until empty
      0                                  Initialize cumulative sum
       I4-[                        ]     Loop over vector
           2g+                           Get the next partial sum
              d0c`,3&x0c                 If too high, replace with high
                        d1c`3&x1cd       If too low, replace with low
                                  N      Output as integer
                                    .    Stop

1

সি 98 বাইট

এটি দীর্ঘ, কিন্তু এটি কাজ করে

#define P printf(
void c(*v,n,u,l,s,c){P"[");while(c++<n)s+=*v++,s=s<u?s>l?s:l:u,P"%d ",s);P"]");}

ব্যবহারের উদাহরণ

#define P printf(
void c(*v,n,u,l,s,c) {
    P"[");
    while(c++<n)
        s+=*v++,s=s<u?s>l?s:l:u,P"%d ",s);
    P"]");
}

int main() {
    int vec[9] = {1, 4, 3, -10, 3, 2, 2, 5, -4};
    int upper = 6, lower = -2, count = 9;
    c(vec, count, upper, lower, 0, 0);
}

আউটপুট হবে

[1 5 6 -2 1 3 5 6 2 ]

1

এপিএল, 29 27 18 বাইট

ডেনিস যেমন আড্ডায় ইঙ্গিত করেছেন, \(প্রসারিত) বাম থেকে ডানে কাজ করে তবে ডান থেকে বামে প্রসারিত ফাংশনটি প্রয়োগ করে। সুতরাং আমরা শুধু করতে পারি না 1↓(⎕⌈⎕⌊+)\0,⎕,\অ্যারেটি নিয়ে আমরা এর চারপাশে কাজ করি এবং তারপরে প্রতিটি /ভাঁজ আলাদা আলাদাভাবে (ভাঁজ) ব্যবহার করে প্রক্রিয়াজাত করি ।

1↓(⎕⌈⎕⌊+)/¨⌽¨,\0,⎕

ক্রম ইনপুট array, upper bound, lower bound

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