태그 보관물: set-partitions

set-partitions

n의 모든 곱셈 파티션 나열 예를 들어 20에는 다음과 같은 고유

양수 주어 N 의 모든 고유 곱셈 파티션 출력 n은 임의의 편리한 포맷이.

곱하기 n의 파티션은 곱이 1보다 큰 정수 세트이므로 곱은 n 입니다. 예를 들어 20에는 다음과 같은 고유 한 곱셈 파티션이 있습니다.

2 * 2 * 5
2 * 10
4 * 5
20

순서는 중요하지 않으므로 2 * 2 * 5와 동일한 파티션 2 * 5 * 2입니다.


예 :

1 -> {}
2 -> {2}
4 -> {2, 2}, {4}
20 -> {2, 2, 5}, {2, 10}, {4, 5}, {20}
84 -> {2, 2, 3, 7}, {2, 2, 21}, {2, 14, 3}, {2, 6, 7}, {2, 42}, {4, 3, 7}, {28, 3}, {4, 21}, {6, 14}, {12, 7}, {84}


답변

Brachylog , 16 바이트

>~l:{1<}a.*?,.=o

이것은 양수를 입력으로 취하고 그것의 모든 곱셈 파티션을 생성 하는 함수 (전체 프로그램 아님)입니다 . (또한이 솔루션에서 주요 인수 분해 기본 제공을 사용하는 것을 피했습니다. 주로 도움이 될지 확신 할 수 없었기 때문에 어느 시점에서 더 내장 된 무거운 솔루션을 시도 할 수도 있습니다.)

온라인으로 사용해보십시오! (여기에 함수 주위에 추가 코드가 추가되어 전체 프로그램으로 작성되었습니다. 위에 표시된 함수를 TIO에 직접 제공하면 함수가 실행되지만 출력은 인쇄되지 않지만 시연으로 쓸모가 없습니다. .)

이 프로그램은 Brachylog 인터프리터의 버그와 사양의 결함을 실제로 해결하는 대신 문제를 해결하기 때문에 실제로 실망합니다. 그러나 통역사는 그 자체입니다. (이와 같은 프로그램에서도 인터프리터는 논리적으로 필요한 것보다 훨씬 많은 메모리를 사용하고 메모리 소진으로 인해 충돌하지만 작은 문제에서는 운 좋게도 원하는 출력을 먼저 생성 할 수 있습니다.) 가상의 “완벽한 버전의 Brachylog” 당신은 단지 ~*.o.:{>1}a,4 바이트 더 짧은을 쓸 수 는 있지만 인터프리터를 조금 더 돕기 위해 제약 조건을 추가해야했습니다. (나는 Brachylog를 정말로 좋아하지 않고 오히려 Prolog를 고수하려고하지만 프로그램을 작동시키기 위해 비슷한 힌트가 필요했고 작성하는 데 훨씬 더 오래 걸렸습니다. 그래서 Brachylog입니다.)

설명:

평소와 같이 Brachylog 프로그램은 일련의 제약 조건입니다. 기본적으로 첫 번째 제약 조건은 입력을 알 수없는 것으로 제한하고 ( A 라고 부름 ) 두 번째 제약 조건 은 출력을 도달 할 때까지 A 를 두 번째 알 수없는 B로 제한 합니다. 와 같은 일부 문자 {}는이 일반적인 흐름을 변경할 수 있으므로 중첩 된 술어에서 알 수없는 문자 를 나타 내기 위해 다른 문자 세트 (예 : X / Y )를 사용합니다.

>       A is smaller than the input
~l      B has length A
  1<    X is 1, Y is larger
:{1<}a  For each element X of B, it corresponds to an element Y of C
.       C, the output, and D are all identical
*       E is the product of D's elements
?       E, the input, and F are all identical
,       There's no constraint between F and G
.       G, the output, and H are all identical
=       H and I are identical, and need to be evaluated early
o       The output can be produced by sorting I

프로그램이 어떻게 작동하는지 아직 확실하지 않으므로 제약 조건을 약간 단순화 해 봅시다. C , D , G , HI 는 모두 동일하며 출력과 같습니다. EF 도 동일합니다 (입력과 동일). 따라서 우리의 제약은 다음과 같이 요약됩니다.

  • AB 와 출력 의 길이이며 입력보다 작습니다.
  • B 는 모두 1로 구성되며 특히 유용하지 않습니다 (기존 Brachylog 인터프리터에서 :{1<}a왼쪽 길이가 제한 길이를 갖거나 인터프리터가 무한 루프로 이동 하기 때문에 프로그램의 일부 임 ).
  • 출력은 전적으로 1보다 큰 숫자 (즉, B 의 해당 요소보다 큰 숫자)로 구성됩니다 .
  • 출력 요소의 곱은 입력과 같습니다.
  • 출력은 정렬하여 변경되지 않습니다 (즉, 정렬 된 순서로).

