Sprawdź topologię

25

Wyzwanie

Biorąc pod uwagę zestaw Tpodzbiorów zbioru skończonego S={1,2,3,...,n}, określ, czy Tjest to topologia, czy nie.

Wyjaśnienie

PowerSet P(S) pewnego zbioru Sjest zbiorem wszystkich podzbiorów S. Kilka przykładów:

S = {}, P(S) = {{}}
S = {1}, P(S) = {{}, {1}}
S = {1,2}, P(S) = {{}, {1}, {2}, {1,2}}
S = {1,2,3}, P(S) = {{}, {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}}

Topologia T na zestaw Sjest podzestawem P(S)z następujących właściwości:

  • {}jest w Ti Sjest wT
  • Jeśli Ai BT, to ich skrzyżowanieA ∩ B
  • Jeśli Ai Bsą, Tto jest ich związek A ∪ B*

* Ta definicja nie jest całkiem poprawna, ale jest prawdziwa dla zbiorów skończonych, co jest wystarczające do celów tego wyzwania. Rzeczywisty aksjomat pozwoliłby również na nieskończone związki, ale nie ma to znaczenia w przypadku skończonym.

Detale

  • Możesz założyć, że S = {1,2,...,n}(lub alternatywnie S = {0,1,...,n}) gdzie njest największą liczbą całkowitą występującą w zestawach T.
  • Format wejściowy jest elastyczny: możesz użyć ciągu znaków, listy list lub zestawu list lub dowolnego podobnego formatu obsługiwanego przez język. Możesz także użyć zestawów, takich jak S = {0,1,...,n}jeśli jest to wygodniejsze.
  • Dane wyjściowe muszą być zgodne z prawdą lub falsey.
  • Możesz wziąć n(lub alternatywnie n+1lub n-1) jako dodatkowy wkład.
  • Jeśli pracujesz z uporządkowanymi listami, możesz założyć, że liczby w zestawie są posortowane. Możesz również założyć, że lista ma określoną kolejność (np. Leksykograficzną).
  • Ponieważ reprezentujemy zestawy, możesz założyć, że żadne dwa wpisy ich reprezentacji listy nie są sobie równe.

Przykłady

Topologie

{{}}  over {}
{{},{1}} over {1}
P(S) over S (see in the explanation)
{{},{1},{1,2}} over {1,2}
{{},{1},{2,3},{1,2,3}} over {1,2,3}
{{1}, {1,2,3}, {1,4,5,6}, {1,2,3,4,5,6}, {}, {2,3}, {4,5,6}, {2,3,4,5,6}}
{{}, {1}, {2,3}, {2}, {4,5,6}, {5,6}, {5}, {2,5,6}, {2,5}, {1,5}, {1,2,3,4,5,6}, {1,2,3}, {1,2}, {1,4,5,6}, {1,5,6}, {1,2,5,6}, {2,3,4,5,6}, {2,3,5,6}, {2,3,5}, {1,2,3,5}, {2,4,5,6}, {1,2,5}, {1,2,3,5,6}, {1,2,4,5,6}}
{{}, {1}, {1,2}, {1,2,3}, {1,2,3,4}, {1,2,3,4,5}, {1,2,3,4,5,6}, {1,2,3,4,5,6,7}, {1,2,3,4,5,6,7,8}, {1,2,3,4,5,6,7,8,9}}
{{}, {1}, {1,2,3}, {1,2,3,4,5}, {1,2,3,4,5,6,7}, {1,2,3,4,5,6,7,8,9}}

nie topologie

