몇 개의 파티션이 있습니까?


16

양의 정수의 파티션 수는 양의 정수의 합으로 표현 될 수있는 방법의 수로 정의됩니다. 다시 말해, 정수 파티션의 수입니다. 예를 4들어이 숫자 는 다음과 같은 부분으로 구성됩니다.

[[1, 1, 1, 1], [1, 1, 2], [1, 3], [2, 2], [4]]

따라서 5파티션이 있습니다. 이다 OEIS A000041 .


직무

양의 정수 N이 주어지면 파티션 번호를 결정합니다.

  • 모든 표준 규칙이 적용됩니다.

  • 입력과 출력은 합리적인 수단을 통해 처리 될 수 있습니다.

  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.


테스트 사례

입력 | 산출

1 | 1
2 | 2
3 | 삼
4 | 5
5 | 7
6 | 11
7 | 15
8 | 22
9 | 30
10 | 42

1
나는 이것이 복제본이라고 거의 긍정적이다 ...
James

@DJMcMayhem 음, 알았어. 사본이 있으면 알려주세요. 죄송합니다.이 모든 것이 처음입니다!

1
@DJMcMayhem 이 질문 은 "생성"에서 "계산"까지의 짧은 단계이기 때문에 요청한 질문 일 수도 있지만 계산하기 위해 반드시 모든 파티션을 생성 할 필요는 없습니다.
Giuseppe

1
이것은 팝콘 (?)이며 너무 넓게 닫힌 속임수입니다. IMHO 이것은 더 잘 쓰여지고 열려 있어야하는 반면, 오래된 것들은 속임수로 다시 열어야한다
Rod

2
@로드, 그것은 나쁜 팝콘이지만, 마감 이유를 속이기로 바꾸는 것은 개선되지 않을 것입니다. 성능 요구 사항은 일부 답변을 포팅하는 데 장애가 될 것입니다 (아무도 몇 분 안에 1000의 24061467864032622473692149727991 파티션 을 생성 하지 않음 ). Hardy-Ramanujan-Rademacher 구현은 정확하게 구현되지 않았습니다 ... 그러나이 질문과 그 질문에 대해 메타에 관한 토론을 여는 것이 좋습니다.
피터 테일러

답변:


13

Pyth , 3 바이트

l./

여기 사용해보십시오! 또는 테스트 스위트를 사용해보십시오.

대답은 코드 자체를 작성하는 것보다 형식을 지정하는 데 훨씬 오래 걸렸습니다.


어떻게?

Pyth는 작업에 적합한 도구입니다.

l. / 암시 적 입력을 포함한 전체 프로그램.

 ./ 정수 파티션. 입력에 추가되는 모든 정렬 된 양의 정수 목록을 반환합니다.
l 길이.
      암시 적으로 결과를 출력합니다.


8

파이썬 2 , 85 83 바이트

@notjagan 덕분에 -2 바이트

lambda n:n<1or sum(sum(i*((n-k)%i<1)for i in range(1,n+1))*p(k)for k in range(n))/n

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

OEIS A000041의 재귀 공식 사용 .



84 바이트 . 이 경우 ==0와 같습니다 <1. 편집 : notjagan의 접근 방식 사용
Mr. Xcoder

@ Mr.Xcoder 원래 코드는 실제로 <1대신을 가지고 ==0있었지만 TIO 코드는 그렇지 않았습니다.
notjagan


8

이모 지 코드 0.5, 204 201 바이트

🐋🚂🍇🐖🅰️➡🚂🍇🍊⬅🐕1🍇🍎1🍉🍮s 0🔂k⏩0🐕🍇🍦t➖🐕k🍮r t🔂i⏩1 t🍇🍊😛🚮t i 0🍇🍮➕r i🍉🍉🍮➕s✖r🅰️k🍉🍎➗s🐕🍉🍉

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

"보다 작음"이모티콘은 상당히 긴 UTF-8 인코딩을 갖기 때문에 "2보다 작음"대신 "1보다 작거나 같음"을 사용하여 -3 바이트. 또한 t바이트 수에 영향을 미치지 않고 경고를 침묵시키기 위해 동결되었습니다.

🅰️이라는 메소드로 🚂 (정수) 클래스를 확장합니다. 입력에서 숫자를 가져와 숫자에 대해 🅰️을 호출하고 다음과 같이 결과를 인쇄하는 간단한 프로그램을 작성할 수 있습니다.

