n의 모든 곱셈 파티션 나열


28

양수 주어 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}


답변:


6

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보다 크다)은 곱하기 파티션의 정의이므로이 기능은 기본적으로 질문의 직접적인 구현입니다.


6

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

기존 답변을 수정하지 않으시겠습니까?
Downgoat

3
@Downgoat : 두 가지 답변은 완전히 다른 접근법을 사용합니다. 알고리즘이 다르고 사용되는 언어 기능은 대부분 독립적입니다. 오래된 것을 새로운 것으로 교체하는 것은 의미가 없습니다 (그리고 더 길더라도 새 것을 게시했을 수도 있습니다). 이 메타 게시물 은 이러한 상황에서 별도의 답변을 게시하는 것이 바람직하다는 것을 나타냅니다.

1
나는 이것을 알고 있는지 모르겠지만 TIO의 인수를 변수 (예 : 대문자)로 설정하여 출력을 검색 할 수 있습니다. 예를 들면 .
Fatalize

5

Mathematica, 61 바이트

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

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


수학에는 끝에 세미콜론이 필요하지 않습니까?
Pavel

@Pavel 아니오, 세미콜론은 대화 형 노트북의 출력을 억제합니다. 이것을 지적 해 주셔서 감사합니다. btw 실수로 세미콜론을 끝냈습니다.
Martin Ender

4

Pyth-17 바이트

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

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

테스트 스위트 .


4

파이썬 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]].


Python의 내장 정수 유형에는 제한이 없으므로 부동 소수점은 너무 큰 입력에 대한 답변을 깨뜨릴 수 있으므로 허용되는 솔루션이 아닙니다.
orlp

@orlp Ok, Python 2로 돌아갑니다.
xnor

TL; DR 998은 너무 큰 입력이 아니라고 생각합니다. ;-) IMO 대기 시간 O(n)과 비슷 하고 파이썬 2 경쟁자와 비교하면 더 O(n^4)스타일 이 좋을 수 있습니다. f (998)은 메모리를 날려 버릴 수 있습니다. 다른 알고리즘으로 약 80 일이 소요되며이 알고리즘은 대략 내 컴퓨터에서 7 밀리 초 동안 결과를 얻습니다 [[2, 499], [998]]. IMO의 문제 N > 998RecursionError: maximum recursion depth exceeded in comparison정지를 위해 위의 Python 3 코드 ... happy golfing :-)
Dilettant

@Dilettant O(n^4)Python2 제출에 충분한 지 확실하지 않습니다 .D 테스트 사례 998을 고려하면 코드가 9 번 실행되고 (n+r-1)! / r! / (n-1)!매번 튜플의 양이 r2에서 선형으로 증가하고 n이 인 경우 계산 9 - 2합니다. 그러나 적어도 재귀 한계를 조정할 필요는 없습니다.
Yytsi

@ TuukkaX Caveat : 코드를 분석하지 않았고 그냥 넘어져서 최대 41 명의 N에 대한 두 후보 간의 런타임 개발을 비교 한 다음 의견을 저질렀다고 생각했습니다. 불쾌한 상황에서 어떻게 심층적 인 질문을했는지 생각해보십시오. 조사한 연구에 대해 충분히 애매 모호하기를 바랍니다.
Dilettant

3

젤리 , 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=³}~중복 제거 코드와 함께 코드를 작성하고 훨씬 짧은 길이로 프로그램을 해결할 수 있어야합니다. 그래도 거리가 멀어집니다.)


누군가 저축의 문자를 찾으십시오. 나는 엔트리가 매번 1 바이트 더 짧아지는 "바이트 전쟁"을 좋아한다. 프로그램의 구조적 부분에 충분한 바이트가 낭비되어 이것이 불가능할 것 같습니다.

1
허, 나는 놀랍도록 비슷한 것을 게시하려고했습니다. (. 더 자주 갱신 함) 2r이 될 수 있습니다 , 그리고 P=³$$될 수 있습니다 P=¥.
Dennis

P=¥왜 (논리적으로, 그것이 작동 해야 하며 게시물을 쓰는 동안 시도한 것 중 하나였습니다.; 나는 단지 그것을 다시 시도하여 확인했지만, 통역사에서 그것을 시도 할 때 작동하지 않습니다 . 그것은 내가 기대했던 것을 확실히하지 않습니다). 나는 우리의 1 바이트 저장 :-)이 추측 있도록하지만, 않습니다

1
다른 세부 사항에는주의를 기울이지 않았습니다. 당신은 교체해야 할 것 µ¹잘만큼 µ반복 범위 새로운 왼쪽 인자합니다.
Dennis

오 당연하지. 이제 캐릭터 수가 11 명으로 줄어 들고 기분이 좋아졌습니다. (내가 사용하는 ³것이 아니라 ¹단지 다양한.)

2