{{1}} because {} is not contained
{{},{2}} because {1,2} is not contained
{{},{1,2},{2,3}} because the union {1,2,3} is not contained
{{},{1},{1,2},{2,3},{1,2,3}} because the intersection of {1,2} and {2,3} is not contained
{{},{1},{2},{3},{1,2},{2,3},{1,2,3}} because the union of {1} and {3} is not contained
{{}, {1}, {2,3}, {2}, {4,5,6}, {5,6}, {5}, {2,5,6}, {2,5}, {1,5}, {1,2,3,4,5,6}, {1,2,3}, {1,2}, {1,4,5,6}, {1,5,6}, {1,2,5,6}, {2,3,4,5,6}, {2,3,5,6}, {2,3,5}, {2,4,5,6}, {1,2,5}, {1,2,3,5,6}, {1,2,4,5,6}} because {1,2,3,5} is missing
{{}, {1}, {2}, {1,2,3}, {1,2,3,4,5}, {1,2,3,4,5,6,7}, {1,2,3,4,5,6,7,8,9}} because {1,2} is missing 
wada
źródło
2
Wygląda na to, że wiele odpowiedzi na to pytanie znalazłoby się na wejściu {{}, {2}}, ponieważ nie sprawdzają one wyraźnie, czy S jest w zestawie, podczas gdy dla tego wejścia przyjmuje się, że S wynosi {1, 2}. Czy to prawidłowy odczyt specyfikacji, czy coś mi brakuje?
Carmeister,
@ Carmeister Przepraszamy za zamieszanie, tak, twoja interpretacja jest poprawna!
flawr
Czy dane wejściowe mogą być macierzą binarną, w której każdy wiersz jest zbiorem, każda kolumna jest elementem, a wartość wskazuje, czy element jest w zestawie?
Luis Mendo,
Tak, myślę, że jest to do przyjęcia.
flawr
Ponieważ Tjest to zestaw, myślę, że rozsądnie jest założyć, że żaden podzbiór wejścia nie jest powtarzany (tj. {{}, {1,2}, {1,2}}Nie jest prawidłowym wejściem). Czy potrafisz wyjaśnić to w wyzwaniu, twierdząco lub negatywnie?
Luis Mendo,

Odpowiedzi:

7

Python 2 , 117 99 97 91 bajtów

n,x=input();sum(set.union(*x))!=n*-~n/2>q
[map(x.index,(i-i,i|j,i&j))for i in x for j in x]

Wypróbuj online!

Wyjście odbywa się za pomocą kodu wyjścia

ovs
źródło
5

Haskell , 95 89 74 78 bajtów

import Data.List
t#n=all(`elem`t)$sort<$>[1..n]:[]:([union,intersect]<*>t<*>t)

Wypróbuj online!

Wyjaśnienie:

                              ([union,intersect]<*>t<*>t) -- create all unions & intersections 
                    [1..n]:[]:                            -- add the empty list and the full list
             sort<$>                                --sort them all
                                -- (as 'union' does not necessarily produce sorted outputs)
all(`elem`t)$                   -- check whether they are all already contained
wada
źródło
Co [[],[2]]? Jest to topologia, ale nie ponad domniemany („Możesz założyć, że ...”) zestaw.
Christian Sievers
@ChristianSievers poprawione!
flawr
5

Mathematica, 87 73 66 63 bajtów

