Фон
Рассмотрим круговой турнир, в котором каждый участник играет одну игру против каждого другого участника. Нет ничьих, поэтому в каждой игре есть победитель и проигравший. Спортсмен является королем турнира, если для любой другой конкурирующей B , либо бить B , или избил другой участник C , который , в своей очереди бить B . Можно показать, что в каждом турнире есть как минимум один король (хотя их может быть несколько). В этом задании ваша задача - найти королей данного турнира.
Вход и выход
Ваш ввод представляет собой N × N
логическую матрицу T
и, необязательно, количество N ≥ 2
участников. Каждая запись T[i][j]
представляет результат игры между участниками i
и j
со значением 1 представляет выигрыш за, i
а 0 - выигрыш за j
. Обратите внимание, что T[i][j] == 1-T[j][i]
если i != j
. Диагональ T
состоит из 0 с.
Ваш вывод должен представлять собой список королей в турнире, который T
использует индексацию на основе 0 или 1. Порядок королей не имеет значения, но не должно быть дубликатов.
Как ввод, так и вывод могут быть приняты в любом разумном формате.
Правила и оценки
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Контрольные примеры
В этих тестах используется индексирование на основе 0. Для индексации на основе 1 увеличивайте каждое выходное значение.
2 [[0,0],[1,0]] -> [1]
3 [[0,1,0],[0,0,0],[1,1,0]] -> [2]
3 [[0,1,0],[0,0,1],[1,0,0]] -> [0,1,2]
4 [[0,1,1,1],[0,0,1,0],[0,0,0,0],[0,1,1,0]] -> [0]
4 [[0,1,1,0],[0,0,1,0],[0,0,0,1],[1,1,0,0]] -> [0,2,3]
5 [[0,1,0,0,1],[0,0,0,0,1],[1,1,0,0,0],[1,1,1,0,1],[0,0,1,0,0]] -> [3]
5 [[0,1,0,1,0],[0,0,1,1,1],[1,0,0,0,0],[0,0,1,0,1],[1,0,1,0,0]] -> [0,1,4]
5 [[0,0,0,0,0],[1,0,1,1,0],[1,0,0,0,1],[1,0,1,0,1],[1,1,0,0,0]] -> [1,3,4]
6 [[0,0,0,0,0,0],[1,0,1,1,0,0],[1,0,0,1,1,0],[1,0,0,0,1,1],[1,1,0,0,0,1],[1,1,1,0,0,0]] -> [1,2,3,4,5]
6 [[0,0,1,1,1,0],[1,0,0,1,1,1],[0,1,0,0,1,0],[0,0,1,0,0,1],[0,0,0,1,0,1],[1,0,1,0,0,0]] -> [0,1,2,3,5]
6 [[0,1,1,0,0,1],[0,0,0,1,0,1],[0,1,0,1,1,0],[1,0,0,0,1,1],[1,1,0,0,0,0],[0,0,1,0,1,0]] -> [0,1,2,3,4,5]
8 [[0,0,1,1,0,1,1,1],[1,0,1,0,1,1,0,0],[0,0,0,1,1,0,0,0],[0,1,0,0,0,1,0,0],[1,0,0,1,0,1,0,0],[0,0,1,0,0,0,1,0],[0,1,1,1,1,0,0,1],[0,1,1,1,1,1,0,0]] -> [0,1,4,6,7]
20 [[0,0,1,1,0,1,1,0,0,0,0,1,1,0,1,1,1,1,0,1],[1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1],[0,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,1,1],[0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1],[1,0,1,0,0,0,0,1,1,0,1,1,1,0,1,1,1,1,0,1],[0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,1,0,1],[0,0,1,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,0],[1,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,1,0],[1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,1],[1,0,1,0,1,0,1,1,0,0,1,0,0,0,0,1,0,1,1,1],[1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0],[0,1,1,0,0,1,1,0,0,1,0,0,1,1,1,1,1,0,1,1],[0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,1,1,1],[1,0,1,1,1,0,0,0,0,1,0,0,1,0,1,1,1,1,1,1],[0,0,1,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,1],[0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1],[0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,1,1],[0,0,1,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1],[1,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0]] -> [0,1,3,4,5,7,8,11,15,17,18]
Ответы:
Matlab,
36 3529 байтДавайте выясним,
i
является ли король. Тогда для каждогоj
значенияT[i][j]==1 OR there is a k such that T[i][k] * T[k][l] == 1
. Но второе условие также может быть замененоsum_over_k(T[i][k] * T[k][l])>0
, но это всего лишь элемент матрицыT*T
(если вы рассматриваетеT
как матрицу).OR
Затем может быть переигран, добавивT
к этому результату, поэтому мы просто должны проверить , еслиn-1
значения строкиi
изT*T+T
больше нуля, чтобы увидеть лиi
король. Это именно то, что делает моя функция.(Это MATLAB, поэтому индексы основаны на 1).
Матрицы MATLAB должны быть закодированы точкой с запятой в качестве разделителей строк:
источник
size(T,1)
Желе,
131211 байтВыход основан на 1. Попробуйте онлайн!
Альтернативно, используя побитовые операторы вместо манипулирования массивом:
Опять же, вывод на основе 1. Попробуйте онлайн!
Фон
Для конкурирующей А , мы можем найти все B такой , что бить C биений B , принимая все строки , которые соответствуют C такой , что C бить . Если г на B - й вход в C - й является 1 , мы получаем , что C бить B .
Если мы вычислим логические ИЛИ для всех соответствующих записей выбранных столбцов, мы получим один вектор, указывающий, превосходит ли А транзитивность В или нет. Наконец, ИЛИ получившийся вектор с соответствующей строкой входной матрицы дает булевы значения: A, бить ли B , транзитивностью или напрямую.
Повторяя это для каждой строки, мы подсчитать количество 1 -х в каждом векторе, поэтому вычисления количества участников каждый биений. Максимальное количество соответствует королям турнира.
Как это устроено
источник
Python, использующий numpy, 54 байта
Принимает числовую матрицу, выводит числовую матрицу строк с индексами на основе 0.
Другой способ думать о короле - это соперник, ради которого все участники находятся в союзе короля, люди, которых избил король, и люди, которых избили эти люди. Другими словами, для каждого участника есть путь длиной не более 2 от короля к ним среди отношения «бит».
Матрица
I + M + M*M
кодирует количество путей из 0, 1 или 2 шагов от каждого источника к каждой цели. Игрок является королем, если в его строке этой матрицы есть только положительные записи. Так как 0 - Falsey,all
говорит нам, является ли строка ненулевой. Мы применяем это к каждой строке и выводим индексы ненулевых результатов.источник
JavaScript (ES6), 83 байта
источник
MATL ,
12109 байтВходные данные: сначала число участников, а в отдельной строке - матрица со строками, разделенными точками с запятой. Выход основан на 1.
Например, пятый контрольный пример имеет вход
и последний контрольный пример имеет вход
Попробуйте онлайн!
объяснение
источник
Javascript
136131121112 байтовЗвоните используя:
осторожность, потому что выходные данные индексируются 1 (сохранено несколько байтов, не пытающихся отфильтровывать 0s против false)
источник