Du kämpfst gegen ein ausgedehntes Netzwerk feindlicher Spione . Sie wissen, dass jeder Spion mindestens eine (manchmal mehrere) gefälschte Identität hat , die er gerne benutzt. Sie möchten wirklich wissen, mit wie vielen Spionen Sie tatsächlich zu tun haben.
Glücklicherweise Ihre Abwehrmittel ihre Arbeit tun und kann manchmal herausfinden , wenn zwei gefälschte Identitäten tatsächlich von demselben Feind Spion kontrolliert werden.
Das heißt:
- Ihre Agenten wissen jedoch nicht immer, wann zwei gefälschte Identitäten denselben Spion hinter sich haben
- Wenn Ihnen ein Agent sagt, dass zwei gefälschte Identitäten von demselben Spion kontrolliert werden, vertrauen Sie darauf, dass sie richtig sind.
Agentennachrichten
Agenten senden Ihnen kryptische Nachrichten, in denen Sie erfahren, welche Identitäten denselben Spion haben. Ein Beispiel:
Sie müssen mit 2 Agenten und 5 gefälschten Identitäten umgehen.
Der erste Agent sendet Ihnen eine Nachricht:
Red Red Blue Orange Orange
Das heißt, sie denken, es gibt 3 Spione:
- Der erste (rot) steuert die Identitäten 1 und 2
- der zweite (blau) kontrolliert Identität 3
- die dritte (orange) steuert die identitäten 4 und 5
Der zweite Agent sendet Ihnen eine Nachricht:
cat dog dog bird fly
Das heißt, sie denken, es gibt 4 Spione:
- Die erste (Katze) kontrolliert Identität 1
- der zweite (Hund) kontrolliert die Identitäten 2 und 3
- der dritte (Vogel) kontrolliert Identität 4
- die vierte (Fliege) kontrolliert die Identität 5
Kompilieren der Informationen, die wir sehen:
Identities: id1 id2 id3 id4 id5
Agent 1: |--same-spy--| |--same-spy--|
Agent 2: |--same-spy--|
Conclusion: |-----same-spy------||--same-spy--|
Das heißt, es gibt höchstens 2 Spione .
Anmerkungen
Identitäten, die demselben Spion gehören, müssen nicht aufeinanderfolgend sein, dh eine Nachricht wie:
dog cat dog
ist gültig.
Das gleiche Wort könnte auch von zwei verschiedenen Agenten verwendet werden - das bedeutet nichts, es ist nur ein Zufall, zB:
Agent 1: Steam Water Ice
Agent 2: Ice Ice Baby
Eis wird von beiden Agenten verwendet - das Eis, das vom Ice
ersten Agenten verwendet wird, hat nichts mit den beiden Vorkommen des Eises zu tun, Ice
das vom zweiten Agenten verwendet wird.
Herausforderung
Stellen Sie alle Informationen Ihrer Agenten zusammen und finden Sie heraus, wie viele feindliche Spione es tatsächlich gibt. (Um genauer zu sein, erhalten Sie die niedrigste Obergrenze, wenn Sie die begrenzten Informationen haben.)
Der kürzeste Code in Bytes gewinnt.
Eingangs- und Ausgangsspezifikation
Die Eingabe ist eine Liste von n Zeilen, die n Nachrichten von Agenten darstellen. Jede Zeile besteht aus k durch Leerzeichen getrennten Token, wobei k für alle Zeilen gleich ist. Token sind alphanumerisch und beliebig lang. Der Fall ist wichtig.
Die Ausgabe sollte eine einzelne Zahl sein, die die Anzahl der unterschiedlichen Spione darstellt, basierend auf den Informationen Ihrer Agenten.
Beispiele
Beispiel 1
Eingang:
Angel Devil Angel Joker Thief Thief
Ra Ra Ras Pu Ti N
say sea c c see cee
Ausgabe:
2
Beispiel 2
Eingang:
Blossom Bubbles Buttercup
Ed Edd Eddy
Ausgabe:
3
Beispiel 3
Eingang:
Botswana Botswana Botswana
Left Middle Right
Ausgabe:
1
Beispiel 4
Eingang:
Black White
White Black
Ausgabe:
2
Beispiel 5
Eingang:
Foo Bar Foo
Foo Bar Bar
Ausgabe:
1
Beispiel 6
Eingang:
A B C D
A A C D
A B C C
A B B D
Ausgabe:
1
Beispiel 7
Eingang:
A B A C
Ausgabe:
3
Beispiel 8
Eingang:
A
B
C
Ausgabe:
1
Beispiel 9
Eingang:
X
Ausgabe:
1
Antworten:
Vorschlaghammer 0.5.1 ,
1615 BytesDekomprimiert in diese Wolfram Language-Funktion (das Finale
&
ist implizit):Probieren Sie es online!
Transpose[StringSplit @ #1]
: Teile jede Zeichenkette in der Eingabeliste auf und nimm die Spalten (Spionidentitäten)RelationGraph[Inner[Equal, ##1, Or] &, ...]
: Konstruiere den Graphen, in dem zwei Eckpunkte eine Kante teilen, wenn mindestens eine Position gleich ist (wenn sie von einem befreundeten Agenten als derselbe Spion klassifiziert wurden).Length[ConnectedComponents[...]]
: Die Anzahl der verbundenen Komponenten ist die Obergrenze für die mögliche Anzahl der Spione.quelle
JavaScript (Node.js) ,
155 150 142141 BytesProbieren Sie es online!
Wie?
Kommentiert
quelle
Jelly , 19 Bytes
Probieren Sie es online!
Nimmt Eingaben als Liste mit durch Leerzeichen getrennten Zeilen (die Fußzeile berücksichtigt dies).
Hinweis:
ḲŒQ)PS
funktioniert nicht .quelle
Python 3 ,
132162154139135 BytesProbieren Sie es online!
Dies ist eine sehr kompakte Implementierung eines Graph-Algorithmus, der Cluster identifiziert.
Für jeden Agenten, erstellen wir eine Karte von Profilen und deren Alias, das der niedrigste Index der Erscheinung ist:
[map(b.index,b)for b in map(str.split,a)]
. Dh[0,1,2,1,2]
identifiziert drei Spione, wobei das erste Profil zu einem gehört, das zweite und vierte zu einem anderen und das dritte und fünfte zu dem letzten. Der Gruppenindex ist auch der Index des ersten Profils in der Gruppe.Durch die Transposition dieser Matrix (
[*zip(*m...)]
) erhalten wir eine Gruppenmitgliedschaft für jedes Profil. Dies bildet einen gerichteten, azyklischen Graphen, da die Gruppenindizes eine Teilmenge der Profilindizes sind und alle Kanten zu niedrigeren oder gleichen Indizes weisen. Profile, die demselben Spion entsprechen, bilden jetzt einen Cluster ohne Verbindungen zu den anderen Profilen. Es gibt jedoch immer noch doppelte Pfade, da Profilindizes mit mehreren Gruppenindizes verknüpft sind.Mit den folgenden Schleifen minimieren wir den Graphen auf eine flache Gesamtstruktur, in der alle Profile direkt mit dem niedrigsten Index in ihrem Baum, dh der Wurzel, verknüpft sind:
min(min(u)for u in r if min(w)in u)
Schließlich gibt die Anzahl der Wurzeln in dem Wald, dh Indizes selbst verbunden:
return sum(i==...)
.quelle
Kohle ,
4943 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Könnte möglicherweise ein paar Bytes sparen, wenn ein umständliches Eingabeformat verwendet wird. Erläuterung:
Geben Sie die Liste des ersten Agenten ein.
Wiederholen Sie dies für die restlichen Agenten.
Geben Sie ihre Liste ein.
Schleife über jeden Elementindex.
Suchen Sie das erste Element in der Liste dieses Agenten mit derselben Identität und aktualisieren Sie die Liste des ersten Agenten, um anzuzeigen, dass es sich um dieselbe Identität handelt.
Zählen Sie die Anzahl der verbleibenden eindeutigen Identitäten.
quelle
Jelly ,
2515 BytesProbieren Sie es online!
Ein monadischer Link, der eine Liste von durch Leerzeichen getrennten Agenten-Ansprüchen erstellt und die unterste obere Schranke der Anzahl unterschiedlicher Spione zurückgibt.
Erläuterung
Vielen Dank an @Arnauld und @JonathanAllan für die Identifizierung von Problemen mit früheren Versionen und nochmals an @JonathanAllan für das Speichern eines Bytes! Wenn die Eingabespezifikation gelockert würde, um eine Liste von Listen zuzulassen, würde dies ein Byte sparen.
quelle
Ġ
sortiert sind und das abgeflachte, de-duplizierte FilterergebnisfƇFQ
nach wiederholter Anwendung immer in sortierter Reihenfolge zu diesen führt (z. B.'a a b b c', 'a b a b c
kein Eventual findet)[3,4,1,2]
, obwohl es auf dem Weg erscheinen würde). SoḲĠ)ẎfƇFQɗⱮQ$ÐLL
könnte gut sein für 15?JavaScript (Node.js) , 120 Byte
Probieren Sie es online!
quelle
Schale , 12 Bytes
Probieren Sie es online!
Erläuterung
Die Idee ist, eine Liste aller Gruppen von Spionen zu erstellen, von denen bekannt ist, dass sie dieselbe Person sind, und dann sich überschneidende Gruppen schrittweise zusammenzuführen, bis ein fester Punkt erreicht ist. Die Ausgabe ist die Anzahl der verbleibenden Gruppen, die nicht zusammengeführt werden konnten.
quelle
Python 3 ,
191182 BytesDanke rekursiv
Probieren Sie es online!
quelle
Ruby ,
123 bis117 BytesVerwendet eine ähnliche Idee wie die Python 3-Lösung von movatica , berechnet jedoch den niedrigsten Spionageindex für jeden "Baum" auf eine etwas andere Art und Weise (indem Sie zuvor aufgetretene Profile verfolgen, eine Überlappung finden, falls vorhanden, und diese kombinieren).
-6 Bytes von @GB.
Probieren Sie es online!
Erläuterung
quelle
s.split.map{|i|s.index i}
ist nett, aber es kann Kantenfälle abhängig von der Länge der Eingaben erstellen. Diese Eingabe sollte 3 und nicht 2 zurückgeben.Python 2 ,
229221 BytesProbieren Sie es online!
8 Bytes Danke an Wilkben .
quelle
g
es nur einmal verwendet wird, können Sie es nicht inline definieren? Ich vergesse ein bisschen, ob das in Python möglich ist, aber ich scheine mich daran zu erinnern.Sauber , 137 Bytes
Probieren Sie es online!
Verknüpft die von den Agenten verwendeten Zeichenfolgen mit der Zeilennummer, die in angezeigt wird, um die Gleichheit zwischen Agenten zu verhindern, und überprüft dann wiederholt, ob sich Phrasen für eine Position überlappen, und zählt die Anzahl der resultierenden Mengen.
quelle
PHP , 271 Bytes
Dies funktioniert nicht, wenn es sich bei einer der Identitäten nur um Zahlen handelt, da ich die "Spionage-Nummer" mit den Identitäten speichere. Ich glaube nicht, dass es schwierig wäre, das zu beheben.
Probieren Sie es online!
Erläuterung
Irgendwie verwirrte mich das zu schreiben, aber es funktioniert für alle Testfälle!
Probieren Sie es online!
quelle