Вы сражаетесь с обширной сетью вражеских шпионов . Вы знаете, что у каждого шпиона есть хотя бы одна (иногда множественная) фальшивая личность, которую они любят использовать. Вам бы очень хотелось узнать, сколько шпионов вы имеете дело с.
К счастью, ваши агенты контрразведки выполняют свою работу и иногда могут выяснить, когда две поддельные личности фактически контролируются одним и тем же вражеским шпионом.
То есть:
- Ваши агенты не всегда знают, когда за двумя поддельными личностями стоит один и тот же шпион
- Если агент говорит вам, что две поддельные личности контролируются одним и тем же шпионом, вы уверены, что они правы.
Сообщения агента
Агенты отправляют вам загадочные сообщения, сообщающие, у каких личностей за спиной стоит один и тот же шпион. Пример:
У вас есть 2 агента и 5 поддельных личностей, чтобы иметь дело с.
Первый агент отправляет вам сообщение:
Red Red Blue Orange Orange
Это означает, что они думают, что есть 3 шпиона:
- первый (красный) контролирует тождества 1 и 2
- второй (синий) контролирует личность 3
- третий (оранжевый) контролирует личности 4 и 5
Второй агент отправляет вам сообщение:
cat dog dog bird fly
Это означает, что они думают, что есть 4 шпиона:
- первый (кот) контролирует личность 1
- второй (собака) контролирует личности 2 и 3
- третий (птица) контролирует личность 4
- четвертый (муха) контролирует личность 5
Компилируя информацию мы видим:
Identities: id1 id2 id3 id4 id5
Agent 1: |--same-spy--| |--same-spy--|
Agent 2: |--same-spy--|
Conclusion: |-----same-spy------||--same-spy--|
Это означает, что есть не более 2 шпионов .
Заметки
Идентификационные данные, принадлежащие одному и тому же шпиону, не обязательно должны быть последовательными, то есть сообщение вроде:
dog cat dog
действует.
Кроме того, одно и то же слово может использоваться двумя разными агентами - это ничего не значит, это просто совпадение, например:
Agent 1: Steam Water Ice
Agent 2: Ice Ice Baby
Лед используется обоими агентами - Ice
используемый первым агентом не связан с двумя случаями Ice
использования второго агента.
Вызов
Скомпилируйте информацию всех ваших агентов и выясните, сколько в действительности шпионов противника. (Точнее, получите самую низкую верхнюю границу, учитывая имеющуюся у вас ограниченную информацию.)
Самый короткий код в байтах побеждает.
Спецификация входа и выхода
Входные данные представляют собой список из n строк, которые представляют n сообщений от агентов. Каждая строка состоит из k разделенных пробелами токенов, одинаковых k для всех строк. Жетоны имеют буквенно-цифровую, произвольную длину. Дело имеет значение.
Вывод должен быть одним числом, представляющим количество различных шпионов, основанных на интеллекте ваших агентов.
Примеры
Пример 1
Входные данные:
Angel Devil Angel Joker Thief Thief
Ra Ra Ras Pu Ti N
say sea c c see cee
Выход:
2
Пример 2
Входные данные:
Blossom Bubbles Buttercup
Ed Edd Eddy
Выход:
3
Пример 3
Входные данные:
Botswana Botswana Botswana
Left Middle Right
Выход:
1
Пример 4
Входные данные:
Black White
White Black
Выход:
2
Пример 5
Входные данные:
Foo Bar Foo
Foo Bar Bar
Выход:
1
Пример 6
Входные данные:
A B C D
A A C D
A B C C
A B B D
Выход:
1
Пример 7
Входные данные:
A B A C
Выход:
3
Пример 8
Входные данные:
A
B
C
Выход:
1
Пример 9
Входные данные:
X
Выход:
1
Ответы:
Кувалда 0.5.1 ,
1615 байтРаспаковывается в эту функцию языка Wolfram Language (финал
&
неявный):Попробуйте онлайн!
Transpose[StringSplit @ #1]
: Разделить каждую строку в списке ввода и взять столбцы (шпионские идентификаторы)RelationGraph[Inner[Equal, ##1, Or] &, ...]
: Построить график, где две вершины разделяют ребро, если хотя бы одна позиция равна (если они классифицированы как один и тот же шпион каким-то дружественным агентом)Length[ConnectedComponents[...]]
: Количество подключенных компонентов является верхней границей возможного количества шпионов.источник
JavaScript (Node.js) ,
155 150 142141 байтПопробуйте онлайн!
Как?
комментарии
источник
Желе , 19 байт
Попробуйте онлайн!
Вводит в виде списка разделенных пробелами строк (это объясняется нижним колонтитулом).
Примечание:
ḲŒQ)PS
это не работает.источник
Python 3 ,
132162154139135 байтовПопробуйте онлайн!
Это очень компактная реализация алгоритма графа, идентифицирующего кластеры.
Для каждого агента, мы создаем карту профилей и их псевдоним, который является самым низким показателем появления:
[map(b.index,b)for b in map(str.split,a)]
. Т.е.[0,1,2,1,2]
определяются три шпиона, где первый профиль принадлежит одному, второй и четвертый - другому, а третий и пятый - последнему. Индекс группы также является индексом первого профиля в группе.Транспонируя эту матрицу (
[*zip(*m...)]
), мы получаем членство в группе для каждого профиля. Это формирует направленный, ациклический граф, потому что индексы группы являются подмножеством индексов профиля, и все ребра идут к более низким или равным индексам. Профили, соответствующие одному и тому же шпиону, теперь образуют кластер без подключений к другим профилям. У нас все еще есть повторяющиеся пути, потому что индексы профиля связаны с индексами нескольких групп.С помощью следующих циклов мы минимизируем граф до плоского леса, где все профили связаны непосредственно с самым низким индексом в их дереве, то есть с корнем:
min(min(u)for u in r if min(w)in u)
И, наконец, возвращает количество корней в лесу, то есть показатели , связанные с собой:
return sum(i==...)
.источник
Древесный уголь ,
4943 байтаПопробуйте онлайн! Ссылка на подробную версию кода. Возможно, можно сэкономить пару байтов, используя громоздкий формат ввода. Объяснение:
Введите список первого агента.
Повторите для остальных агентов.
Введите их список.
Цикл по каждому элементу индекса.
Найдите первый элемент в списке этого агента с той же идентификационной информацией и обновите список первого агента, чтобы показать, что они имеют одинаковую идентификационную информацию.
Подсчитайте количество оставшихся уникальных идентификаторов.
источник
Желе ,
2515 байтПопробуйте онлайн!
Монадическая ссылка, принимающая список разделенных пробелами утверждений агента и возвращающая нижнюю верхнюю границу числа различных шпионов.
объяснение
Спасибо @Arnauld и @JonathanAllan за выявление проблем с предыдущими версиями и еще раз @JonathanAllan за сохранение байта! Если входная спецификация была ослаблена, чтобы разрешить список списков, это спасло бы один байт.
источник
Ġ
отсортированы, а сглаженный, дуплицированный результат фильтраfƇFQ
всегда будет после повторного применения приводить к ним в отсортированном порядке (например'a a b b c', 'a b a b c
, не найдет возможного[3,4,1,2]
, хотя это будет появляться по пути). ТакḲĠ)ẎfƇFQɗⱮQ$ÐLL
может быть хорошо для 15?JavaScript (Node.js) , 120 байт
Попробуйте онлайн!
источник
Шелуха , 12 байт
Попробуйте онлайн!
объяснение
Идея состоит в том, чтобы создать список всех групп шпионов, которые, как известно, являются одним и тем же человеком, затем постепенно объединять пересекающиеся группы, пока не будет достигнута фиксированная точка. Выходными данными является количество оставшихся групп, которые не могут быть объединены.
источник
Python 3 ,
191182 байтаСпасибо рекурсивный
Попробуйте онлайн!
источник
Рубин ,
123117 байтИспользует идею, аналогичную решению Python 3 от Movatica, но вычисляет самый низкий индекс шпиона для каждого «дерева» немного по-другому (отслеживая ранее обнаруженные профили, находя перекрытия, если оно существует, и комбинируя их)
-6 байт из @GB.
Попробуйте онлайн!
объяснение
источник
s.split.map{|i|s.index i}
хорош, но он может создавать крайние случаи в зависимости от длины входных данных. Этот вход должен возвращать 3, а не 2.Python 2 ,
229221 байтПопробуйте онлайн!
8 байтов, спасибо Вилкбену .
источник
g
как используется только один раз, не могли бы вы определить его в строке? Я забыл, если это возможно в Python, но я помню, что это так.Чисто , 137 байт
Попробуйте онлайн!
Связывает строки, используемые агентами, с номером строки, в котором они появляются, чтобы предотвратить равенство между агентами, затем повторно проверяет, перекрываются ли какие-либо фразы для какой-либо позиции, и подсчитывает количество результирующих наборов.
источник
PHP , 271 байт
Это не сработает, если какие-либо идентификаторы являются просто числами, так как я храню «номер шпиона» вместе с идентификаторами. Я не думаю, что это будет трудно исправить, хотя.
Попробуйте онлайн!
объяснение
Вроде как я запутался в написании этого, но это работает для всех тестов
Попробуйте онлайн!
источник