덧붙여서, 나는 출력의 모든 요소가 정수라고 명시 적으로 지정 하지 않았다 . 그러나 Brachylog의 제약 조건 솔버는 비정 수를 처리 할 수 ​​없으므로 정수가 포함 된 솔루션 만 편리하게 생성합니다.

분명히, 출력이 입력 곱셈 파티션마다 사실로 가고 “출력의 길이는 입력보다 작은”(인해 2 X > X 모두 음수 대 (X) , 즉 2 개의 긍정적 X ). 따라서 우리는 그 제약을 무시할 수 있습니다. Brachylog 통역사에게 프로그램 평가를위한 작업 전략을 제공하는 것만 있습니다. 다른 제약 조건 (출력이 정렬되고 제품이 입력이며 요소가 모두 1보다 크다)은 곱하기 파티션의 정의이므로이 기능은 기본적으로 질문의 직접적인 구현입니다.


답변

Brachylog 1, 14 바이트

:{$pp~c:*ao}fd

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

Brachylog 2, 11 10 바이트, 언어 날짜 도전 과제

{ḋp~c×ᵐo}ᵘ

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

Maltysen은 Pyth의 17 바이 트로이 질문에 대답 했으므로 질문의 사양을 Brachylog로 변환하여 작동하는 16 바이트 Brachylog 솔루션을 생각해 냈습니다. 내가 그렇게하는 동안 Dennis는 15 바이트 젤리 솔루션을 작성했습니다. 그래서 14 바이트로 내려 가야했습니다. 이것은 입력을 인수로 가져 와서 다른 솔루션과 마찬가지로 생성기가 아닌 모든 파티션 목록 을 반환 하는 함수 입니다 .

이 답변을 작성한 후 얼마 지나지 않아 Dennis와 나는 Jelly 솔루션을 11 바이트로 협력 적으로 얻을 수있었습니다. 새로운 버전의 Brachylog가 있으며, 더 간결한 구문이 있습니다. 도전 과제를 게시하므로 실제로 계산하지는 않지만 릴리스 된 즉시 11 바이트 총계를 너무 많이 관리 할 수 ​​있습니다. 나중에 다른 언어에서 영감을 얻은 언어 개정판은 여기에서 볼 수 있듯이 10만큼 낮아질 수 있습니다. 두 프로그램은 동일하지만 구문 만 다릅니다.

“골프 프리미티브”를 많이 사용하지 않고 문제를 직접 언급 한 다른 솔루션과 달리,이 솔루션은 Brachylog 제약의 모든 기능을 거의 무시하고 대신 Jelly 인상을 가장 잘 수행하여 왼쪽 주장은 이미 알려져있다 (따라서 제약 조건은 완전한 제약 조건이 아니라 단순히 젤리 모나드처럼 작용한다). 따라서 @Maltysen의 Pyth 솔루션과 동일한 알고리즘을 사용하는데, 이는 일반적인 골프 프리미티브를 사용하여이를 해결하는 가장 쉬운 방법 일 것입니다. (흥미롭게도 골프 프리미티브의 사용이 부족함에도 불구하고 Brachylog 인터프리터의 버그 / 결함이 아니라면 다른 답변의 “문제를 명시하십시오”솔루션이 더 짧을 것입니다. 언젠가는 “향상된 브라 키로그”를 작성해야합니다. 이런 종류의 문제에 대한 좋은 해결책을 얻기 위해; 골프 언어가 진행됨에 따라 Brachylog는 실제로 장황합니다.)

이 프로그램은 생성기와 그 주위에 래퍼로 ​​구성됩니다. 먼저 발전기에 대한 설명입니다.

$pp~c:*ao  ḋp~c×ᵐo
$p         ḋ        Prime factor decomposition of the input
  p         p       Generate all permutations
   ~c        ~c     Generate all inverse concatenations (i.e. partitions)
     :*a       ×ᵐ   Take the product of each list element in each partition
        o        o  Sort each partition

