Você está lutando contra uma extensa rede de espiões inimigos . Você sabe que cada espião tem pelo menos uma (às vezes várias) identidades falsas que eles gostam de usar. Você realmente gostaria de saber com quantos espiões está lidando.
Felizmente, seus agentes de contra-inteligência estão fazendo seu trabalho e, às vezes, podem descobrir quando duas identidades falsas são realmente controladas pelo mesmo espião inimigo.
Ou seja:
- Seus agentes nem sempre sabem quando duas identidades falsas têm o mesmo espião, no entanto
- Se um agente lhe disser que duas identidades falsas são controladas pelo mesmo espião, você confia que elas estão certas.
Mensagens do agente
Os agentes enviam mensagens enigmáticas informando quais identidades têm o mesmo espião por trás delas. Um exemplo:
Você tem 2 agentes e 5 identidades falsas para lidar.
O primeiro agente envia uma mensagem para você:
Red Red Blue Orange Orange
Isso significa que eles acham que existem três espiões:
- o primeiro (vermelho) controla as identidades 1 e 2
- o segundo (azul) controla a identidade 3
- o terceiro (laranja) controla as identidades 4 e 5
O segundo agente envia uma mensagem:
cat dog dog bird fly
Isso significa que eles acham que existem 4 espiões:
- o primeiro (gato) controla a identidade 1
- o segundo (cão) controla as identidades 2 e 3
- o terceiro (pássaro) controla a identidade 4
- o quarto (mosca) controla a identidade 5
Compilando as informações que vemos:
Identities: id1 id2 id3 id4 id5
Agent 1: |--same-spy--| |--same-spy--|
Agent 2: |--same-spy--|
Conclusion: |-----same-spy------||--same-spy--|
Isso significa que existem no máximo 2 espiões .
Notas
As identidades pertencentes ao mesmo espião não precisam ser consecutivas, ou seja, uma mensagem como:
dog cat dog
é válido.
Além disso, a mesma palavra pode ser usada por dois agentes diferentes - isso não significa nada, é apenas uma coincidência, por exemplo:
Agent 1: Steam Water Ice
Agent 2: Ice Ice Baby
O gelo é usado pelos dois agentes - o Ice
usado pelo primeiro agente não tem relação com as duas ocorrências Ice
usadas pelo segundo agente.
Desafio
Compile as informações de todos os seus agentes e descubra quantos espiões inimigos existem realmente. (Para ser mais preciso, obtenha o limite superior mais baixo, considerando as informações limitadas que você possui.)
O código mais curto em bytes vence.
Especificação de entrada e saída
A entrada é uma lista de n linhas, que representam n mensagens de agentes. Cada linha consiste em k tokens separados por espaço, o mesmo k para todas as linhas. Os tokens são de comprimento alfanumérico e arbitrário. O caso é importante.
A saída deve ser um número único, representando o número de espiões distintos, com base nas informações dos seus agentes.
Exemplos
Exemplo 1
Entrada:
Angel Devil Angel Joker Thief Thief
Ra Ra Ras Pu Ti N
say sea c c see cee
Saída:
2
Exemplo 2
Entrada:
Blossom Bubbles Buttercup
Ed Edd Eddy
Saída:
3
Exemplo 3
Entrada:
Botswana Botswana Botswana
Left Middle Right
Saída:
1
Exemplo 4
Entrada:
Black White
White Black
Saída:
2
Exemplo 5
Entrada:
Foo Bar Foo
Foo Bar Bar
Saída:
1
Exemplo 6
Entrada:
A B C D
A A C D
A B C C
A B B D
Saída:
1
Exemplo 7
Entrada:
A B A C
Saída:
3
Exemplo 8
Entrada:
A
B
C
Saída:
1
Exemplo 9
Entrada:
X
Saída:
1
Respostas:
Marreta 0.5.1 ,
1615 bytesDescomprime nesta função da Wolfram Language (a final
&
está implícita):Experimente online!
Transpose[StringSplit @ #1]
: Divida cada sequência na lista de entrada e pegue as colunas (identidades de espionagem)RelationGraph[Inner[Equal, ##1, Or] &, ...]
: Construa o gráfico em que dois vértices compartilham uma aresta se pelo menos uma posição for igual (se eles forem classificados como o mesmo espião por algum agente amigo)Length[ConnectedComponents[...]]
: O número de componentes conectados é o limite superior do possível número de espiões.fonte
JavaScript (Node.js) ,
155 150 142141 bytesExperimente online!
Quão?
Comentado
fonte
Geléia , 19 bytes
Experimente online!
Recebe entrada como uma lista de linhas separadas por espaço (o rodapé é responsável por isso).
Nota:
ḲŒQ)PS
se não funcionar.fonte
Python 3 ,
132162154139135 bytesExperimente online!
Esta é uma implementação muito compacta de um algoritmo gráfico que identifica clusters.
Para cada agente, criamos um mapa de perfis e seus alias, que é o menor índice de aparência:
[map(b.index,b)for b in map(str.split,a)]
. Ou seja,[0,1,2,1,2]
identifica três espiões, onde o primeiro perfil pertence a um, o segundo e o quarto a outro e o terceiro e o quinto ao último. O índice do grupo também é o índice do primeiro perfil no grupo.Ao transpor essa matriz (
[*zip(*m...)]
), obtemos uma associação de grupo para cada perfil. Isso forma um gráfico acíclico direcionado, porque os índices de grupo são um subconjunto dos índices de perfil e todas as arestas vão para índices inferiores ou iguais. Os perfis correspondentes ao mesmo espião agora formam um cluster sem conexões com os outros perfis. Ainda temos caminhos duplicados, porque os índices de perfil estão vinculados a vários grupos.Com os seguintes loops, minimizamos o gráfico em uma floresta plana, onde todos os perfis são vinculados diretamente ao índice mais baixo em sua árvore, ou seja, a raiz:
min(min(u)for u in r if min(w)in u)
Finalmente, retornar o número de raízes na floresta, ou seja, os índices ligados a si mesmos:
return sum(i==...)
.fonte
Carvão ,
4943 bytesExperimente online! Link é a versão detalhada do código. É possível salvar alguns bytes usando um formato de entrada complicado. Explicação:
Insira a lista do primeiro agente.
Repita o procedimento para os demais agentes.
Insira a lista deles.
Loop sobre cada índice de elemento.
Encontre o primeiro elemento na lista deste agente com a mesma identidade e atualize a lista do primeiro agente para mostrar que eles têm a mesma identidade.
Conte o número de identidades únicas restantes.
fonte
Geléia ,
2515 bytesExperimente online!
Um link monádico que obtém uma lista de reivindicações de agentes que separam o espaço e retorna o limite superior mais baixo do número de espiões distintos.
Explicação
Agradecemos a @Arnauld e @JonathanAllan por identificar problemas nas versões anteriores e a @JonathanAllan novamente por salvar um byte! Se a especificação de entrada fosse relaxada para permitir uma lista de listas, isso economizaria um byte.
fonte
Ġ
são classificados e o resultado achatado e desduplicado do filtrofƇFQ
sempre sempre, após aplicação repetida, termina com eles na ordem classificada (por exemplo'a a b b c', 'a b a b c
, não encontrará um eventual[3,4,1,2]
, mesmo que apareça ao longo do caminho). Então,ḲĠ)ẎfƇFQɗⱮQ$ÐLL
pode ser bom para 15?JavaScript (Node.js) , 120 bytes
Experimente online!
fonte
Casca , 12 bytes
Experimente online!
Explicação
A idéia é criar uma lista de todos os grupos de espiões que são conhecidos por serem a mesma pessoa e, em seguida, mesclar progressivamente os grupos que se cruzam até que um ponto fixo seja alcançado. A saída é o número de grupos restantes que não puderam ser mesclados.
fonte
Python 3 ,
191182 bytesObrigado recursivo
Experimente online!
fonte
Ruby ,
123117 bytesUsa uma idéia semelhante à solução Python 3 da movatica, mas calcula o menor índice de espião para cada "árvore" de uma maneira ligeiramente diferente (acompanhando os perfis encontrados anteriormente, encontrando uma sobreposição, se houver, e combinando-os)
-6 bytes de @GB.
Experimente online!
Explicação
fonte
s.split.map{|i|s.index i}
é bom, mas pode criar casos de borda dependendo do comprimento das entradas. Essa entrada deve retornar 3, e não 2.Python 2 ,
229221 bytesExperimente online!
8 bytes thx para wilkben .
fonte
g
é usado apenas uma vez, você não pode defini-lo em linha? Eu meio que esqueço se isso é possível em Python, mas eu me lembro que é.Limpo , 137 bytes
Experimente online!
Associa as strings usadas pelos agentes ao número da linha em que aparecem para impedir a igualdade entre os agentes, depois verifica repetidamente se alguma frase de qualquer posição se sobrepõe e conta o número de conjuntos resultantes.
fonte
PHP , 271 bytes
Isso não funcionará se qualquer uma das identidades forem apenas números, pois eu armazeno o "número do espião" nas identidades. Eu não acho que seria difícil consertar isso.
Experimente online!
Explicação
Meio que me confundi escrevendo isso, mas funciona para todos os casos de teste!
Experimente online!
fonte