Outer[{#⋂#2,#⋃#2}&,#,#,1]~Flatten~2⋃{{},Range@#2}==#⋃#&

Pobiera [T, n]jako dane wejściowe.

Wyjaśnienie

{#⋂#2,#⋃#2}&

Funkcja zwracająca przecięcie i połączenie danych wejściowych

Outer[ ... ,#,#,1]

Zamapuj tę funkcję na liście wejść na poziomie 1.

... ~Flatten~2

Spłaszcz wynik ( Outerczęść zwraca wiązkę zagnieżdżonych List).

... ⋃{{},Range@#2}

Weź połączenie między spłaszczoną listą a {{}, S}. To usuwa duplikaty i dodaje {}i Sdo wynikowej listy.

... ==#⋃#

Sprawdź, czy lista z góry jest równa posortowanej wersji danych wejściowych.

JungHwan Min
źródło
4

MATL , 38 bajtów

!t~hXAs1>GXBXH2Z^!"@Z}Z|1MZ&hHm]vAGn~+

Dane wejściowe to macierz binarna, w której każdy wiersz jest zbiorem, każda kolumna jest elementem, a każdy wpis wskazuje członkostwo. Na przykład {{},{1},{1,2}}jest wyrażony jako [0 0;1 0;1 1]. Użyj połączonego programu Octave, aby przekonwertować na ten format.

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

!        % Implicit input. Transpose
t~       % Push a negated copy
h        % Horizontally concatenate both matrices
XA       % All: true for columns containing only 1
s        % Sum
1>       % Does it exceed 1? If so, both the empty set and the total
         % set are in the input
G        % Push input again
XB       % Convert each row from binary to decimal. This gives a column
         % vector of numbers that encode each set's contents. Union and
         % intersection will be done as bitwise XOR and AND
XH       % Copy to clipboard H
2Z^!     % Cartesian square transposed: gives all pairs of numbers as
         % columns of a matrix
"        % For each column
  @      %   Push current column
  Z}     %   Split into the two numbers
  Z|     %   Bitwise XOR
  1M     %   Push the two numbers again
  Z&     %   Bitwise AND
  h      %   Concatenate the two results horizontally
  Hm     %   Are they members of the vector of encoded sets? This gives
         %   a row vector with the two results
]        % End
v        % Concatenate all stack contents into a vertical vector
A        % Does it only contain ones? This is the main result: true iff
         % input is a non-empty topology. The empty input gives false,
         % and so it needs to be special cased
G        % Push input again
n~       % Is it empty?
+        % Add thw two results. Implicit display
Luis Mendo
źródło
1
D: Twój program zajmuje więcej miejsca niż tytuł!
flawr
3

Python 2 , 92 71 122 bajtów

  • Bardzo dziękuję @ovs za znaczną redukcję 19 bajtów: &i |stenogramy dla operacji ustawiania.
  • Dzięki @notjagan za 5 bajtów
  • Dzięki @ovs za 2 bajty: set()asi-i

Lambda, która pobiera listę zestawów jako dane wejściowe i zwraca True / false. Po prostu sprawdza, czy istnieje pusty zestaw, a połączenie i przecięcie każdego zestawu (dwa zestawy iterowane jako ii j) istnieje na danej liście zestawów.

lambda x:x.sort()or all(k in x[-1]for k in range(1,max(x[-1])))and all(a in x for i in x for j in x for a in[i-j,i|j,i&j])

Wypróbuj online!

Officialaimm
źródło
1
71 bajtów
dniu
@ovs Dziękuję bardzo, nie znałem skrótów!
officialaimm
@ovs Jestem rzeczywiście wyraźnie konwersji lista-elementów od input()celu set()w stopce.
officialaimm
1
66 bajtów.
notjagan
1
Możesz zastąpić set()przez i-ilubi^i
ovs
2

CJam (23 bajty)

{[,M2$2m*{_~&\~|$}/]^!}

Zestaw testów online . To anonimowy blok (funkcja). Zakładam S = {0,1,...,n}; blok przyjmuje tablicę posortowanych tablic i n+1jako parametry i pozostawia 0lub 1na stosie. W przypadku, {{}}gdy założono, że kod i środowisko testowe n+1 = 0.

Peter Taylor
źródło
2

Pyth, 24 23 bajty

q@aasm,@Fd{Ssd*QQYJUEyJ

Zestaw testowy

Ten program przyjmuje dane jako uporządkowaną listę uporządkowanych list. Listy wewnętrzne muszą być w porządku rosnącym, a lista kolejności musi być posortowana według długości, a następnie leksykograficznie. Potwierdziłem, że jest to dozwolony format wejściowy. Liczby zaczynają się od 0, a N + 1 jest również traktowane jako dane wejściowe.

Jeśli chodzi o to, jak to działa, odfiltrowujemy wszystko, co nie jest w P (S), a następnie dodajemy S, []przecięcie każdej pary i połączenie każdej pary, deduplikujemy i sprawdzamy, czy wynik jest równy wejściowi.

isaacg
źródło
0

Aksjomat, 358 bajtów

t(a,s)==(aa:=sort(removeDuplicates(a));ss:=sort(removeDuplicates(s));a:=sort(a);s:=sort(s);a~=aa or s~=ss=>false;a:=map(sort, a);~member?([],a) or ~member?(s,a)=>false;for x in a repeat(for j in x repeat if ~member?(j,s) then return false;for y in a repeat if ~member?(sort(setIntersection(x,y)),a) or ~member?(sort(setUnion(x,y)),a) then return false);true)

niepoddane golfowi i wyniki:

-- all the List have to be sorted because in list [1,2]~=[2,1]
-- So here "set" means: "List without duplicate, sorted with sort() function"
-- Return true if 
-- 1) a,s are set for above definition
-- 2) a is in P(s) 
-- 3) s,[] are in a
-- 4) for all x and y in a => xUy is in a and x intersect y is in a
t1(a:List List INT, s:List INT):Boolean==
    aa:=sort(removeDuplicates(a));ss:=sort(removeDuplicates(s))
    a :=sort(a);                  s :=sort(s)
    a~=aa          or s~=ss        =>false   -- they are not sets but list with element duplicate
    a:=map(sort, a)                          -- subset of a has to be sorted too
    ~member?([],a) or ~member?(s,a)=>false
    for x in a repeat
       for j in x repeat if ~member?(j,s) then return false 
       for y in a repeat if ~member?(sort(setIntersection(x,y)),a) or ~member?(sort(setUnion(x,y)),a) then return false
    true