자바 스크립트 (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로 정의합니다 .


1

Python2, 198 191 172 180 바이트

from itertools import*
n=input()
for i in range(2,len(bin(n))):
 for P in combinations_with_replacement(range(2,n),i):
  if reduce(lambda a,b:a*b,P)==n:print(P)
print[(n,),()][n<2]

전체 프로그램. 이것은 많이 향상 될 수 있으므로 제안을 깊이 환영합니다!

1에서 31까지의 출력 (포함) :

(1,)
(2,)
(3,)
(2, 2), (4,)
(5,)
(2, 3), (6,)
(7,)
(2, 4), (2, 2, 2), (8,)
(3, 3), (9,)
(2, 5), (10,)
(11,)
(2, 6), (3, 4), (2, 2, 3), (12,)
(13,)
(2, 7), (14,)
(3, 5), (15,)
(2, 8), (4, 4), (2, 2, 4), (2, 2, 2, 2), (16,)
(17,)
(2, 9), (3, 6), (2, 3, 3), (18,)
(19,)
(2, 10), (4, 5), (2, 2, 5), (20,)
(3, 7), (21,)
(2, 11), (22,)
(23,)
(2, 12), (3, 8), (4, 6), (2, 2, 6), (2, 3, 4), (2, 2, 2, 3), (24,)
(5, 5), (25,)
(2, 13), (26,)
(3, 9), (3, 3, 3), (27,)
(2, 14), (4, 7), (2, 2, 7), (28,)
(29,)
(2, 15), (3, 10), (5, 6), (2, 3, 5), (30,)
(31,)

이것도 작동합니까? 4 -> {2, 2}, {4}문제의 테스트 사례가 있는데 로그에 이러한 출력이 표시되지 않습니다.
Borsunho

@Borsunho 이전 버전을 다시 볼 때 +1을 추가하는 것을 잊어 버렸습니다 int(math.log(n,2)). +2 바이트와 작동합니다. 감사!
Yytsi

가져 오지 math않았지만을 사용하고 math.log있습니다.
orlp

@orlp 나는 ...? 세 번째 줄에서.
Yytsi

그들은 ... 그 존재가 말했다, 거의 항상 거기로, 실례 @TuukkaX, 난 단지, 수입의 최상위 라인 보았다 len(bin(n))-2보다 짧습니다 int(math.log(n,2)).
orlp


1

클로저, 91 바이트

(defn f[n](conj(set(for[i(range 2 n):when(=(mod n i)0)j(f(/ n i))](sort(flatten[i j]))))n))

예제 실행 :

(map f [20 84])
(#{20 (2 2 5) (4 5) (2 10)} #{(7 12) (2 2 3 7) (2 3 14) (2 2 21) (2 6 7) (6 14) (3 4 7) (3 28) (4 21) (2 42) 84})

값 자체는 단일 숫자 (a가 list아님) 로 반환되고 다른 값은 목록으로 나타납니다. n끝은에 의해 대체 될 수 [n]뿐만 아니라 그것을 시퀀스를 만들기 위해, 또는 (list n)그것을 목록 확인합니다.



0

J, 35 바이트

([:~.]<@/:~@(*//.)"$~#\#:i.@!@#)@q:

시간이 제한된 인수 분해 문제 에 대한 솔루션 을 기반으로합니다 .

이 버전은 훨씬 비효율적이며 주요 요인의 수에 따라 요인 시간으로 실행됩니다. 팩토리얼 숫자를 생성하여 파티션을 생성합니다.

온라인으로 사용해보십시오! (온라인으로 큰 가치를 시도하지 마십시오!)

설명

([:~.]<@/:~@(*//.)"$~#\#:i.@!@#)@q:  Input: integer n
                                 q:  Prime factorization
(                              )@    Operate on them
                              #        Length
                            !@         Factorial
                         i.@           Range [0, i)
                     #\                Range [1, i]
                       #:              Mixed based conversion - Creates factoradic values
     ]                                 Get factors
            (    )"$~                  For each factoradic value
               /.                        Partition the factors based on equal
                                         digits in the factoradic value
             */                          Get the product of each block
        /:~@                             Sort it
      <@                                 Box it
 [:~.                                  Deduplicate

0

D, 95 바이트

void g(int n,int[]r){for(int i=r[0];i*i<=n;i++)(n%i)?0:g(n/i,i~r);r.back=n;r.writeln;}g(n,[2]);

재귀 솔루션입니다. 에서은 g(n,r), r지금까지 파티션이며, n아직 요인에 침입 왼쪽 값입니다. 순서가 지정되지 않은 각 파티션을 한 번만 가져 오려면 계수 r를 비 증가 순서로 정렬합니다 . 마지막 요소는 가능한 최소 요소에서 r시작 2하여n 각 출력 작업 직전에 각 사본에서 .

의 경우 n = 60출력은 다음과 같습니다.

[3, 2, 2, 5]
[2, 2, 15]
[3, 2, 10]
[5, 2, 6]
[2, 30]
[4, 3, 5]
[3, 20]
[4, 15]
[5, 12]
[6, 10]
[60]

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


void g(T)(T n,T[]r){for(T i=r[0];i*i<=n;i++)n%i0:r;r.back=n;r.writeln;}g(n,[2])
Gassa

당신이 가져올 필요로 어쨌든,이, 심지어 유효한 대답하지 std.stdio하고 std.range, 입력 1, 아무것도 인쇄하지 안된다 [1].
Zacharý

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