이렇게하면 문제가 거의 해결되지만 여러 파티션을 여러 번 생성하게됩니다. 따라서 솔루션을 중복 제거하려면 래퍼가 필요합니다.

:{…}fd
:{…}f     Convert generator to list
     d    Remove duplicate elements

{…}ᵘ      Convert generator to list of unique elements

답변

Mathematica, 61 바이트

±1={{}}
±n_:=Union@@(Sort/@Append[n/#]/@±#&/@Most@Divisors@n)

±파티션 목록을 리턴 하는 (재귀) 단항 연산자 를 정의합니다 .


답변

Pyth-17 바이트

소인수 분해의 모든 순열을 취한 다음 각각을 분할 한 다음 모든 분할을 생성 한 다음 고유 분할 만 유지합니다.

{mS-*Md1s./M.p+1P

테스트 스위트 .


답변

파이썬 2, 70 바이트

f=lambda n,k=2,l=[]:n/k and(n%k<1)*f(n/k,k,l+[k])+f(n,k+1,l)or 1/n*[l]

정렬 된 목록의 목록을 출력합니다. 예를 들어 f(20)입니다 [[2, 2, 5], [2, 10], [4, 5], [20]].


답변

젤리 , 14 13 11 바이트

Ḋx³ŒPQP=¥Ðf

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

@Dennis의 Jelly 솔루션을 향상시킬 수 있다고 확신했습니다. 불행하게도, 나는 Brachylog 기록을 이길 수 없었지만, 그것을 묶는 데 성공했습니다. 업데이트 : @Dennis의 도움으로 이제 개선되었습니다. 젤리가 왕관을 되 찾는 것 같아요.

이 프로그램은 엄청나게 비효율적이며 O (2 n 2 ) 성능을 갖 습니다 (위의 테스트 사례가 입력 4에 대해 표시하는 이유). 4시에 빠르게, 5시에 매우 느리게 완료되며, 더 큰 숫자를 실행하는 것이 실제로 불가능할 수 있습니다.

흥미롭게도 Brachylog는 문제를 설명하는 솔루션 (Brachylog가 우수함)에서 입력 인수 분해 (Jelly가 우수함)를 기반으로 알고리즘을 사용한 솔루션으로 이동하여 개선되었습니다. 한편, 젤리 솔루션에서 멀리 이동하여 개선되었다 자사의 강점, 그냥 문제를 설명하는 솔루션에 다시 가고.

설명:

Ḋx³ŒPQP=¥Ðf
Ḋ              List of integers from 2 to the input (apparently undocumented)
 x³            Make a number of copies of each that's equal to the input
   ŒP          Take all (possibly noncontiguous) subsequences of that list (!)
     Q         Remove duplicates
         Ðf    Filter, keeping elements where:
      P=         their product is equal to {the original input, by default}
        ¥      Parse preceding two links as a unit

의 출력 Ḋx이 정렬 되기 때문에 각 하위 시퀀스도 정렬되어야하므로 개별적으로 정렬 할 필요가 없습니다. 따라서 “서로 다른 순서로 동일한 출력이 중복됩니다”는 문제의 일부이고, “출력의 모든 값은> 1″문제의 일부로 생성에 의해 해결됩니다. 그 외에도, 기본적으로 여기서하는 것은 문제가되는 모든 목록을 P=³생성 한 다음 잘못된 목록을 필터링하여 (어느 정도 비효율적 인 방법 으로든) ” 모든 목록 찾기 “입니다.

(누군가는 젤리와 브라 키로그의 하이브리드, 정말 좋은 구속력있는 솔버를 발명하여 {P=³}~중복 제거 코드와 함께 코드를 작성하고 훨씬 짧은 길이로 프로그램을 해결할 수 있어야합니다. 그래도 거리가 멀어집니다.)


답변

자바 스크립트 (ES6), 74 67 바이트

f=(n,m=2,a=[])=>n>1?m>n?[]:f(n,m+1,a).concat(f(n/m,m,[...a,m])):[a]

for (var i = 1; i < 31; i++) console.log(JSON.stringify(f(i)));

직접 순환 문제를 해결 각 정수에 대해 m2N , 우리의 각 파티션 받아 N / m 의 최소 요소 m을 하고 APPEND의 (중복 파티션 피하기 위해) m을 . ( n을 나누지 않는 m의 경우, 정수 배열은 10 진수로 곱하지 않기 때문에 빈 배열이됩니다.) 무한 재귀를 피하기 위해 빈 배열의 기본 사례를 1로 정의합니다 .