Separe meus números inteiros

21

Introdução

No campo da matemática conhecido como topologia , existem coisas chamadas axiomas de separação . Intuitivamente, você tem um conjunto Xe uma coleção de subconjuntos dos Xquais podemos considerar propriedades. O sistema é bem separado, se é possível distinguir entre todos os itens ou com Xbase em suas propriedades. Os axiomas de separação formalizam essa ideia. Nesse desafio, sua tarefa é verificar três axiomas de separação, dados Xe a lista de propriedades.

Entrada

Suas entradas são um número inteiro n ≥ 2e uma lista de listas Tde números inteiros. Os números inteiros Tsão retirados X = [0, 1, ..., n-1]. As listas em Tpodem estar vazias e sem classificação, mas não conterão duplicatas.

Saída

Sua saída é uma das quatro seqüências, determinadas por três axiomas de separação, cada um mais forte que o anterior. Existem outros axiomas, mas mantemos estes por simplicidade.

  • Suponha que, para todos os distintos xe yin X, exista uma lista Tcontendo exatamente um deles. Então Xe Tsatisfazer axioma T0 .
  • Suponha que, para todos os distintos xe yin X, exista duas listas em T, uma das quais contém xmas não ye a outra contém ymas não x. Então, Xe Tsatisfaça o axioma T1 .
  • Suponha que as duas listas acima também não contenham elementos comuns. Então, Xe Tsatisfaça o axioma T2 .

Sua saída é um dos T2, T1, T0ou TS, dependendo de qual das condições acima detém ( TSmeios nenhum deles fazem). Observe que T2 é mais forte que T1, que é mais forte que T0, e você sempre deve produzir o axioma mais forte possível.

Regras e pontuação

Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas.

Casos de teste

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
fonte
A entrada é nsupérflua? No restante do desafio, não o vejo sendo usado além da definição de quais elementos podem estar T; portanto, é apenas um atalho fornecido T.Maximum()?
AdmBorkBork
@TimmyD, não. Veja o primeiro caso de teste. 0 []deve dar T2.
Peter Taylor
@PeterTaylor Aaaahhhhhhhh. Obrigado, isso ajuda tremendamente.
AdmBorkBork
Ótima explicação do que separabilidade significa!
Luis Mendo
@LuisMendo Alerta de terminologia estranho: esses são axiomas de separação, e um espaço topológico que satisfaz T2 é às vezes chamado de separado, mas a separabilidade é algo totalmente diferente.
Dennis

Respostas:

9

Haskell, 317 209 174 168 bytes

A função f faz o trabalho.

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

testes:

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

saída:

TS
T0
T2
TS
T0
T0
T1
TS
T0
T1
T2
Damien
fonte
Dar tuma função como entrada é um truque inteligente!
Zgarb 07/01
Na ausência de competição, essa recompensa vai para a sua resposta. Parabéns!
Zgarb
alguns bytes livres - substitua fpor um nome de operador e substitua p(x%y)(x%y)por p(x%y)$x%y. e, a propósito, bom trabalho!
haskeller orgulhoso