🏁🍇
 🍦str🔷🔡😯🔤Please enter a number🔤
 🍊🍦num🚂str 10🍇
  😀🔡🅰️num 10
 🍉🍓🍇
  😀🔤Learn what a number is, you moron!🔤
 🍉
🍉

이 부분은 메시지와 오류 처리를 생략하여 많이 골라 낼 수 있지만 점수에는 포함되지 않으므로 대신 Emojicode의 더 많은 기능을 표시하면서 가독성을 향상시키는 것을 선호합니다.

언 골프

🐋🚂🍇
 🐖🅰️➡🚂🍇
  🍊◀️🐕2🍇
   🍎1
  🍉
  🍮sum 0
  🔂k⏩0🐕🍇
   🍦nmk➖🐕k
   🍮sig nmk
   🔂i⏩1 nmk🍇
    🍊😛🚮nmk i 0🍇
     🍮➕sig i
    🍉
   🍉
   🍮➕sum✖sig🅰️k
  🍉
  🍎➗sum🐕
 🍉
🍉

설명

참고 : 이모 지 코드 0.5에서는 많은 이모 지 선택이 의미가 없습니다. 결국 0.x입니다. 0.6이이 문제를 해결합니다.

Emojicode는 제네릭, 프로토콜, 옵션 및 클로저를 특징으로하는 객체 지향 프로그래밍 언어이지만이 프로그램은 클로저를 사용하지 않으며 모든 제네릭과 프로토콜은 암시적인 것으로 간주 될 수 있지만 I / O 스텁에는 옵션 만 나타납니다.

프로그램은 몇 가지 유형에서만 작동합니다. 🚂는 정수 유형, 🔡는 문자열 유형 및 ⏩는 범위 유형입니다. 부울 (👌)도 몇 개 나타나지만 조건에서만 사용됩니다. 부울 값은 각각 👍 또는 👎이며, 각각 true 및 false에 해당합니다.

Emojicode에는 현재 연산자가 없으므로 일반적으로 연산자 인 비교, 비교 및 ​​기타 작업은 함수로 구현되어 표현식에 접두사 표기법을 효과적으로 사용 합니다 . 운영자는 0.6에 계획되어 있습니다.

먼저 테스트 프로그램을 다루겠습니다.

🏁

이것은 다른 언어의 main과 비교할 수있는 🏁 블록입니다.

🍇 ... 🍉

포도와 수박은 그림 코드로 코드 블록을 선언합니다.

🍦str🔷🔡😯🔤Please enter a number🔤

이것은 "frozen"이라는 이름을 선언 str하고이 값을 초기화 자 (생성자) 😯를 사용하여 생성 된 새 문자열로 설정합니다.이 문자열은 프롬프트를 문자열로 사용하여 사용자로부터 행을 입력합니다. 변수 대신 고정을 사용하는 이유는 무엇입니까? 변경되지 않으므로 변수가 경고를냅니다.

🍊🍦num🚂str 10

그것을 분해하자. 🚂str 10에 🚂 메소드를 호출 str규칙, 형식 변환의 이름을 해당 유형의 객체라는 방법으로 인수 (10) 냉동합니다. 10은 정수 변환에 사용되는 기본입니다. 이 메소드는 선택적을 리턴합니다 🍬🚂. 선택 사항은 기본 유형의 값을 포함하거나 무의미도 포함 할 수 있습니다 (⚡). 문자열에 숫자가 없으면 ⚡이 반환됩니다. 값을 사용하려면 🍺을 사용하여 선택 사항을 래핑 해제해야합니다. 값이 ⚡이면 런타임 오류가 발생합니다. 따라서 옵션을 풀기 전에 아무것도 확인하지 않는 것이 좋습니다. 실제로 Emojicode는 그 약어를 사용하는 것이 일반적입니다. 일반적으로 🍊"if"입니다.🍊🍦 variable expression의미 : 표현을 평가합니다. 옵션에 아무것도 포함되어 있지 않으면 조건이 👎 (거짓)으로 평가됩니다. 그렇지 않으면 variable옵션의 래핑되지 않은 값으로 고정 이름 이 만들어지고 조건은 👍, (true)로 평가됩니다. 따라서 정상적인 사용에서는 🍇 ... 🍉조건에 따른 블록이 입력됩니다.

