Раздели мои целые числа

21

Вступление

В области математики, известной как топология , есть вещи, называемые аксиомами разделения . Интуитивно понятно, что у вас есть набор Xи набор подмножеств X, которые мы можем рассматривать как свойства. Система хорошо разделена, если можно различить все предметы Xпо их свойствам. Аксиомы разделения формализуют эту идею. В этом задании ваша задача - проверить три заданные аксиомы разделения Xи список свойств.

вход

Ваши входные данные представляют собой целое число n ≥ 2и список списков Tцелых чисел. Целые числа в Tвзяты из X = [0, 1, ..., n-1]. Списки Tмогут быть пустыми и не отсортированными, но они не будут содержать дубликатов.

Выход

Ваш вывод - одна из четырех строк, определяемых тремя аксиомами разделения, каждая из которых сильнее предыдущей. Есть и другие аксиомы, но мы придерживаемся их для простоты.

  • Предположим , что для всех различны xи yв X, существует список в Tсодержащий ровно один из них. Тогда Xи Tудовлетворяем аксиоме T0 .
  • Предположим, что для всех различных xи yвнутри Xсуществует два списка T, один из которых содержит, xно не содержит y, а другой содержит, yно не содержит x. Тогда Xи Tудовлетворяем аксиоме T1 .
  • Предположим, что два списка выше также не содержат общих элементов. Тогда Xи Tудовлетворяем аксиоме Т2 .

Ваш выход один из T2, T1, T0или TS, в зависимости от того, какая из указанных выше условий не выполнено ( TSсредство , никто из них делать). Обратите внимание, что T2 сильнее, чем T1, который сильнее, чем T0, и вы всегда должны выводить максимально возможную аксиому.

Правила и оценки

Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.

Контрольные примеры

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
источник
Вход nлишний? В остальной части задачи я не вижу, чтобы он использовался помимо определения того, какие элементы могут быть в нем T, так что это просто предоставленный ярлык T.Maximum()?
AdmBorkBork
@TimmyD, нет. Смотрите первый контрольный пример. 0 []должен дать T2.
Питер Тейлор
@PeterTaylor Aaaahhhhhhhh. Спасибо, это очень помогает.
AdmBorkBork
Отличное объяснение того, что означает отделимость!
Луис Мендо
@LuisMendo Странное предупреждение терминологии: это аксиомы разделения, и топологическое пространство, которое удовлетворяет T2, иногда называется разделенным, но отделимость - это нечто совершенно другое.
Деннис

Ответы:

9

Haskell, 317 209 174 168 байт

Функция f выполняет свою работу.

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

тесты:

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

выход:

TS
T0
T2
TS
T0
T0
T1
TS
T0
T1
T2
Damien
источник
Предоставление tфункции в качестве ввода - умный трюк!
Згарб
В отсутствие конкуренции эта награда идет на ваш ответ. Поздравляем!
Згарб
некоторые свободные байты - заменить fна имя оператора и заменить p(x%y)(x%y)на p(x%y)$x%y. и, кстати, хорошая работа!
гордый haskeller