(4) -> t([[]], [])
   (4)  true
                                                            Type: Boolean
(5) -> t([[],[1]], [1])
   (5)  true
                                                            Type: Boolean
(6) -> t([[],[1],[2,1]], [1,2])
   (6)  true
                                                            Type: Boolean
(7) -> t([[],[1],[2,3],[1,2,3]], [3,1,2])
   (7)  true
                                                            Type: Boolean
(8) -> t([[1], [1,2,3], [1,4,5,6], [1,2,3,4,5,6], [], [2,3], [4,5,6], [2,3,4,5,6]], [1,2,3,4,5,6])
   (8)  true
                                                            Type: Boolean
(9) -> t([[], [1], [2,3], [2], [4,5,6], [5,6], [5], [2,5,6], [2,5], [1,5], [1,2,3,4,5,6], [1,2,3], [1,2], [1,4,5,6], [1,5,6], [1,2,5,6], [2,3,4,5,6], [2,3,5,6], [2,3,5], [1,2,3,5], [2,4,5,6], [1,2,5], [1,2,3,5,6], [1,2,4,5,6]], [1,2,3,4,5,6])
   (9)  true
                                                            Type: Boolean
(10) -> t([[], [1], [1,2], [1,2,3], [1,2,3,4], [1,2,3,4,5], [1,2,3,4,5,6], [1,2,3,4,5,6,7], [1,2,3,4,5,6,7,8], [1,2,3,4,5,6,7,8,9]], [1,2,3,4,5,6,7,8,9])
   (10)  true
                                                            Type: Boolean
(11) -> t([[], [1], [1,2,3], [1,2,3,4,5], [1,2,3,4,5,6,7], [1,2,3,4,5,6,7,8,9]], [1,2,3,4,5,6,7,8,9])
   (11)  true
                                                            Type: Boolean
(2) -> t([[1]], [1])
   (2)  false
                                                            Type: Boolean
(4) -> t([[],[2]], [1,2])
   (4)  false
                                                            Type: Boolean
(5) -> t([[],[1,2],[2,3]], [1,2,3])
   (5)  false
                                                            Type: Boolean
(6) -> t([[],[1],[1,2],[2,3],[1,2,3]], [1,2,3])
   (6)  false
                                                            Type: Boolean
(7) -> t([[],[1],[2],[3],[1,2],[2,3],[1,2,3]] , [1,2,3])
   (7)  false
                                                            Type: Boolean
(8) -> t([[], [1], [2,3], [2], [4,5,6], [5,6], [5], [2,5,6], [2,5], [1,5],[1,2,3,4,5,6], [1,2,3], [1,2], [1,4,5,6], [1,5,6], [1,2,5,6], [2,3,4,5,6], [2,3,5,6], [2,3,5], [2,4,5,6], [1,2,5], [1,2,3,5,6], [1,2,4,5,6]], [1,2,3,4,5,6])
   (8)  false
                                                            Type: Boolean
(9) -> t([[], [1], [2], [1,2,3], [1,2,3,4,5], [1,2,3,4,5,6,7], [1,2,3,4,5,6,7,8,9]] , [1,2,3,4,5,6,7,8,9])
   (9)  false
                                                            Type: Boolean
(10) -> t([[], [1], [2,3], [2], [4,5,6], [5,6], [5], [2,5,6], [2,5], [1,5],[1,2,3,4,5,6], [1,2,3], [1,2], [1,4,5,6], [1,5,6], [1,2,5,6], [2,3,4,5,6], [2,3,5,6], [2,3,5], [2,4,5,6], [1,2,5], [1,2,3,5,6], [1,2,4,5,6]], [1,2,3,4,5,6])
   (10)  false
                                                            Type: Boolean
RosLuP
źródło