😀🔡🅰️num 10

🅰️은 파티션 수를 계산하는 🐋을 사용하여 주 코드가 🚂에 추가하는 방법입니다. num조건부에서 선언 한 고정 된 상태에서 🅰️을 호출 하고 🔡 메서드로 밑 10을 사용하여 결과를 문자열로 변환합니다. 그런 다음 😀가 ​​결과를 인쇄합니다.

🍓🍇 ... 🍉

🍓는 "else"를 의미하므로 사용자가 숫자를 올바르게 입력하지 않으면이 블록이 입력됩니다.

😀🔤Learn what a number is, you moron!🔤

문자열 리터럴을 인쇄합니다.

이제 메인 프로그램을 보자. 나는 ungolfed 버전을 설명 할 것이다; 골프 버전은 공백을 제거하고 변수 이름을 단일 문자 이름으로 바꿨습니다.

🐋🚂🍇 ... 🍉

🚂 클래스를 확장하십시오. 이것은 프로그래밍 언어에서 일반적으로 발견되지 않는 기능입니다. 🐋를 수퍼 클래스로 사용하여 새 클래스를 만드는 대신 🐋은 🚂를 직접 수정합니다.

🐖🅰️➡🚂🍇 ... 🍉

🚂를 반환하는 🅰️이라는 새 메서드를 만듭니다. 수식을 사용하여 계산 된 파티션 수를 반환합니다.a(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)

🍊⬅🐕1🍇
 🍎1
🍉

🐕는 다른 언어와 비슷 this하거나 self다른 언어로 메소드가 호출 된 객체를 나타냅니다. 이 구현은 재귀 적이므로 종료 조건입니다. 메소드가 호출 된 수가 1보다 작거나 같으면 1을 리턴하십시오.

🍮sum 0

새 변수를 작성하고 sum0으로 설정하십시오. 내재적으로 🚂 유형을 가정합니다.

🔂k⏩0🐕

🔂는 🔂🐚⚪️ 프로토콜을 구현하는 모든 것을 반복하지만 ⏩는 🔂🐚🚂을 구현하는 범위 리터럴입니다. 범위에는 시작 값, 중지 값 및 단계 값이 있으며이 값은 1이면 1 start < stop, 그렇지 않으면 -1로 가정합니다 . literal를 사용하여 범위 리터럴을 작성하여 단계 값을 지정할 수도 있습니다. 시작 값은 포함되지만 중지 값은 배타적이므로 수식에서 for k in range(n)또는에 해당 Sum_{k=0..n-1}합니다.

🍦nmk➖🐕k

n - k즉, sigma (n-k) 또는 제수의 합을 계산해야 하며 인수가 몇 번 필요하므로 일부 바이트를 저장하기 위해 n - k변수 nmk에 저장합니다.

🍮sig nmk
🔂i⏩1 nmk

sig변수를 sigma의 인수로 설정하고 1에서 1까지의 모든 숫자를 반복합니다 nmk - 1. 변수를 0으로 초기화하고 1..nmk 이상 반복 할 수는 있지만이 방법은 짧습니다.

🍊😛🚮nmk i 0

🚮는 나머지를 계산하거나, 계수와 😛이 같은지 점검하므로, i나눗셈의 경우 조건은 👍 입니다 nmk.

🍮➕sig i

이것은 += -= >>=이모티콘이없는 열등한 언어 로 된 오퍼레이터 패밀리 와 유사하게 전화로 할당 됩니다. 이 줄은로 쓸 수도 있습니다 🍮 sig ➕ sig i. 따라서 내부 루프가 완료된 후의 sig제수의 합 n - k또는sigma(n - k)

🍮➕sum✖sig🅰️k

호출에 의한 또 다른 할당이므로 sigma(n - k) * A(k)수식에서와 같이 총계에 추가 됩니다.

🍎➗sum🐕

마지막으로 합은 n으로 나눠지고 몫이 반환됩니다. 이 설명은 아마도 코드 자체를 작성하는 데 3 시간이 걸렸을 것입니다.



3

옥타브, 18 바이트

partcnt(input(''))

내장 함수 partcnt를 사용합니다.

