Vous combattez un vaste réseau d' espions ennemis . Vous savez que chaque espion a au moins une (parfois plusieurs) fausses identités qu’ils aiment utiliser. Vous aimeriez vraiment savoir à combien d'espions vous avez réellement affaire.
Heureusement, vos agents de contre-espionnage font leur travail et peuvent parfois déterminer si deux fausses identités sont réellement contrôlées par le même espion ennemi.
C'est-à-dire:
- Vos agents ne savent pas toujours quand deux fausses identités ont le même espion derrière elles, cependant
- Si un agent vous dit que deux fausses identités sont contrôlées par le même espion, vous avez l’impression qu’elles ont raison.
Messages de l'agent
Les agents vous envoient des messages cryptés vous indiquant quelles identités ont le même espion derrière elles. Un exemple:
Vous avez 2 agents et 5 fausses identités à traiter.
Le premier agent vous envoie un message:
Red Red Blue Orange Orange
Cela signifie qu'ils pensent qu'il y a 3 espions:
- le premier (en rouge) contrôle les identités 1 et 2
- le second (bleu) contrôle l'identité 3
- le troisième (Orange) contrôle les identités 4 et 5
Le deuxième agent vous envoie un message:
cat dog dog bird fly
Cela signifie qu'ils pensent qu'il y a 4 espions:
- le premier (chat) contrôle l'identité 1
- le second (chien) contrôle les identités 2 et 3
- le troisième (oiseau) contrôle l'identité 4
- le quatrième (mouche) contrôle l'identité 5
En compilant les informations, nous voyons:
Identities: id1 id2 id3 id4 id5
Agent 1: |--same-spy--| |--same-spy--|
Agent 2: |--same-spy--|
Conclusion: |-----same-spy------||--same-spy--|
Cela signifie qu'il y a au plus 2 espions .
Remarques
Les identités appartenant au même espion ne doivent pas nécessairement être consécutives, c’est-à-dire un message du type:
dog cat dog
est valable.
En outre, le même mot peut être utilisé par deux agents différents - cela ne veut rien dire, c'est juste une coïncidence, par exemple:
Agent 1: Steam Water Ice
Agent 2: Ice Ice Baby
La glace est utilisée par les deux agents - l’ Ice
utilisation par le premier agent n’est pas liée aux deux occurrences de celle Ice
utilisée par le deuxième agent.
Défi
Compilez l'intelligence de tous vos agents et déterminez le nombre d'espions ennemis. (Pour être plus précis, obtenez la limite supérieure la plus basse compte tenu des informations limitées dont vous disposez.)
Le code le plus court en octets gagne.
Spécifications d'entrée et de sortie
L'entrée est une liste de n lignes, qui représentent n messages des agents. Chaque ligne est composée de k jetons séparés par des espaces, le même k pour toutes les lignes. Les jetons sont alphanumériques, de longueur arbitraire. L'affaire compte.
Le résultat devrait être un nombre unique, représentant le nombre d'espions distincts, basé sur les informations de vos agents.
Exemples
Exemple 1
Contribution:
Angel Devil Angel Joker Thief Thief
Ra Ra Ras Pu Ti N
say sea c c see cee
Sortie:
2
Exemple 2
Contribution:
Blossom Bubbles Buttercup
Ed Edd Eddy
Sortie:
3
Exemple 3
Contribution:
Botswana Botswana Botswana
Left Middle Right
Sortie:
1
Exemple 4
Contribution:
Black White
White Black
Sortie:
2
Exemple 5
Contribution:
Foo Bar Foo
Foo Bar Bar
Sortie:
1
Exemple 6
Contribution:
A B C D
A A C D
A B C C
A B B D
Sortie:
1
Exemple 7
Contribution:
A B A C
Sortie:
3
Exemple 8
Contribution:
A
B
C
Sortie:
1
Exemple 9
Contribution:
X
Sortie:
1
Réponses:
Sledgehammer 0.5.1 ,
1615 octetsDécompresse dans cette fonction Wolfram Language (la finale
&
est implicite):Essayez-le en ligne!
Transpose[StringSplit @ #1]
: Scinder chaque chaîne de la liste d'entrée et prendre les colonnes (identités d'espionnage)RelationGraph[Inner[Equal, ##1, Or] &, ...]
: Construit le graphique où deux sommets partagent une arête si au moins une position est égale (s'ils sont classés comme étant le même espion par un agent ami)Length[ConnectedComponents[...]]
: Le nombre de composants connectés est la limite supérieure du nombre possible d'espions.la source
JavaScript (Node.js) ,
155 150 142141 octetsEssayez-le en ligne!
Comment?
Commenté
la source
Gelée , 19 octets
Essayez-le en ligne!
Prend les entrées sous forme de liste de lignes séparées par des espaces (le pied de page en tient compte).
Note:
ḲŒQ)PS
ne fonctionne pas .la source
Python 3 ,
132162154139135 octetsEssayez-le en ligne!
Il s'agit d'une implémentation très compacte d'un algorithme graphique identifiant des grappes.
Pour chaque agent, nous créons une carte de profils et leurs alias, ce qui est l'indice le plus bas d'apparition:
[map(b.index,b)for b in map(str.split,a)]
. Ie[0,1,2,1,2]
identifie trois espions, où le premier profil appartient à un, les deuxième et quatrième à un autre et le troisième et le cinquième au dernier. L'index du groupe est également l'index du premier profil du groupe.En transposant cette matrice (
[*zip(*m...)]
), nous obtenons une appartenance à un groupe pour chaque profil. Cela forme un graphe acyclique dirigé, car les index de groupe sont un sous-ensemble des index de profil, et tous les bords vont vers des index inférieurs ou égaux. Les profils correspondant au même espion forment maintenant un cluster sans connexion aux autres profils. Nous avons toujours des chemins en double, car les index de profil sont liés à plusieurs index de groupes.Avec les boucles suivantes, nous réduisons le graphique en une forêt plate, dans laquelle tous les profils sont directement liés à l'indice le plus bas de leur arbre, à savoir la racine:
min(min(u)for u in r if min(w)in u)
Enfin, le retour le nombre de racines dans la forêt, les indices liés à - dire eux - mêmes:
return sum(i==...)
.la source
charbon ,
4943 octetsEssayez-le en ligne! Le lien est vers la version verbeuse du code. Pourrait éventuellement économiser quelques octets en utilisant un format d’entrée encombrant. Explication:
Entrez la liste du premier agent.
Répétez l'opération pour les agents restants.
Entrez leur liste.
Boucle sur chaque index d'élément.
Recherchez le premier élément de la liste de cet agent avec la même identité et mettez à jour la liste du premier agent pour montrer qu'il s'agit de la même identité.
Comptez le nombre d'identités uniques restantes.
la source
Gelée ,
25 à15 octetsEssayez-le en ligne!
Un lien monadique prenant une liste de revendications d'agent séparant les espaces et renvoyant la limite supérieure la plus basse du nombre d'espions distincts.
Explication
Merci à @Arnauld et @JonathanAllan pour avoir identifié les problèmes liés aux versions précédentes et à @JonathanAllan pour avoir sauvegardé un octet! Si les spécifications d'entrée étaient assouplies pour permettre une liste de listes, cela économiserait un octet.
la source
Ġ
sont triés et le résultat du filtre aplati et dédupliquéfƇFQ
, finira toujours, après une application répétée, par un tri (par exemple'a a b b c', 'a b a b c
, ne trouvera pas un éventuel[3,4,1,2]
, même si cela apparaît en cours de route). AlorsḲĠ)ẎfƇFQɗⱮQ$ÐLL
pourrait être bon pour 15?JavaScript (Node.js) , 120 octets
Essayez-le en ligne!
la source
Décortiquer , 12 octets
Essayez-le en ligne!
Explication
L'idée est de créer une liste de tous les groupes d'espions connus pour être la même personne, puis de fusionner progressivement les groupes qui se croisent jusqu'à atteindre un point fixe. Le résultat est le nombre de groupes restants qui n'ont pas pu être fusionnés.
la source
Python 3 ,
191182 octetsMerci récursive
Essayez-le en ligne!
la source
Ruby ,
123117 octetsUtilise une idée similaire à celle de la solution Python 3 de movatica mais calcule l'indice d'espionnage le plus faible pour chaque "arbre" d'une manière légèrement différente (en gardant une trace des profils précédents rencontrés, en recherchant un chevauchement s'il existe et en les combinant)
-6 octets de @GB.
Essayez-le en ligne!
Explication
la source
s.split.map{|i|s.index i}
est agréable, mais elle peut créer des cas extrêmes en fonction de la longueur des entrées. Cette entrée doit renvoyer 3 et non 2.Python 2 ,
229221 octetsEssayez-le en ligne!
8 octets à wilkben .
la source
g
n’est utilisé qu’une fois, ne pourriez-vous pas le définir en ligne? J'oublie un peu si c'est possible en Python mais il me semble que je m'en souviens.Propre , 137 octets
Essayez-le en ligne!
Associe les chaînes utilisées par les agents au numéro de ligne dans lequel elles apparaissent pour éviter toute égalité entre les agents, puis vérifie à plusieurs reprises si des expressions de position se chevauchent et compte le nombre d'ensembles résultants.
la source
PHP , 271 octets
Cela ne fonctionnera pas si l'une des identités ne sont que des chiffres, car je stocke le "numéro d'espion" avec les identités. Je ne pense pas que ce ne serait pas difficile de résoudre ce problème.
Essayez-le en ligne!
Explication
J'étais un peu perplexe en écrivant cela, mais cela fonctionne pour tous les cas de test!
Essayez-le en ligne!
la source