Tìm các yếu tố tập hợp con


14

Hãy tưởng tượng chúng ta có một tập hợp hữu hạn các số nguyên dương. Tập hợp này có thể được biểu diễn dưới dạng một dòng các chấm trong đó mỗi số nguyên có trong tập hợp được điền vào giống như một scantron hoặc thẻ đục lỗ . Ví dụ: tập hợp {1,3,4,6}có thể được biểu diễn dưới dạng:

*.**.*

*đại diện cho một thành viên của tập hợp của chúng tôi và .đại diện cho một số nguyên không phải là thành viên của tập hợp anh ấy đặt.

Những bộ này có "yếu tố". Loosely x là một yếu tố của y nếu y có thể được xây dựng từ các bản sao của x. Nghiêm khắc hơn định nghĩa của chúng tôi về yếu tố như sau:

  • x là hệ số của y khi và chỉ khi y là liên kết của một số tập hợp rời rạc , tất cả đều là x với phần bù.

Chúng tôi sẽ gọi *.*một yếu tố của *.**.*bởi vì nó được thực hiện khá rõ ràng lên của hai bản sao của *.*cuối đặt để kết thúc.

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

Các yếu tố không phải là kết thúc để kết thúc, chúng tôi cũng sẽ nói rằng đó *.*là một yếu tố của*.*.*.*

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

Các yếu tố cũng có thể chồng chéo. Điều này cũng có nghĩa *.*là một yếu tố của****

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

Tuy nhiên, một số không thể được bao phủ bởi một yếu tố nhiều hơn một lần. Ví dụ *.*không một yếu tố của *.*.*.


Đây là một ví dụ phức tạp hơn:

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

Điều này có *..*.*như là một yếu tố. Bạn có thể thấy rằng bên dưới nơi tôi đã xếp hàng ba trường hợp *..*.*.

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

Bài tập

Cho một tập hợp bởi bất kỳ đầu ra biểu diễn hợp lý nào, tất cả các tập hợp là các yếu tố của đầu vào.

Bạn có thể lập chỉ mục theo bất kỳ giá trị nào (nghĩa là bạn có thể chọn một số nhỏ nhất có thể có trong đầu vào). Bạn cũng có thể giả định rằng bộ đầu vào sẽ luôn chứa giá trị nhỏ nhất đó.

Đây là một câu hỏi về vì vậy bạn nên cố gắng làm điều này với càng ít byte càng tốt.

Các trường hợp thử nghiệm

Những trường hợp thử nghiệm được thực hiện bằng tay, có thể có một hoặc hai lỗi trên những trường hợp lớn hơn

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

Nếu chúng ta lấy các thiết lập như một danh sách các số (ví dụ như [1,3,5,7]cho *.*.*.*) chúng ta có thể giả định rằng nó được sắp xếp?
Martin Ender

1
Điều này có tương đương với việc tìm các ước của đa thức có hệ số bị giới hạn ở 0 và 1 không?
xnor

1
@xnor Tôi không chắc. Nếu *.*.*= x+x^2+x^4, thì 1+x+x^2= ***sẽ là một ước, phải không? x+x^2+x^4 = (1-x+x^2)(1+x+x^2)
mbomb007

1
@Jonathan ALLan Đối với các ví dụ của bạn, *được liệt kê là một yếu tố đại diện cho tập hợp con tương tự như *.hoặc *...
Martin Ender

1
@Jonathan ALLan Nó nói đầu ra tất cả các bộ, không xuất ra tất cả các biểu diễn ASCII của các bộ hợp lệ.
Martin Ender

Câu trả lời:


3

Toán học, 71 68 byte

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

Đầu vào là {1,3,5,7}(sắp xếp) và đầu ra là {{1, 3, 5, 7}, {1, 3}, {1, 5}, {1}}. Các chức năng sẽ ném một loạt các tin nhắn.

Đây là O (2 2 Nope ) (trong đó N là độ dài của đầu vào và o = p = e = 1 ...). Nó tạo ra tất cả các tập hợp con của các tập hợp con, sau đó chọn những tập hợp dẫn đến gửi đầu vào khi được nối với nhau (đảm bảo chúng tôi chỉ xem xét các phân vùng) và trong đó tất cả các phần tử đều giống nhau nếu chúng tôi trừ đi giá trị nhỏ nhất của mỗi tập hợp con).


2

Thạch , 12 byte

;÷@DỊȦ
ÆDçÐf

Sử dụng đầu vào và đầu ra 10thay vì *..

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Æ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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.