양의 정수 목록이 제공된 각 프로그램에 가장 작은 양의 정수를 곱하여 엄격하게 증가하는 목록을 작성하는 프로그램 또는 함수를 작성해야합니다.
예를 들어 입력이
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.
}*
최종 값은 스택에 남고 마지막에 자동으로 인쇄됩니다.