벡터의 경계 누적 합계를 계산


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

Pyth, 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

CJam, 16 15 바이트

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

온라인으로 사용해보십시오

리스트를 첫 번째 인수로, 상한과 하한 쌍을 두 번째 2 요소리스트로 사용합니다. 입력 예 :

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

최신 버전은 최대 값과 최소값을 사용하는 대신 3 개의 값을 정렬하고 중간 값을 취함으로써 1 바이트를 절약합니다. 이것은 Jakube의 솔루션에서도 사용되었으며 Martin이 제안한 것입니다.

설명:

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

R, 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배열과 정수를 받아들이고 배열을 반환하는 함수 를 만듭니다 .

언 골프 드 :

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

ETHproductions의 누적 합계를 함수 매개 변수로 포함하고 Glen O 덕분에 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

Minkolang 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

C 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

APL, 29 27 18 바이트

Dennis가 채팅에서 지적했듯이 \(확장)은 왼쪽에서 오른쪽으로 작동하지만 오른쪽에서 왼쪽으로 확장되는 기능을 적용합니다. 그래서 우리는 할 수 없습니다 1↓(⎕⌈⎕⌊+)\0,⎕. 우리 ,\는 배열 을 가져 와서 /(접기)를 사용하여 각 하위 배열을 개별적으로 처리 하여이 문제를 해결합니다 .

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

순서대로 입력하십시오 array, upper bound, lower bound.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.