Estás luchando contra una extensa red de espías enemigos . Sabes que cada espía tiene al menos una (a veces múltiples) identidades falsas que les gusta usar. Realmente te gustaría saber con cuántos espías estás lidiando realmente.
Afortunadamente, tus agentes de contrainteligencia están haciendo su trabajo y, a veces, pueden descubrir cuándo dos identidades falsas son controladas por el mismo espía enemigo.
Es decir:
- Sin embargo, sus agentes no siempre saben cuándo dos identidades falsas tienen el mismo espía detrás de ellos.
- Si un agente le dice que dos identidades falsas están controladas por el mismo espía, usted confía en que tienen razón.
Mensajes del agente
Los agentes le envían mensajes crípticos que le dicen qué identidades tienen el mismo espía detrás de ellos. Un ejemplo:
Tienes 2 agentes y 5 identidades falsas para tratar.
El primer agente te envía un mensaje:
Red Red Blue Orange Orange
Esto significa que piensan que hay 3 espías:
- el primero (rojo) controla las identidades 1 y 2
- el segundo (Azul) controla la identidad 3
- el tercero (Naranja) controla las identidades 4 y 5
El segundo agente te envía un mensaje:
cat dog dog bird fly
Esto significa que piensan que hay 4 espías:
- el primero (gato) controla la identidad 1
- el segundo (perro) controla las identidades 2 y 3
- el tercero (pájaro) controla la identidad 4
- el cuarto (mosca) controla la identidad 5
Compilando la información que vemos:
Identities: id1 id2 id3 id4 id5
Agent 1: |--same-spy--| |--same-spy--|
Agent 2: |--same-spy--|
Conclusion: |-----same-spy------||--same-spy--|
Esto significa que hay como máximo 2 espías .
Notas
Las identidades propiedad del mismo espía no tienen que ser consecutivas, es decir, un mensaje como:
dog cat dog
es válido.
Además, dos agentes diferentes pueden usar la misma palabra; eso no significa nada, es solo una coincidencia, por ejemplo:
Agent 1: Steam Water Ice
Agent 2: Ice Ice Baby
El hielo es usado por ambos agentes: el Ice
usado por el primer agente no está relacionado con las dos ocurrencias del Ice
usado por el segundo agente.
Reto
Recopila la información de todos tus agentes y calcula cuántos espías enemigos hay realmente. (Para ser más precisos, obtenga el límite superior más bajo, dada la información limitada que tiene).
El código más corto en bytes gana.
Especificaciones de entrada y salida
La entrada es una lista de n líneas, que representan n mensajes de agentes. Cada línea consta de k fichas separadas por espacios, la misma k para todas las líneas. Los tokens son alfanuméricos, de longitud arbitraria. El caso importa.
El resultado debe ser un número único, que represente el número de espías distintos, según la información de sus agentes.
Ejemplos
Ejemplo 1
Entrada:
Angel Devil Angel Joker Thief Thief
Ra Ra Ras Pu Ti N
say sea c c see cee
Salida:
2
Ejemplo 2
Entrada:
Blossom Bubbles Buttercup
Ed Edd Eddy
Salida:
3
Ejemplo 3
Entrada:
Botswana Botswana Botswana
Left Middle Right
Salida:
1
Ejemplo 4
Entrada:
Black White
White Black
Salida:
2
Ejemplo 5
Entrada:
Foo Bar Foo
Foo Bar Bar
Salida:
1
Ejemplo 6
Entrada:
A B C D
A A C D
A B C C
A B B D
Salida:
1
Ejemplo 7
Entrada:
A B A C
Salida:
3
Ejemplo 8
Entrada:
A
B
C
Salida:
1
Ejemplo 9
Entrada:
X
Salida:
1
Respuestas:
Almádena 0.5.1 ,
1615 bytesSe descomprime en esta función Wolfram Language (la final
&
es implícita):Pruébalo en línea!
Transpose[StringSplit @ #1]
: Divida cada cadena en la lista de entrada y tome las columnas (identidades de espía)RelationGraph[Inner[Equal, ##1, Or] &, ...]
: Construya el gráfico donde dos vértices comparten un borde si al menos una posición es igual (si algún agente amigo los clasifica como el mismo espía)Length[ConnectedComponents[...]]
: El número de componentes conectados es el límite superior del número posible de espías.fuente
JavaScript (Node.js) ,
155 150 142141 bytesPruébalo en línea!
¿Cómo?
Comentado
fuente
Jalea , 19 bytes
Pruébalo en línea!
Toma datos como una lista de líneas separadas por espacios (el pie de página lo explica).
Nota:
ḲŒQ)PS
no , no funciona.fuente
Python 3 ,
132162154139135 bytesPruébalo en línea!
Esta es una implementación muy compacta de un algoritmo gráfico que identifica clústeres.
Para cada agente, creamos un mapa de perfiles y sus alias, que es el índice más bajo de la apariencia:
[map(b.index,b)for b in map(str.split,a)]
. Es decir,[0,1,2,1,2]
identifica tres espías, donde el primer perfil pertenece a uno, el segundo y cuarto a otro y el tercero y quinto al último. El índice del grupo también es el índice del primer perfil del grupo.Al transponer esta matriz (
[*zip(*m...)]
), obtenemos una membresía de grupo para cada perfil. Esto forma un gráfico acíclico dirigido, porque los índices de grupo son un subconjunto de los índices de perfil, y todos los bordes van hacia índices más bajos o iguales. Los perfiles correspondientes al mismo espía ahora forman un clúster sin conexiones a los otros perfiles. Sin embargo, todavía tenemos rutas duplicadas, porque los índices de perfil están vinculados a índices de múltiples grupos.Con los siguientes bucles, minimizamos el gráfico en un bosque plano, donde todos los perfiles están vinculados directamente al índice más bajo de su árbol, es decir, la raíz:
min(min(u)for u in r if min(w)in u)
Por último, devolver el número de raíces en el bosque, es decir, índices enlazados a sí mismos:
return sum(i==...)
.fuente
Carbón ,
4943 bytesPruébalo en línea! El enlace es a la versión detallada del código. Posiblemente podría guardar un par de bytes utilizando un formato de entrada engorroso. Explicación:
Ingrese la lista del primer agente.
Repita para los agentes restantes.
Ingrese su lista.
Pase sobre cada índice de elemento.
Encuentre el primer elemento en la lista de este agente con la misma identidad y actualice la lista del primer agente para mostrar que son la misma identidad.
Cuente el número de identidades únicas restantes.
fuente
Jalea ,
2515 bytesPruébalo en línea!
Un enlace monádico que toma una lista de reclamos de agentes que separan el espacio y devuelve el límite superior más bajo del número de espías distintos.
Explicación
¡Gracias a @Arnauld y @JonathanAllan por identificar problemas con versiones anteriores, y a @JonathanAllan nuevamente por guardar un byte! Si la especificación de entrada se relajara para permitir una lista de listas, esto ahorraría un byte.
fuente
Ġ
se ordenan y el resultado de filtro aplanado y desduplicadofƇFQ
, siempre, después de una aplicación repetida, terminaría con estos en orden ordenado (por ejemplo'a a b b c', 'a b a b c
, no encontrará un eventual[3,4,1,2]
, aunque aparecería en el camino). EntoncesḲĠ)ẎfƇFQɗⱮQ$ÐLL
, ¿ podría ser bueno para 15?JavaScript (Node.js) , 120 bytes
Pruébalo en línea!
fuente
Casco , 12 bytes
Pruébalo en línea!
Explicación
La idea es crear una lista de todos los grupos de espías que se sabe que son la misma persona, luego fusionar progresivamente los grupos que se cruzan hasta llegar a un punto fijo. El resultado es el número de grupos restantes que no se pudieron fusionar.
fuente
Python 3 ,
191182 bytesGracias recursivo
Pruébalo en línea!
fuente
Ruby ,
123117bytesUtiliza una idea similar a la solución Python 3 de movatica, pero calcula el índice de espionaje más bajo para cada "árbol" de una manera ligeramente diferente (haciendo un seguimiento de los perfiles encontrados anteriormente, encontrando una superposición si existe y combinándolos)
-6 bytes de @GB.
Pruébalo en línea!
Explicación
fuente
s.split.map{|i|s.index i}
es bueno, pero puede crear casos extremos dependiendo de la longitud de las entradas. Esta entrada debe devolver 3, no 2.Python 2 ,
229221 bytesPruébalo en línea!
8 bytes thx a wilkben .
fuente
g
solo se usa una vez, ¿no podría definirlo en línea? Olvidé un poco si eso es posible en Python, pero creo recordar que sí.Limpio , 137 bytes
Pruébalo en línea!
Asocia las cadenas utilizadas por los agentes con el número de línea en el que aparecen para evitar la igualdad entre los agentes, luego verifica repetidamente si alguna frase para cualquier posición se superpone y cuenta el número de conjuntos resultantes.
fuente
PHP , 271 bytes
Esto no funcionará si alguna de las identidades son solo números, ya que guardo el "número de espía" con las identidades. Sin embargo, no creo que sea difícil arreglar eso.
Pruébalo en línea!
Explicación
¡Me confundí al escribir esto, pero funciona para todos los casos de prueba!
Pruébalo en línea!
fuente