Tách số nguyên của tôi


21

Giới thiệu

Trong lĩnh vực toán học được gọi là cấu trúc liên kết , có những thứ gọi là tiên đề tách . Theo trực giác, bạn có một tập hợp Xvà một tập hợp các tập hợp con Xmà chúng ta có thể nghĩ là thuộc tính. Hệ thống được phân tách tốt, nếu người ta có thể phân biệt giữa tất cả các mục Xdựa trên thuộc tính của chúng. Các tiên đề tách chính thức hóa ý tưởng này. Trong thử thách này, nhiệm vụ của bạn là kiểm tra ba tiên đề phân tách, được đưa ra Xvà danh sách các thuộc tính.

Đầu vào

Đầu vào của bạn là một số nguyên n ≥ 2và danh sách Tcác số nguyên. Các số nguyên trong Tđược rút ra từ X = [0, 1, ..., n-1]. Các danh sách trong Tcó thể trống và chưa được sắp xếp, nhưng chúng sẽ không chứa các bản sao.

Đầu ra

Đầu ra của bạn là một trong bốn chuỗi, được xác định bởi ba tiên đề tách, mỗi chuỗi mạnh hơn lần trước. Có những tiên đề khác, nhưng chúng tôi gắn bó với những điều này cho đơn giản.

  • Giả sử rằng đối với tất cả các khác biệt xytrong X, tồn tại một danh sách Tchứa chính xác một trong số chúng. Sau đó XTthỏa mãn tiên đề T0 .
  • Giả sử rằng đối với tất cả các khác biệt xytrong X, tồn tại hai danh sách T, một trong số đó chứa xnhưng không y, và danh sách kia chứa ynhưng không x. Sau đó XTthỏa mãn tiên đề T1 .
  • Giả sử rằng hai danh sách trên cũng không chứa các yếu tố chung. Sau đó XTthỏa mãn tiên đề T2 .

Đầu ra của bạn là một trong những T2, T1, T0hoặc TS, tùy thuộc vào các điều kiện trên nắm giữ ( TScó nghĩa là không ai trong số họ làm). Lưu ý rằng T2 mạnh hơn T1, mạnh hơn T0 và bạn phải luôn luôn đưa ra tiên đề mạnh nhất có thể.

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.

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

2 [] -> TS
2 [[],[1]] -> T0
2 [[0],[1]] -> T2
3 [[0],[0,1,2],[1,2]] -> TS
3 [[],[0],[0,1],[2]] -> T0
3 [[0],[0,1],[2,1],[0,1,2]] -> T0
3 [[0],[0,1],[2,1],[2,0]] -> T1
6 [[0,2,4],[0,3,5],[1,2],[3,4,5]] -> TS
6 [[0,2,4],[0,3,5],[1,2],[2,5],[3,4,5]] -> T0
6 [[0,2,4],[0,3,5],[1,2],[2,5],[3,1],[3,4,5]] -> T1
6 [[0,1],[0,2,3],[1,4],[2,4],[2,3,5],[1,3],[4,5]] -> T2

Là đầu vào nthừa? Trong phần còn lại của thử thách, tôi không thấy nó được sử dụng ngoài việc xác định các yếu tố nào có thể có T, vậy nó chỉ là một phím tắt được cung cấp cho T.Maximum()?
admBorkBork

@TimmyD, không. Xem trường hợp thử nghiệm đầu tiên. 0 []nên cho T2.
Peter Taylor

@PeterTaylor Aaaahhhhhhhh. Cảm ơn, điều đó giúp rất nhiều.
admBorkBork

Giải thích tuyệt vời về ý nghĩa của sự tách biệt!
Luis Mendo

@LuisMendo Cảnh báo thuật ngữ kỳ lạ: Đây là các tiên đề phân tách và một không gian tôpô thỏa mãn đôi khi được gọi là tách biệt, nhưng tách biệt là một thứ hoàn toàn khác.
Dennis

Câu trả lời:


9

Haskell, 317 209 174 168 byte

Hàm f thực hiện công việc.

(#)=elem
x?y=[1|a<-x,b<-y,not$any(#a)b]
f n l|t(++)="TS"|t zip="T0"|t(?)="T1"|1>0="T2"where
    t p=any null[p(x%y)(y%x)|x<-[0..n-1],y<-[0..x-1]]
    x%y=[z|z<-l,x#z,not$y#z]

kiểm tra:

main=do
    putStrLn $ f 2 []
    putStrLn $ f 2 [[],[1]]
    putStrLn $ f 2 [[0],[1]]
    putStrLn $ f 3 [[0],[0,1,2],[1,2]]
    putStrLn $ f 3 [[],[0],[0,1],[2]]
    putStrLn $ f 3 [[0],[0,1],[2,1],[0,1,2]]
    putStrLn $ f 3 [[0],[0,1],[2,1],[2,0]]
    putStrLn $ f 6 [[0,2,4],[0,3,5],[1,2],[3,4,5]]
    putStrLn $ f 6 [[0,2,4],[0,3,5],[1,2],[2,5],[3,4,5]]
    putStrLn $ f 6 [[0,2,4],[0,3,5],[1,2],[2,5],[3,1],[3,4,5]]
    putStrLn $ f 6 [[0,1],[0,2,3],[1,4],[2,4],[2,3,5],[1,3],[4,5]]

đầu ra:

TS
T0
T2
TS
T0
T0
T1
TS
T0
T1
T2

Đưa ra tmột chức năng như đầu vào là một mẹo thông minh!
Zgarb

Trong trường hợp không có cạnh tranh, tiền thưởng này đi đến câu trả lời của bạn. Xin chúc mừng!
Zgarb

một số byte miễn phí - thay thế fbằng tên toán tử và thay thế p(x%y)(x%y)bằng p(x%y)$x%y. và nhân tiện, công việc tốt đẹp!
tự hào
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.