Відокремте цілі числа


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задовольнимо аксіому Т1 .
  • Припустимо, що два вищевказані списки також не містять загальних елементів. Тоді Xі Tзадовольнимо аксіому Т2 .

Ваш вихід один з T2, T1, T0або TS, в залежності від того, яка із зазначених вище умов не виконано ( TSзасіб , ніхто з них робити). Зауважте, що Т2 сильніший за Т1, який сильніший за Т0, і завжди слід виводити найсильнішу можливу аксіому.

Правила та оцінка

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

Тестові кейси

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

Чи є вхід nзайвим? В решті завдань, я не бачу, щоб він використовувався за межами визначення того, які елементи можуть бути T, тому це просто наданий ярлик T.Maximum()?
AdmBorkBork

@TimmyD, ні. Дивіться перший тестовий випадок. 0 []повинні дати T2.
Пітер Тейлор

@PeterTaylor Aaaahhhhhhhh. Дякую, що надзвичайно допомагає.
AdmBorkBork

Чудове пояснення того, що означає відокремлюваність!
Луїс Мендо

@LuisMendo Дивне термінологічне попередження: Це аксіоми розділення, а топологічні простори, які задовольняють T2, іноді називають відокремленими, але роздільність - це зовсім інше.
Денніс

Відповіді:


9

Хаскелл, 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

Надання tфункції в якості вводу - розумна хитрість!
Згарб

За відсутності конкуренції ця винагорода іде на вашу відповідь. Вітаємо!
Згарб

кілька безкоштовних байтів - замініть fна ім’я оператора та замініть p(x%y)(x%y)на p(x%y)$x%y. і до речі, приємної роботи!
гордий haskeller
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.