@를 사용하여 익명 함수를 사용하여 올바르게 얻을 수 없으면 도움이 될 것입니다.


3

망막 , 34 바이트

.+
$*
+%1`\B
;$'¶$`,
,

%O`1+
@`.+

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

설명

.+
$*

입력을 단항으로 변환하십시오.

+%1`\B
;$'¶$`,

단항 자릿수 목록의 2 개의 n-1 파티션을 모두 계산 합니다. 우리는 (반복하여 수행 할 +제 (일치) 1() 비 단어 경계 \B둘 명 사이, 즉 위치 1각 라인 (투입들) %)와 함께 교체 ;그것 (후 모두 $') 줄 바꿈 ( 앞), 모든 그것 ( $`)과, . 예:

1;1,111

된다

      vv
1;1,1;11
1;1,1,11
^^^^^

어디 v마크의 결과 $'^결과 표시 $`. 이것은 한 번에 두 개의 다른 대체 결과를 얻는 일반적인 관용구입니다.;, 두 개의 완전한 대체를 완료하기 위해 문자열의 누락 된 "반쪽"뿐만 아니라 대체 와 대체를 ).

우리는 ;실제 파티션으로 간주 하고 ,자리 표시 자로 간주하여 이후에 \B일치 하지 못하게 합니다. 다음은 ...

,

... 우리는 그 쉼표를 제거합니다. 그것은 우리에게 모든 파티션을 제공합니다. 예를 들어 입력의 경우 다음 4을 얻습니다.

1;1;1;1
1;1;11
1;11;1
1;111
11;1;1
11;11
111;1
1111

우리는 주문에 대해 신경 쓰지 않습니다.

%O`1+

이것은 1각 라인에서 s 의 실행을 정렬하여 정렬되지 않은 파티션을 얻습니다.

@`.+

마지막으로의 고유 한 @일치 ( ) .+, 즉 우리가 얻은 별개의 라인 / 파티션 수를 계산합니다. 나는이 @옵션을 오래 전에 추가 한 다음 완전히 잊어 버렸으며 최근에 다시 발견했습니다. 이 경우을 사용하여 첫 번째 중복 제거보다 바이트를 절약합니다 D`.


3

파이썬 2 , 54 53 바이트

f=lambda n,k=1:1+sum(f(n-j,j)for j in range(k,n/2+1))

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

작동 원리

각 파티션 N은 리스트로 표현 될 수있다 , X = [X 1 , ⋯, X의 m ] 되도록 X 1 + X + ⋯ m = N . 이 표현은 x 1 ≤ ⋯ ≤ x m이 필요한 경우 고유합니다. .

하한 k로 파티션을 계산 하는 보조 함수 f (n, k) , 즉 x 1 + ⋯ + x m = nk ≤ x 1 ≤ ⋯ ≤ x m 과 같은 리스트 x를 정의 합니다. 입력 n의 경우, 시도는 f (n, 1) 의 출력을 요청합니다. .

양의 정수를 들어 , Nk는 되도록 k는 ≤ N , 하한을 가진 적어도 하나 개의 파티션이있다 K 싱글리스트 : [N]가 . 경우 N = K (특히, 만약 N = 1 ), 이는 인 유일한 적격 파티션. 반면에 k> n 인 경우 솔루션이 전혀 없습니다.

경우 K는 <N , 우리는 재귀 왼쪽에서 오른쪽들을 구축함으로써 나머지 분할 카운트 수로서 따른다. k ≤ j ≤ n / 2 와 같은 각 j에 대해 파티션 [x 1 , ⋯, x m ] = [j, y 1 , ⋯, y m-1 ]을 만들 수 있습니다. 우리가이 X 1 + X + ⋯ m = N 경우에만, Y 1 + ⋯ Y + m-1 = N - J . 또한, j ≤ y 1 ≤ ⋯ ≤ y m-1 인 경우에만 x 1 ≤ ⋯ ≤ x m 입니다.

따라서 j로 시작하는 n 의 파티션 xf (n-j, j) 로 계산 될 수 있으며 , 이는 유효한 파티션 y 를 계산합니다 . j ≤ n / 2 을 요구함으로써 j ≤ n-j 임을 보증 하므로 적어도 하나의 y 가 있어야 합니다. 따라서 유효한 모든 j 값에 대해 1 ( [n] )과 f (n-j, j) 을 합산 하여 n의 모든 파티션 을 계산할 수 있습니다 .

이 코드는 수학 함수 f 의 간단한 구현입니다 . 또한 k 기본값을 1 로 설정하므로 입력 n에 대한 f (n, 1)f(n) 값을 계산합니다 .


와우, 이거 대단해! 작동 방식에 대한 설명을 추가 할 수 있습니까?

내 답변을 편집했습니다. 확실치 않은 사항이 있으면 알려주십시오.
Dennis

3

J , 37 35 바이트

0{]1&((#.]*>:@#.~/.~&.q:@#\%#),])1:

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

설명

0{]1&((#.]*>:@#.~/.~&.q:@#\%#),])1:  Input: n
                                 1:  Constant 1
  ]                                  Get n
   1&(                          )    Repeat n times on x = [1]
                          \            For each prefix
                         #               Length
                      q:@                Prime factors
                 /.~&                    Group equal factors
              #.~                        Compute p+p^2+...+p^k for each group
           >:@                           Increment
                    &.q:                 Product
                           %           Divide
                            #          Length
         ]                             Get x
          *                            Times
   1   #.                              Sum
                              ,        Joim
                               ]       Get x
                                       Set this as next value of x
0{                                   Select value at index 0

멍청하고 멍청한 데 설명을 올리시겠습니까?
cole

1
@cole 이것은 p (0) = 1에 대한 솔루션으로 시작하고 공식을 사용하여 다음을 빌드하는 반복적 인 접근 방식입니다 p(n) = sum(sigma(n-k) * p(k) for k = 0 to n-1) / n. 코드를 크게 단축 할 수 없다고 생각되면 나중에 코드에 대한 설명을 추가하겠습니다.
마일

2

자바 스크립트, 125 121 바이트

n=>(z=(a,b)=>[...Array(a)].map(b))(++n**n,(_,a)=>z[F=z(n,_=>a%(a/=n,n)|0).sort().join`+`]=b+=eval(F)==n-1&!z[F],b=0)|b||1

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

경고 : 시간과 공간의 복잡성은 기하 급수적입니다. 많은 수의 경우 매우 느리게 작동합니다.


2

파이썬 2 , 89 바이트

Mr.Xcoder에 의해 -9 바이트 notjagan에 의해 -1 바이트

lambda n:len(p(n))
p=lambda n,I=1:{(n,)}|{y+(x,)for x in range(I,n/2+1)for y in p(n-x,x)}

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



@ Mr.Xcoder 심지어 람다 D를 사용하지 않은 이유조차 모릅니다.
Dead Possum

헤헤, ¯\_(ツ)_/¯- 당신이 그것을 전체 기능을 유지하기를 원한다면 BTW, 당신은 변수, 필요하지 않을 94 바이트
씨 Xcoder

@ Mr.Xcoder 그래 .. codegolf에서 벗어난 후 녹슨 느낌이 듭니다 : c
Dead Possum



0

자바 8 (229 바이트)

import java.util.function.*;class A{static int j=0;static BiConsumer<Integer,Integer>f=(n,m)->{if(n==0)j++;else for(int i=Math.min(m,n);i>=1;i--)A.f.accept(n-i,i);};static Function<Integer,Integer>g=n->{f.accept(n,n);return j;};}

언 골프 드 :

import java.util.function.*;

class A {
    static int j = 0;
    static BiConsumer<Integer, Integer> f = (n, m) -> {
        if (n == 0)
            j++;
        else
            for (int i = Math.min(m, n); i >= 1; i--)
                A.f.accept(n - i, i);
    };
    static Function<Integer, Integer> g = n -> {
        f.accept(n, n);
        return j;
    };
}



0

자바 스크립트 ES7, 69 바이트

n=>(f=(i,s)=>i?[for(c of Array(1+n))f(i-1,s,s-=i)]:c+=!s)(n,n,c=0)&&c

자바 스크립트 ES6, 71 바이트

n=>(f=(i,s)=>i?[...Array(1+n)].map(_=>f(i-1,s,s-=i)):c+=!s)(n,n,c=0)&&c

시간 복잡도 O (n ^ n)이므로주의해야합니다 (내 컴퓨터에 대한 지연이 눈에 띄게 나타남 F(6))

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