Verifica topologia


25

Sfida

Dato un insieme Tdi sottoinsiemi di un insieme finito S={1,2,3,...,n}, determinare se si Ttratta di una topologia o meno.

Spiegazione

Il powerset P(S) di alcuni set Sè l'insieme di tutti i sottoinsiemi di S. Qualche esempio:

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

Una topologia T sul set Sè un sottoinsieme di P(S)con le seguenti proprietà:

  • {}è dentro Ted Sè dentroT
  • Se Ae Bsono dentro, Tlo è anche il loro incrocioA ∩ B
  • Se Ae Bsono dentro, Tlo è anche la loro unione A ∪ B*

* Questa definizione non è del tutto corretta, ma è vera per i set finiti, che è sufficiente ai fini di questa sfida. L'attuale assioma consentirebbe anche infinite unioni, ma questo è irrilevante nel caso finito.

Dettagli

  • Puoi supporre che S = {1,2,...,n}(o in alternativa S = {0,1,...,n}) dov'è nil numero intero più grande che appare negli insiemi di T.
  • Il formato di input è flessibile: puoi utilizzare una stringa, un elenco di elenchi o un insieme di elenchi o qualsiasi formato simile che il tuo linguaggio possa gestire. Puoi anche usare set come S = {0,1,...,n}se fosse più conveniente.
  • L'output deve essere truthey o falsey.
  • È consentito prendere n(o in alternativa n+1o n-1) come input aggiuntivo.
  • Se lavori con elenchi ordinati, puoi presumere che i numeri all'interno di un set siano ordinati. Puoi anche supporre che l'elenco abbia un certo ordine (ad es. Lessicografico.
  • Dato che rappresentiamo i set, puoi presumere che non ci siano due voci della loro rappresentazione in elenco uguali.

Esempi

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

non 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 

2
Sembra che molte delle risposte a questa domanda sarebbero sull'input {{}, {2}} perché non controllano esplicitamente che S sia nell'insieme mentre per quell'input, S è implicitamente assunto come {1, 2}. È una lettura valida delle specifiche o mi sto perdendo qualcosa?
Carmeister,

@Carmeister Ci scusiamo per la confusione, sì la tua interpretazione è corretta!
Flawr,

L'input può essere una matrice binaria in cui ogni riga è un set, ogni colonna è un elemento e il valore indica se l'elemento è nel set?
Luis Mendo,

Sì, penso sia accettabile.
Flawr,

Dato che Tè un insieme, penso che sia ragionevole presumere che nessun sottoinsieme nell'input sia ripetuto (cioè {{}, {1,2}, {1,2}}non è un input valido). Puoi chiarire questo nella sfida, sia affermativamente che negativamente?
Luis Mendo,

Risposte:


7

Python 2 , 117 99 97 91 byte

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]

Provalo online!

L'uscita è tramite il codice di uscita


5

Haskell , 95 89 74 78 byte

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

Provalo online!

Spiegazione:

                              ([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

Che dire [[],[2]]? È una topologia, ma non oltre l'insieme implicito ("Puoi presumere che ...").
Christian Sievers,

@ChristianSievers corretto!
Flawr,

5

Mathematica, 87 73 66 63 byte

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

Accetta [T, n]come input.

Spiegazione

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

Funzione che restituisce l'intersezione e l'unione degli input

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

Mappa quella funzione sull'elenco di input al livello 1.

... ~Flatten~2

Appiattire il risultato (la Outerparte restituisce un gruppo di Lists nidificati ).

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

Prendi l'unione tra l'elenco appiattito e {{}, S}. Ciò rimuove i duplicati e aggiunge {}e Sall'elenco risultante.

... ==#⋃#

Controlla se l'elenco dall'alto è uguale alla versione ordinata dell'input.


4

MATL , 38 byte

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

L'input è una matrice binaria in cui ogni riga è un set, ogni colonna è un elemento e ogni voce indica l'appartenenza. Ad esempio, {{},{1},{1,2}}è espresso come [0 0;1 0;1 1]. Utilizzare il programma Octave collegato per convertire in questo formato.

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

!        % 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

1
D: il tuo programma occupa più spazio del tuo titolo!
Flawr,

3

Python 2 , 92 71 122 byte

  • Grazie mille a @ovs per una forte riduzione di 19 byte: &e |shorthands per le operazioni impostate.
  • Grazie @notjagan per 5 byte
  • Grazie a @ovs per 2 byte: set()comei-i

Lambda che accetta un elenco di set come input e restituisce True / false. Controlla semplicemente se esiste un set vuoto e l'unione e l'intersezione di ciascun set (due set ripetuti come ie j) esiste nell'elenco di set specificato.

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

Provalo online!



@ovs Grazie mille, non conoscevo le scorciatoie!
officialaimm,

@ovs In realtà sto convertendo esplicitamente le voci di elenco da input()a set()a piè di pagina.
officialaimm,


1
È possibile sostituire set()con i-ioi^i
ovs il

2

CJam (23 byte)

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

Suite di test online . Questo è un blocco anonimo (funzione). Presumo S = {0,1,...,n}; il blocco accetta una matrice di matrici ordinate e n+1come parametri e foglie 0o 1in pila. Nel caso {{}}il codice e il framework di test lo presuppongono n+1 = 0.


2

Pyth, 24 23 byte

q@aasm,@Fd{Ssd*QQYJUEyJ

Suite di test

Questo programma accetta input come un elenco ordinato di elenchi ordinati. Gli elenchi interni devono essere in ordine crescente e l'elenco degli ordini deve essere ordinato per lunghezza e lessicograficamente. Ho confermato che si tratta di un formato di input consentito. I numeri iniziano da 0 e anche N + 1 viene preso come input.

Per quanto riguarda il modo in cui funziona, filtriamo qualsiasi cosa non in P (S), quindi aggiungiamo S, []l'intersezione di ogni coppia e l'unione di ogni coppia, dedupliciamo e controlliamo che il risultato sia uguale all'input.


0

Assioma, 358 byte

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)

ungolfed e risultati:

-- 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.