부분 집합 요소 찾기


14

유한 한 양의 정수 세트가 있다고 상상해 봅시다. 이 세트는 세트에 존재하는 각 정수가 스캔 트론 또는 펀치 카드 처럼 채워지는 점의 선으로 표시 될 수 있습니다 . 예를 들어 세트 {1,3,4,6}는 다음과 같이 표현 될 수 있습니다.

*.**.*

*는 우리 세트의 멤버를 .나타내며 그가 설정 한 멤버가 아닌 정수를 나타냅니다.

이 세트에는 "인자"가 있습니다. x를 x의 복사본으로 만들 수있는 경우 x는 y의 계수입니다. 보다 엄격하게 요인에 대한 정의는 다음과 같습니다.

  • y가 여러 개의 분리 된 집합 의 합집합 인 경우에만 x는 y의 인수입니다 . 모두 오프셋이있는 x입니다.

우리는 두 개의 사본을 종합 하여 명확하게 구성했기 때문에 *.*한 가지 요인*.**.*부를 것입니다 *.*.

*.**.*
------
*.*...
...*.*

요인 우리는 또한 그 말을, 끝으로 종료 할 필요는 없습니다 *.*의 요인이다*.*.*.*

*.*.*.*
-------
*.*....
....*.*

요인도 겹칠 수 있습니다. 이것은 *.*또한****

****
----
*.*.
.*.*

그러나 숫자는 한 번 이상 인자로 커버 될 수 없습니다. 예를 들어 의 요인 *.*아닙니다*.*.* .


보다 복잡한 예는 다음과 같습니다.

 *..*.**..***.*.*

이것은 *..*.*요인이 있습니다. 아래에서 세 개의 인스턴스를 정렬 한 것을 볼 수 있습니다 *..*.*.

*..*.**..***.*.*
----------------
*..*.*..........
......*..*.*....
..........*..*.*

직무

합리적인 표현으로 세트가 주어지면 입력 요소 인 모든 세트가 출력됩니다.

임의의 값으로 색인을 작성할 수 있습니다 (즉, 입력에 존재할 수있는 가장 작은 숫자를 선택할 수 있음). 입력 세트에 항상 가장 작은 값이 포함되어 있다고 가정 할 수도 있습니다.

이것은 질문이므로 가능한 한 적은 작업을 수행해야합니다.

테스트 사례

이 테스트 사례는 직접 작성했으며 큰 경우 실수가 두 개있을 수 있습니다.

*                -> *
*.*.*            -> *, *.*.*
*.*.*.*          -> *, *.*, *...*, *.*.*.*
******           -> *, **, *..*, ***, *.*.*, ******
*..*.**..***.*.* -> *, *..*.*, *.....*...*, *..*.**..***.*.*
*...*****.**.**  -> *, *...**.**, *.....*, *...*****.**.**

집합을 숫자 목록 (예 : [1,3,5,7]for *.*.*.*) 으로 가져 가면 정렬 된 것으로 가정 할 수 있습니까?
마틴 엔더

1
계수가 0과 1로 제한된 다항식의 제수를 찾는 것과 동등합니까?
xnor

1
@xnor 확실하지 않습니다. 경우 *.*.*= x+x^2+x^4다음 1+x+x^2= ***오른쪽 제수 것입니까? x+x^2+x^4 = (1-x+x^2)(1+x+x^2)
mbomb007

1
귀하의 예를 들어 @JonathanAllan, *같은 집합 표현하는 요소로 나열됩니다 *.또는 *...
마틴 엔더

1
@JonathanAllan 유효한 세트의 모든 ASCII 표현을 출력하지 않고 모든 세트를 출력합니다.
마틴 엔더

답변:


3

Mathematica, 71 68 바이트

#&@@@Cases[(s=Subsets)@s@#,x_/;Sort[Join@@x]==#&&Equal@@(#&@@@x-x)]&

{1,3,5,7}(정렬) 로 입력 하고로 출력합니다 {{1, 3, 5, 7}, {1, 3}, {1, 5}, {1}}. 이 함수는 많은 메시지를 던질 것입니다.

이것은 O (2 2 Nope )입니다 (여기서 N 은 입력 길이이며 o = p = e = 1입니다). ...). 서브 세트의 모든 서브 세트를 생성 한 다음, 함께 결합 될 때 (파티션 만 고려하고) 각 서브 세트의 가장 작은 값을 빼면 모든 요소가 동일한 위치에서 입력 전송을 수행하는 서브 세트를 선택합니다.


2

젤리 , 12 바이트

;÷@DỊȦ
ÆDçÐf

입력 및 출력을 사용 1하고0 대신 *하고 ..

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

작동 원리

ÆDçÐf   Main link. Argument: n (integer with decimal digits 1 and 0)

ÆD      Compute all divisors of n.
  çÐf   Filter; call the helper link with left argument d and right argument n for
        all divisors d of n. Return the array of d's for which the helper link
        returns a truthy value.


;÷@DỊȦ  Helper link. Left argument: d. Right argument: n

 ÷@     Divide n by d.
;       Concatenate, yielding [d, n÷d].
   D    Decimal; convert both integers in the pair to base 10.
    Ị   Insignificant; map 1 and 0 to 1, all other positive integers to 0.
     Ȧ  All; return 1 iff the result contains no zeroes.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.