Напишите программу, которая определит, представляет ли данная матрица квандл. Quandle представляет собой набор оснащен одной (некоммутативном, неассоциативная) операциями ◃ , которая удовлетворяет следующие аксиомы:
- Операция закрыта, это означает, что
a◃b = c
всегда является элементом множества ifa
иb
являются элементами множества. - Операция является правой-самораспределительной
(a◃b)◃c = (a◃c)◃(b◃c)
. - Операция делится справа: для любой выбранной пары
a
иb
существует один уникальный,c
такой, чтоc◃a = b
- Операция идемпотентна:
a◃a = a
Конечный квандл может быть представлен в виде квадратной матрицы. Ниже приведен пример квандла порядка 5 ( источник ).
0 0 1 1 1
1 1 0 0 0
3 4 2 4 3
4 2 4 3 2
2 3 3 2 4
Значение, расположенное в n-й строке и m-м столбце (0-индексированное), является значением n◃m. Например, в этом квандле 4◃1 = 3
. Некоторые свойства квандла легко увидеть из этой матрицы:
- Он закрыт, потому что в этой матрице 5x5 отображаются только значения 0-4.
- Он идемпотентен, потому что диагональ матрицы равна 0 1 2 3 4
- Это делится справа, потому что ни один столбец не содержит повторяющихся значений. (Строки могут и обычно будут.)
Свойство права-самораспределения сложнее проверить. Там может быть ярлык, но самый простой метод состоит в том, чтобы перебрать каждую возможную комбинацию из трех индексов, чтобы проверить это m[m[a][b]][c] = m[m[a][c]][m[b][c]]
.
вход
Входными данными будет список строк квадратной матрицы, использующий либо 0-индексирование, либо 1-индексирование (на ваш выбор). Каждая запись будет представлять собой однозначное число от 0
до 8
(или 1
через 9
). Я буду гибким в формате ввода. Некоторые приемлемые форматы включают в себя:
- Наиболее естественное форматирование вашего языка для матриц или списков, таких как
[[0 0 0][2 1 1][1 2 2]]
или(0,0,0,2,1,1,1,2,2)
. - Список значений, разделенных пробелами, символами новой строки, запятыми и т. Д.
- Одна строка, состоящая из всех значений, соединенных вместе, таких как
000211122
.
Вы также можете использовать транспонирование матрицы в качестве входных данных (замена строк на столбцы). Просто обязательно укажите это в своем ответе.
Выход
Единственное значение truey / falsey, указывающее статус матрицы как квандл.
Примеры квандл
0
0 0
1 1
0 0 0
2 1 1
1 2 2
0 0 1 1
1 1 0 0
3 3 2 2
2 2 3 3
0 3 4 1 2
2 1 0 4 3
3 4 2 0 1
4 2 1 3 0
1 0 3 2 4
Примеры не-квандл
не закрыто
1
0 0 0
2 1 1
1 9 2
не право-самораспределительный
0 0 1 0
1 1 0 1
2 3 2 2
3 2 3 3
(3◃1)◃2 = 2◃2 = 2
(3◃2)◃(1◃2) = 3◃0 = 3
делится не правильно
0 2 3 4 1
0 1 2 3 4
3 4 2 2 2
3 3 3 3 3
4 1 1 1 4
0 1 2 3
3 1 2 0
3 1 2 3
0 1 2 3
не идемпотент
1 1 1 1
3 3 3 3
2 2 2 2
0 0 0 0
2 1 0 4 3
3 4 2 0 1
4 2 1 3 0
1 0 3 2 4
0 3 4 1 2
Ответы:
Python 2 ,
104103102 байтаВвод транспонирован. Вывод осуществляется через код выхода, поэтому 0 (успех) является правдой, а 1 (сбой) ложным.
Попробуйте онлайн!
Как это устроено
e(t)
возвращает нумерованные строки входной матрицы t, представляющей оператор as, в виде пар (индекс, строка).for(a,A)in e(t)
Например, итерирует по ним, сохраняя индекс в a и саму строку в A , поэтомуA
становится ярлыком дляt[a]
.Между первым
for(b,B)in e(t)
иfor C in t
, мы перебираем все возможные упорядоченные кортежи (a, b, c) в декартовой степени t 3 .Для каждого из этих кортежей мы оцениваем выражение
Значение заключенного в скобки логического значения равно False, если и только если одно или несколько из следующих отдельных сравнений делают то же самое.
a==A[a]
потерпит неудачу (для некоторого значения a ), если ◃ не идемпотентен.A[a]in B
потерпит неудачу , если B не содержит все показатели А .Поскольку A имеет n индексов, а B имеет n элементов, отсутствие ошибок означает, что элементы B соответствуют индексам A , поэтому closed замкнут и делится справа.
B>C[B[a]]
это тавтология, так как Python 2 считал числа «меньшими», чем итерируемые.C[B[a]]==t[C[b]][C[a]]
потерпит неудачу для некоторого значения, если not не является самораспределительным справа.Если какое-либо из сравнений возвращает False , выражение
(0%...)
выдаст ZeroDivisionError . Кроме того, если not не закрытA[a]
илиC[b]
может также выдать ошибку IndexError . В обоих случаях программа завершает работу с кодом состояния 1 (ошибка).Если все тесты пройдены, программа нормально завершит работу с кодом состояния 0 (успех).
источник
Haskell, 100 байт
Этот ответ использует транспонированный ввод.
Похоже, я не могу использовать шаблонную охрану для привязки инфиксного оператора, поэтому я использую
where
в этом случае.(Первая версия была 108 байтов, но пропущена проверка идемпотентности, фиксированная версия была 120 байтов, более поздние версии имели 108, 103 и 98 байтов, но мне пришлось понять, благодаря @nimi, что они все были неправы: конечно, мне нужно сделать правильно тест делимости (который подразумевает замкнутость) перед выполнением каких-либо опасных
!!
операций, но я все еще мог использовать большинство моих более поздних идей игры в гольф, и еще с одним, это было 102 байта, теперь улучшенное путем изменения порядка операнда#
(который в любом случае лучше, чтобы компенсировать транспонирование), чтобы лучше использовать его связывание слева)Используйте как это:
источник
Python 2 , 138 байт
m
список списков целых чиселПопробуйте онлайн!
источник
JavaScript (ES6), 150 байт
Принимает входные данные как массив массивов столбцов целых чисел.
источник
Mathematica, 122 байта
Чистая функция принимает 2D массив целых чисел (1-индексированных) в качестве входных данных, причем строки и столбцы обращенной от конвенции в вопросе, и возвращение
True
илиFalse
. Первая строка определяет двоичную инфиксную операциюn_±m_
как операцию quandle.Для массива
l
xl
замкнутое и делимое справа эквивалентно тому, что каждая строка (в моем случае) является некоторой перестановкой{1, ..., l}
, а идемпотент эквивалентен главной диагонали, являющейся точно{1, ..., l}
. Так#&@@Union[Sort/@#]==Range@l==Array[#±#&,l=Length@#]
обнаруживает эти три условия. (ИспользованиеSort/@#
здесь, почему я решил поменять строки и столбцы.)Для правораспределительного мы буквально проверяем все возможности, используя
Array[±##2±#==(#2±#)±(#3±#)&,{l,l,l}])
. (Обратите внимание, что±##2±#
автоматически расширяется до(#2±#3)±#
, поскольку##2
представляет последовательность второго и третьего аргументов для функции с тремя переменными pure, над которой выполняется массив.) Затем&&And@@Flatten@
проверяется, был ли пройден каждый отдельный тест. Для некоторых незамкнутых квандлов могут возникать ошибки, когда он пытается получить доступ к части матрицы, которая не существует, но правильный ответ по-прежнему возвращается.источник
±m__:=#[[m]];
Я думаю. И естьDiagonal
встроенный. И±
лево-ассоциативный , так что вы можете использовать#2±#±(#3±#)
, но если бы я не сделал ошибку , то он короче переназначить#
на#3
и делать#±#2±#3==#±#3±±##2&
. И это также должно быть возможно заменить всюFlatten@
часть(...&~Array~{l,l,l}<>"")
l=Length
вRange@l
хотя, потому что это должно быть оценено в первую очередь, так что если вы используете функцию несколько раз, я думаю,Range
все еще получает предыдущееl
, нет?C ++ 14, 175 байт
Как и безымянная лямбда, при условии, что
n
она похожаstd::vector<std::vector<int>>
и возвращается через ссылочный параметр. 0 ложно, все остальное верно.Ungolfed и использование:
источник
int a,b,c,u,s=r=m.size()F
вместоint s=r=m.size(),a,b,c F
,u=0;r*=s==A.size()&&a==A[a]F
вместоr*=s==A.size()&&A[a]==a;int u=0 F
,r*=s>A[b]F
вместоr*=A[b]<s F
и~u+(1<<s)
вместоu-(1<<s)+1