곱하여 정렬 3 => 7 9 1 1 1 1

양의 정수 목록이 제공된 각 프로그램에 가장 작은 양의 정수를 곱하여 엄격하게 증가하는 목록을 작성하는 프로그램 또는 함수를 작성해야합니다.

예를 들어 입력이

5 4 12 1 3

곱셈은

5*1=5 4*2=8 12*1=12 1*13=13 3*5=15

그리고 출력은 증가하는 목록이 될 것입니다

5 8 12 13 15

입력

  • 하나 이상의 요소를 포함하는 양의 정수 목록

산출

  • 양의 정수 목록

9 => 9
1 2 => 1 2
2 1 => 2 3
7 3 => 7 9
1 1 1 1 => 1 2 3 4
5 4 12 1 3 => 5 8 12 13 15
3 3 3 8 16 => 3 6 9 16 32
6 5 4 3 2 1 => 6 10 12 15 16 17
9 4 6 6 5 78 12 88 => 9 12 18 24 25 78 84 88
8 9 41 5 12 3 5 6 => 8 9 41 45 48 51 55 60
15 8 12 47 22 15 4 66 72 15 3 4 => 15 16 24 47 66 75 76 132 144 150 153 156

이것은 코드 골프이므로 가장 짧은 프로그램이나 기능이 승리합니다.

재미있는 사실 : 입력에 대한 출력의 마지막 요소 는 시퀀스 A007952N, N-1, ... ,1(N+1)th요소 인 것 같습니다 . 증명을 찾으면 골프 답변에 포함 시키거나 의견으로 게시 할 수 있습니다.



답변

젤리 , 6 5 바이트

:‘×µ\

@Dennis가 깨어나 기 전에 첫 번째 젤리 답변 . 온라인으로 사용해보십시오!

설명

:          Integer division, m//n
 ‘         Increment, (m//n+1)
  ×        Multiply, (m//n+1)*n
   µ       Turn the previous links into a new monadic chain
    \      Accumulate on the array

-1 바이트의 @Dennis에게 감사드립니다.


답변

자바 스크립트 (ES6), 28

편집 바와 같이 @Patrick 로버츠에 의해 제안, p초기화하고 매개 변수가 될 수 있습니다. 동일한 바이트 수이지만 전역 변수 사용을 피하십시오

(a,p)=>a.map(n=>p=n*-~(p/n))

테스트

f=(a,p)=>a.map(n=>p=n*-~(p/n))

console.log=x=>O.textContent+=x+'\n'

;[
[[9], [ 9]],
[[1, 2], [ 1, 2]],
[[2, 1], [ 2, 3]],
[[7, 3], [ 7, 9]],
[[1, 1, 1, 1], [ 1, 2, 3, 4]],
[[5, 4, 12, 1, 3], [ 5, 8, 12, 13, 15]],
[[3, 3, 3, 8, 16], [ 3, 6, 9, 16, 32]],
[[6, 5, 4, 3, 2, 1], [ 6, 10, 12, 15, 16, 17]],
[[9, 4, 6, 6, 5, 78, 12, 88], [ 9, 12, 18, 24, 25, 78, 84, 88]],
[[8, 9, 41, 5, 12, 3, 5, 6], [ 8, 9, 41, 45, 48, 51, 55, 60]],
[[15, 8, 12, 47, 22, 15, 4, 66, 72, 15, 3, 4], [ 15, 16, 24, 47, 66, 75, 76, 132, 144, 150, 153, 156]]
].forEach(t=>{
  var i=t[0],k=t[1],r=f(i),ok=(k+'')==(r+'')
  console.log(i + ' => ' + r + (ok?' OK':'FAIL expecting '+x))
})
<pre id=O></pre>

답변

파이썬 2, 67 64 바이트

먼저 코드 골프를 시도해 보시면 유용한 정보를 얻을 수 있습니다.

def m(l):
 for x in range(1,len(l)):l[x]*=l[x-1]/l[x]+1
 print l

답변

PHP, 55 46 42 41 바이트

ISO 8859-1 인코딩을 사용합니다.

for(;$a=$argv[++$i];)echo$l+=$a-$l%$a,~ß;

다음과 같이 실행하십시오 ( -d미학에만 추가됨).

php -d error_reporting=30709 -r 'for(;$a=$argv[++$i];)echo$l+=$a-$l%$a,~ß;' 10 10 8
  • 1 바이트 thx를 Ismael Miguel에 저장했습니다.
  • 플로어 대신 모듈로를 사용하여 8 바이트 절약
  • 4 바이트를 Ismael Miguel에 저장함 (foreach 대신)
  • 공간을 생성하는 데 사용하여 바이트를 저장했습니다 .

답변

하스켈 (30 28 25 바이트)

scanl1(\x y->y*div x y+y)

확장 버전

f :: Integral n => [n] -> [n]
f xs = scanl1 increaseOnDemand xs
 where
   increaseOnDemand :: Integral n => n -> n -> n
   increaseOnDemand acc next = next * (1 + acc `div` next)

설명

scanl1목록을 접고 모든 중간 값을 다른 목록에 누적 할 수 있습니다. 의 전문화 scanl유형은 다음과 같습니다.

scanl  :: (acc  -> elem -> acc)  -> acc -> [elem] -> [acc]
scanl1 :: (elem -> elem -> elem) ->        [elem] -> [elem]

scanl1 f (x:xs) = scanl f x xs

따라서 우리가 필요로하는 것은리스트의 마지막 요소 ( acc확장 된 버전)와 처리하고자하는 것 ( next확장 된 버전) 중 2 개를 가져 와서 적절한 숫자를 반환하는 적절한 함수입니다 .

우리는 다음 숫자를 통해 누산기를 나누고 결과를 바닥으로 만들어이 숫자를 쉽게 도출 할 수 있습니다. div처리합니다. 그 후에 1목록을 실제로 늘리고로 끝나지 않도록 추가 하기 만하면 0됩니다.


답변

C ++, 63 60 57 바이트

void s(int*f,int*e){for(int c=*f;++f!=e;c=*f+=c/ *f**f);}

주어진 범위 내에서 작동합니다 [first, last). 원래 템플릿 변형으로 작성되었지만 더 길었습니다.

template<class T>void s(T f,T e){for(auto c=*f;++f!=e;c=*f+=c/ *f**f);}

확장 버전

template <class ForwardIterator>
void sort(ForwardIterator first, ForwardIterator last){
    auto previous = *first;

    for(++first; first != last; ++first){
        auto & current = *first;
        current += current * (current / previous);
        previous = current;
    }
}

답변

CJam, 13 바이트

q~{\_p1$/)*}*

CJam 스타일 목록으로 입력하십시오. 출력은 줄 바꿈으로 구분됩니다.

여기에서 테스트하십시오.

설명

q~    e# Read and evaluate input.
{     e# Fold this block over the list (i.e. "foreach except first")...
  \   e#   Swap with previous value.
  _p  e#   Duplicate and print previous value.
  1$  e#   Copy current value.
  /   e#   Integer division.
  )*  e#   Increment and multiply current value by the result.
}*

최종 값은 스택에 남고 마지막에 자동으로 인쇄됩니다.