Tính số lượng cấu trúc liên kết trên {1,2, Hoài, n}


9

Bài tập

Viết hàm / chương trình lấy ntham số / đầu vào và in / trả về số lượng cấu trúc liên kết (được thể hiện bên dưới) trên tập hợp {1,2,...,n}.

Định nghĩa cấu trúc liên kết

Đặt X là tập hợp hữu hạn và giả sử rằng T, là tập con của tập hợp sức mạnh của X (tức là tập hợp chứa các tập con của X), thỏa mãn các điều kiện sau:

  1. X và tập rỗng nằm trong T.

  2. Nếu hai tập hợp U và V nằm trong T, thì liên kết của hai tập hợp đó nằm trong T.

  3. Nếu hai tập hợp U và V nằm trong T, thì giao điểm của hai tập hợp đó nằm ở T.

... thì T được gọi là cấu trúc liên kết trên X.

Thông số kỹ thuật

  1. Chương trình của bạn là:

    • một hàm lấy ntham số
    • hoặc một chương trình đầu vào n

    và in hoặc trả về số lượng cấu trúc liên kết (riêng biệt) trên tập hợp {1,2,...,n}.

  2. n là bất kỳ số nguyên không âm nào nhỏ hơn 11 (tất nhiên không có vấn đề gì nếu chương trình của bạn xử lý n lớn hơn 11) và đầu ra là một số nguyên dương.

  3. Chương trình của bạn không nên sử dụng bất kỳ loại chức năng thư viện hoặc chức năng riêng nào tính trực tiếp số lượng cấu trúc liên kết.

Ví dụ đầu vào (giá trị của n): 7

Ví dụ đầu ra / trả về: 9535241

Bạn có thể kiểm tra giá trị trả lại của bạn tại đây hoặc ở đây .

Tất nhiên, mã ngắn nhất sẽ thắng.


Người chiến thắng được quyết định, tuy nhiên, tôi có thể thay đổi người chiến thắng nếu mã ngắn hơn xuất hiện ..


Liệu nó có phải đưa ra kết quả trong thế kỷ này, hoặc là một bằng chứng về sự đúng đắn đủ tốt?
Peter Taylor

@Peter Thực tế, tôi không biết sẽ mất bao lâu. Do đó, bằng chứng về tính đúng đắn của chương trình là đủ tốt, nhưng chương trình vẫn cho kết quả trong thời gian hợp lý nếu n nhỏ, như 4 ~ 5.
JiminP

@JiminP, có vẻ như việc tính toán nó cho n = 12 đáng giá một tờ giấy trong ngày và không có một công thức nào được biết đến. Trong 4 hoặc 5 tôi nghi ngờ điều đó có thể thực hiện được trong vài phút bằng vũ lực.
Peter Taylor

Là tập hợp con không đúng của 2 ^ X cũng là một cấu trúc liên kết?
FUZxxl

@FUZxxl: Vâng. Tôi nghĩ đó được gọi là cấu trúc liên kết rời rạc .
JiminP

Câu trả lời:


4

Haskell, 144 ký tự

import List
import Monad
p=filterM$const[True,False]
f n=sum[1|t<-p$p[1..n],let e=(`elem`t).sort,e[],e[1..n],all e$[union,intersect]`ap`t`ap`t]

Hầu như là một thực hiện trực tiếp của đặc điểm kỹ thuật, modulo một số ma thuật đơn nguyên.

Vô cùng chậm chạp cho n > 4.


5

Python, 147 ký tự

N=input()
S=lambda i,K:1+sum(0if len(set(j&k for k in K)-K)-1 else S(j+1,K|set(j|k for k in K))for j in range(i,2**N))
print S(1,set([0,2**N-1]))

Nhanh cho N <= 6, chậm cho N = 7, không chắc N> = 8 sẽ hoàn thành.

Các bộ riêng lẻ được biểu diễn bằng các bitmasks nguyên và các cấu trúc liên kết bằng các bộ bitmasks. S(i,K)tính toán số lượng cấu trúc liên kết riêng biệt mà bạn có thể hình thành bằng cách bắt đầu Kvà thêm các bộ với bitmasks> = i.


0

Zsh, 83 ký tự

Giải pháp này phù hợp với thư yêu cầu của bạn (nhưng tất nhiên, không phải là tinh thần). Chắc chắn có một cách để nén số lượng nhiều hơn.

a=(0 3 S 9U 5CT 4HO6 5ODFS AMOZQ1 T27JJPQ 36K023FKI HW0NJPW01R);echo $[1+36#$a[$1]]
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.