Pisahkan bilangan bulat saya

21

pengantar

Di bidang matematika yang dikenal sebagai topologi , ada hal-hal yang disebut aksioma pemisahan . Secara intuitif, Anda memiliki satu set Xdan koleksi himpunan bagian dari X, yang dapat kita anggap sebagai properti. Sistem dipisahkan dengan baik, jika seseorang dapat membedakan antara semua item Xberdasarkan pada propertinya. Aksioma pemisahan memformalkan ide ini. Dalam tantangan ini, tugas Anda adalah memeriksa tiga aksioma pemisahan, yang diberikan Xdan daftar properti.

Memasukkan

Input Anda adalah bilangan bulat n ≥ 2, dan daftar daftar Tbilangan bulat. Bilangan bulat dalam Tdiambil dari X = [0, 1, ..., n-1]. Daftar di Tmungkin kosong dan tidak disortir, tetapi tidak akan berisi duplikat.

Keluaran

Output Anda adalah satu dari empat string, ditentukan oleh tiga aksioma pemisahan, masing-masing lebih kuat dari yang terakhir. Ada aksioma lain, tetapi kami tetap menggunakannya untuk kesederhanaan.

  • Misalkan untuk semua yang berbeda xdan ydalam X, ada daftar Tberisi persis salah satunya. Kemudian Xdan Tmemuaskan aksioma T0 .
  • Misalkan untuk semua yang berbeda xdan ydalam X, ada dua daftar T, yang satu berisi xtetapi tidak y, dan yang lain berisi ytetapi tidak x. Kemudian Xdan Tmemuaskan aksioma T1 .
  • Misalkan kedua daftar di atas juga tidak mengandung elemen umum. Kemudian Xdan Tmemuaskan aksioma T2 .

Output Anda adalah salah satu dari T2, T1, T0atau TS, tergantung pada kondisi di atas memegang ( TSberarti tidak satupun dari mereka lakukan). Perhatikan bahwa T2 lebih kuat dari T1, yang lebih kuat dari T0, dan Anda harus selalu mengeluarkan aksioma sekuat mungkin.

Aturan dan penilaian

Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.

Uji kasus

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
Zgarb
sumber
Apakah inputnya nberlebihan? Di sisa tantangan, saya tidak melihatnya digunakan di luar mendefinisikan elemen apa yang bisa masuk T, jadi apakah itu hanya jalan pintas yang disediakan untuk T.Maximum()?
AdmBorkBork
@ TimmyD, tidak. Lihat test case pertama. 0 []harus memberi T2.
Peter Taylor
@PeterTaylor Aaaahhhhhhhh. Terima kasih, itu sangat membantu.
AdmBorkBork
Penjelasan hebat tentang apa arti pemisahan!
Luis Mendo
@LuisMendo Waspada terminologi Aneh: Ini adalah aksioma pemisahan, dan ruang topologi yang memenuhi T2 kadang-kadang disebut dipisahkan, tetapi keterpisahan adalah sesuatu yang sama sekali berbeda.
Dennis

Jawaban:

9

Haskell, 317 209 174 168 bytes

Fungsi f melakukan pekerjaan.

(#)=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]

tes:

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]]

keluaran:

TS
T0
T2
TS
T0
T0
T1
TS
T0
T1
T2
Damien
sumber
Memberi tfungsi sebagai input adalah trik cerdas!
Zgarb
Tanpa adanya persaingan, karunia ini sesuai dengan jawaban Anda. Selamat!
Zgarb
beberapa byte gratis - ganti fdengan nama operator, dan ganti p(x%y)(x%y)dengan p(x%y)$x%y. dan omong-omong, kerja bagus!
haskeller bangga