양의 정수로 이루어진 엄격한 파티션


14

OEIS A000009 는 정수 의 엄격한 파티션 수를 계산합니다 . 음이 아닌 정수 의 엄격한 파티션n양의 정수 세트이므로 반복이 허용되지 않으며 순서는 중요하지 않습니다 n.

예를 들어 5에는 세 개의 엄격한 파티션 54,1,, 및가 3,2있습니다.

10은 10 개의 파티션을 가지고 있습니다 :

10
9,1
8,2
7,3
6,4
7,2,1
6,3,1
5,4,1
5,3,2
4,3,2,1

도전

음수가 아닌 정수가 n<1000 인 경우, 엄격한 파티션 수를 출력하십시오.

테스트 사례 :

0 -> 1

42 -> 1426

다음은 OEIS에서 0부터 55까지의 엄격한 파티션 번호 목록입니다.

[1,1,1,2,2,3,4,5,6,8,10,12,15,18,22,27,32,38,46,54,64,76,89,104,122,142,165,192,222,256,296,340,390,448,512,585,668,760,864,982,1113,1260,1426,1610,1816,2048,2304,2590,2910,3264,3658,4097,4582,5120,5718,6378]

이것은 이므로 바이트 단위의 최단 솔루션이 이깁니다.

답변:


4

수학, 11 바이트

PartitionsQ

테스트 사례

PartitionsQ@Range[10]
(* {1,1,2,2,3,4,5,6,8,10} *)


3

하스켈, 39 바이트

f n=sum[1|x<-mapM(:[0])[1..n],sum x==n]

이 함수 (:[0])는 숫자 k를 목록으로 변환 합니다 [k,0]. 그래서,

mapM(:[0])[1..n]

의 카티 전 곱을 계산하여 생략 된 요소를 [1,0],[2,0],...,[n,0]나타내는 [1..n]0의 모든 부분 집합을 제공합니다 . 의 엄격한 파티션은 nsum과 함께 해당 목록 에 해당합니다 n. 이러한 요소는 목록 이해에 의해 계산되며 이보다 짧습니다 length.filter.


훌륭한! 나는 내 대답에서 subsequences(+ import) 의 대체물을 찾고 있었지만 지금까지 성공하지 못했습니다.
nimi

2

ES6, 64 바이트

f=(n,k=0)=>[...Array(n)].reduce((t,_,i)=>n-i>i&i>k?t+f(n-i,i):t,1)

재귀 시험 뺄셈으로 작동합니다. k마지막으로 빼는 숫자이며, 다음으로 빼야하는 숫자는 더 커야합니다 (그러나 더 큰 숫자는 빼지 못합니다). 1은 항상 n자신을 빼기 때문에 추가 됩니다. (이것은 재귀이기 때문에 모든 변수가 로컬인지주의해야합니다.)


2

파이썬, 68 바이트

p=lambda n,d=0:sum(p(n-k,n-2*k+1)for k in range(1,n-d+1))if n else 1

음수가 아닌 정수 n를 인수로 전달하는 익명 함수를 호출 하고 유니버스의 끝을 기다리십시오.


그것을 만들면 n>0바이트를 절약하고 더 빨리 갈 수 있습니다 (음수를 재귀한다고 생각합니다) : P
st0le

또한, 이런 종류의 메모리를 저장하면 속도가 빨라집니다
st0le

if 문을 다음과 같이 변경할 수 없습니다 :return sum(...)if n else 1
andlrc

@randomra 물론입니다 ...
Bob

1

파이썬 2, 49 바이트

f=lambda n,k=1:n/k and f(n-k,k+1)+f(n,k+1)or n==0

재귀 는 포함 가능한지 여부를 결정 하기 위해 모든 잠재적 인 소환 k에서 분기 됩니다. 포함 된 각 summand는 원하는 sum에서 빼고 , 남아있는 경우 해당 경로가 계산됩니다.1nnn=0


1

하스켈, 43 바이트

0%0=1
_%0=0
n%k=n%(k-1)+(n-k)%(k-1)
f n=n%n

이진 함수 n%kn최대 부분을 갖는 부분으로 의 엄격한 파티션 수를 계산 k하므로 원하는 기능은 다음과 같습니다 f n=n%n. 각각의 값은 k감소하는, 포함될 수 n에 의해 k, 또는 제외하고, 어느 쪽이 새로운 최대 k재귀주는 하부이다 n%k=n%(k-1)+(n-k)%(k-1).


n%k|q<-k-1=n%q+(n-k)%q라인 3에서 1 바이트를 줄입니다.
Izaak Weiss

0

줄리아, 53 바이트

n->endof(collect(filter(p->p==∪(p),partitions(n))))

이것은 정수를 받아들이고 정수를 반환하는 익명 함수입니다. 호출하려면 변수에 지정하십시오.

우리는 정수 파티션을 사용하여 얻을 partitions, filter별개의 피가수와 만에 collect배열로, 그리고 사용 마지막 인덱스 (즉, 길이를) 찾을 수 있습니다 endof.


0

하스켈, 58 바이트

import Data.List
h x=sum[1|i<-subsequences[1..x],sum i==x]

사용 예 : map h [0..10]->[1,1,1,2,2,3,4,5,6,8,10] .

간단한 무차별 접근 방식입니다. 의 모든 하위 시퀀스의 합계를 확인하십시오 1..x. 이것은 작동 x == 0의 모든 서브 시퀀스가 있기 때문에, 너무, [1..0]있다 [[]]와의 합 []이다 0.


0

05AB1E , 8 바이트

ÅœʒDÙQ}g

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

Ŝ          # Get all integer partitions of the (implicit) input
            #  i.e. 5 → [[1,1,1,1,1],[1,1,1,2],[1,1,3],[1,2,2],[1,4],[2,3],[5]]
  ʒ   }     # Filter by:
   D        #  Duplicate the current partition
    Ù       #  Uniquify (removing any duplicated values from) this copied partition
            #   i.e. [1,1,1,1,1] → [1]
            #   i.e. [1,4] → [1,4]
     Q      #  Check if it's still the same
            #   i.e. [1,1,1,1,1] and [1] → 0 (falsey)
            #   i.e. [1,4] and [1,4] → 1 (truthy)
       g    # Then take the length of the filtered list (and implicitly output it)
            #  i.e. [[1,4],[2,5],[5]] → 3

0

05AB1E , 5 바이트

LæOQO

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

참고 : 이것은 매우 느리고 약 20보다 큰 입력의 경우 시간 초과됩니다.

설명:

L         # range 1..input
 æ        # list of subsets
  O       # sum each subset
   Q      # equal? (1 for each sum that equals the input, 0 otherwise)
    O     # sum the booleans
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.