Trenne meine ganzen Zahlen

21

Einführung

Auf dem Gebiet der Mathematik, bekannt als Topologie , gibt es Dinge, die Trennungsaxiome genannt werden . Intuitiv haben Sie eine Menge Xund eine Sammlung von Teilmengen X, die wir uns als Eigenschaften vorstellen können. Das System ist gut getrennt, wenn man alle Gegenstände Xanhand ihrer Eigenschaften unterscheiden kann. Die Trennungsaxiome formalisieren diese Idee. In dieser Herausforderung besteht Ihre Aufgabe darin, drei gegebene Trennungsaxiome Xund die Liste der Eigenschaften zu überprüfen .

Eingang

Ihre Eingaben sind eine Ganzzahl n ≥ 2und eine Liste Tmit ganzen Zahlen. Die Ganzzahlen in Twerden von gezogen X = [0, 1, ..., n-1]. Die Listen in sind Tmöglicherweise leer und unsortiert, enthalten jedoch keine Duplikate.

Ausgabe

Ihre Ausgabe ist eine von vier Zeichenfolgen, die durch drei Trennungsaxiome bestimmt werden, von denen jedes stärker ist als das letzte. Es gibt andere Axiome, aber der Einfachheit halber bleiben wir bei diesen.

  • Nehmen wir an, dass es für alle unterschiedlichen xund yin Xeine Liste gibt, in Tder genau einer von ihnen enthalten ist. Dann Xund Tbefriedige Axiom T0 .
  • Angenommen, für alle unterschiedlichen xund yin Xexistieren zwei Listen in T, von denen eine enthält, xaber nicht y, und die andere enthält, yaber nicht x. Dann Xund Tbefriedige Axiom T1 .
  • Angenommen, die beiden obigen Listen enthalten auch keine gemeinsamen Elemente. Dann Xund Tbefriedige Axiom T2 .

Die Ausgabe ist eine von T2, T1, T0oder TS, je nachdem , welche der oben genannten Bedingungen hält ( TSMittel keiner von ihnen tun). Beachten Sie, dass T2 stärker ist als T1, was stärker ist als T0, und Sie sollten immer das stärkste mögliche Axiom ausgeben.

Regeln und Wertung

Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.

Testfälle

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
quelle
Ist die Eingabe nüberflüssig? Im Rest der Herausforderung sehe ich keine Verwendung, die über die Definition der Elemente hinausgeht. Ist Tdies also nur eine Abkürzung für T.Maximum()?
AdmBorkBork
@TimmyD, nein. Siehe den ersten Testfall. 0 []sollte geben T2.
Peter Taylor
@PeterTaylor Aaaahhhhhhhh. Danke, das hilft enorm.
AdmBorkBork
Gute Erklärung, was Trennbarkeit bedeutet!
Luis Mendo
@ LuisMendo Weird-Terminologiewarnung: Dies sind Trennungsaxiome, und topologische Räume, die T2 erfüllen, werden manchmal als getrennt bezeichnet, aber die Trennbarkeit ist etwas ganz anderes.
Dennis

Antworten:

9

Haskell, 317 209 174 168 Bytes

Die Funktion f erledigt den Job.

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

Tests:

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

Ausgabe:

TS
T0
T2
TS
T0
T0
T1
TS
T0
T1
T2
Damien
quelle
Geben Sie teine Funktion als Eingabe ist ein kluger Trick!
Zgarb
In Ermangelung von Konkurrenz geht diese Prämie zu Ihrer Antwort. Herzliche Glückwünsche!
Zgarb
Einige freie Bytes - Ersetzen fdurch einen Operatornamen und Ersetzen p(x%y)(x%y)durch p(x%y)$x%y. und übrigens schöne arbeit!
stolzer Haskeller