Oddziel moje liczby całkowite

21

Wprowadzenie

W dziedzinie matematyki zwanej topologią istnieją rzeczy zwane aksjomatami separacji . Intuicyjnie masz zestaw Xi zbiór podzbiorów X, które możemy traktować jako właściwości. System jest dobrze oddzielony, jeśli można rozróżnić wszystkie elementy na Xpodstawie ich właściwości. Aksjomaty separacyjne formalizują tę ideę. W tym wyzwaniu Twoim zadaniem jest sprawdzenie trzech aksjomatów separacji, podanych Xoraz listy właściwości.

Wkład

Twoje dane wejściowe są liczbą całkowitą n ≥ 2i listą Tliczb całkowitych. Liczby w Tsą pobierane z X = [0, 1, ..., n-1]. Listy w Tmogą być puste i nieposortowane, ale nie będą zawierać duplikatów.

Wydajność

Twój wynik jest jednym z czterech ciągów, określonych przez trzy aksjomaty separacji, każdy silniejszy niż ostatni. Istnieją inne aksjomaty, ale trzymamy się ich dla uproszczenia.

  • Załóżmy, że dla wszystkich wyraźny xi yw Xistnieje w listę Tzawierającą dokładnie jeden z nich. Wtedy Xi Tusatysfakcjonować aksjomat T0 .
  • Załóżmy, że dla wszystkich wyraźny xi yw X, istnieją dwie listy w T, z których jeden zawiera x, ale nie y, a drugi zawiera yale nie x. Wtedy Xi Tusatysfakcjonować aksjomat T1 .
  • Załóżmy, że dwie powyższe listy również nie zawierają wspólnych elementów. Wtedy Xi Tusatysfakcjonować aksjomat T2 .

Twój wynik jest jednym z T2, T1, T0lub TS, w zależności od tego, które z powyższych warunków trzyma ( TSdochodowe żaden z nich nie robią). Zauważ, że T2 jest silniejszy niż T1, który jest silniejszy niż T0, i zawsze powinieneś wyprowadzać najsilniejszy możliwy aksjomat.

Zasady i punktacja

Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.

Przypadki testowe

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
źródło
Czy dane wejściowe są nzbyteczne? W pozostałej części wyzwania nie widzę, aby był używany poza określeniem, w jakich elementach może być T, więc czy jest to tylko skróty T.Maximum()?
AdmBorkBork
@ TimmyD, nie. Zobacz pierwszy przypadek testowy. 0 []powinien dać T2.
Peter Taylor
@PeterTaylor Aaaahhhhhhhh. Dzięki, to ogromnie pomaga.
AdmBorkBork
Świetne wyjaśnienie, co oznacza separowalność!
Luis Mendo,
Alert terminologia @LuisMendo zakręcony: Są aksjomaty oddzielania i topologiczne przestrzenie, które spełnia T2 czasami nazywane oddzielone, ale rozdzielność coś innego.
Dennis

Odpowiedzi:

9

Haskell, 317 209 174 168 bajtów

Funkcja f wykonuje zadanie.

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

testy:

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

wydajność:

TS
T0
T2
TS
T0
T0
T1
TS
T0
T1
T2
Damien
źródło
Spełnianie tfunkcji jako danych wejściowych to sprytna sztuczka!
Zgarb
W przypadku braku konkurencji ta nagroda trafia do twojej odpowiedzi. Gratulacje!
Zgarb
niektóre wolne bajty - zamień fna nazwę operatora i zamień p(x%y)(x%y)na p(x%y)$x%y. a tak przy okazji, niezła robota!
dumny haskeller