Die Herausforderung
Ihr Programm sollte 3 Eingaben annehmen:
- Eine positive ganze Zahl, die die Anzahl der Variablen ist,
- Ein Satz ungeordneter Paare nichtnegativer Ganzzahlen, wobei jedes Paar eine Gleichheit zwischen Variablen darstellt
- Eine positive ganze Zahl, die die Startvariable darstellt,
Es sollte eine Menge nichtnegativer Ganzzahlen zurückgeben, die alle Variablen darstellen, von denen gezeigt werden kann, dass sie transitiv gleich der Startvariablen sind (einschließlich der Startvariablen selbst).
Mit anderen Worten, da Eingaben N
, E
und S
kehren einen Satz Q
, so dass:
S ∈ Q
.- Wenn
Z ∈ Q
und(Y = Z) ∈ E
dannY ∈ Q
. - Wenn
Z ∈ Q
und(Z = Y) ∈ E
dannY ∈ Q
.
Dies kann auch als graphentheoretisches Problem ausgedrückt werden :
Listen Sie bei einem ungerichteten Diagramm und einem Scheitelpunkt im Diagramm die Scheitelpunkte in der zugehörigen verbundenen Komponente auf .
Spezifikationen
- Sie können zwischen einer 0-basierten und einer 1-basierten Indizierung wählen.
- Die erste Eingabe zählt die Anzahl der vorhandenen Variablen, wobei Variablen als Zahlen angegeben werden. Alternativ können Sie diese Eingabe nicht übernehmen. In diesem Fall wird davon ausgegangen, dass sie abhängig von Ihrem Indizierungsschema entweder dem höchsten vorhandenen Variablenindex oder einem höheren entspricht.
- Sie können davon ausgehen, dass die Eingabe wohlgeformt ist: Sie erhalten keine Variablen außerhalb des Bereichs, der durch die erste Eingabe festgelegt wurde. Beispielsweise
3, [1 = 2, 2 = 0], 1
ist eine gültige Eingabe, während dies4, [1 = 719, 1 = 2, 3 = 2], -3
nicht der Fall ist. - Sie können nicht davon ausgehen, dass mit einer Variablen Gleichheiten verknüpft sind. Wenn eine dritte Eingabe "einsam" ist (keine Gleichungen hat), ist die korrekte Ausgabe eine Singleton-Menge, die nur diese Eingabe enthält (da sie sich selbst entspricht).
- Sie können davon ausgehen, dass die Gleichheit keine Gleichheit von einer Variablen zu sich selbst enthält und dass dieselbe Gleichheit nicht mehrmals gegeben wird (dies schließt Dinge wie
1 = 2
und ein2 = 1
). - Sie können davon ausgehen, dass alle angegebenen Ganzzahlen im darstellbaren Bereich Ihrer Sprache liegen.
- Sie können die zweite Eingabe in jedem vernünftigen Format vornehmen.
Hier sind einige sinnvolle Formate:
0 = 2
0 = 3
1 = 0
{(0, 2), (0, 3), (1, 0)}
[0, 2, 0, 3, 1, 0]
0 2 0 3 1 0
Graph[{{0, 2}, {0, 3}, {1, 0}}]
[0 = 2, 0 = 3, 1 = 0]
- Sie können in jedem vernünftigen Format ausgeben (z. B. Set, Liste usw.). Ordnung ist irrelevant.
Wertung
Dies ist Code-Golf , also gewinnt das kürzeste gültige Programm (in Bytes).
Testfälle (0-indiziert)
3, [1 = 2, 2 = 0], 1 -> {0, 1, 2}
5, [0 = 2, 0 = 3, 1 = 2], 3 -> {0, 1, 2, 3}
6, [0 = 3, 1 = 3, 2 = 4, 5 = 1], 4 -> {2, 4}
6, [0 = 3, 1 = 3, 2 = 4, 5 = 1], 5 -> {0, 1, 3, 5}
5, [0 = 1, 2 = 0, 0 = 3, 4 = 0], 2 -> {0, 1, 2, 3, 4}
6, [0 = 1, 1 = 2, 2 = 3, 3 = 4, 4 = 5], 3 -> {0, 1, 2, 3, 4, 5}
4, [0 = 1, 1 = 2, 2 = 0], 3 -> {3}
5, [0 = 2, 2 = 4], 2 -> {0, 2, 4}
8, [], 7 -> {7}
Testfälle (1-indiziert)
3, [2 = 3, 3 = 1], 2 -> {1, 2, 3}
5, [1 = 3, 1 = 4, 2 = 3], 4 -> {1, 2, 3, 4}
6, [1 = 4, 2 = 4, 3 = 5, 6 = 2], 5 -> {3, 5}
6, [1 = 4, 2 = 4, 3 = 5, 6 = 2], 6 -> {1, 2, 4, 6}
5, [1 = 2, 3 = 1, 1 = 4, 5 = 1], 3 -> {1, 2, 3, 4, 5}
6, [1 = 2, 2 = 3, 3 = 4, 4 = 5, 5 = 6], 4 -> {1, 2, 3, 4, 5, 6}
4, [1 = 2, 2 = 3, 3 = 1], 4 -> {4}
5, [1 = 3, 3 = 5], 3 -> {1, 3, 5}
8, [], 8 -> {8}
code-golf
graph-theory
equation
Esolanging Fruit
quelle
quelle
Antworten:
Brachylog , 22 Bytes
Probieren Sie es online!
Erläuterung
quelle
Python 2 ,
6563 Bytes-2 Bytes dank ovs
Probieren Sie es online!
quelle
Pyth , 12 Bytes
Testsuite.
quelle
Sauber ,
8581 BytesProbieren Sie es online!
Definiert die Funktion
$ :: [[Int]] -> ([Int] -> [Int])
quelle
limit
Arbeit?Wolfram Language (Mathematica) , 32 Byte
Eingabeformat:
{2<->3, 3<->1}, 3
. Die erste Eingabe wird nicht übernommen.Probieren Sie es online!
quelle
Operation Flashpoint- Skriptsprache, 364 Byte
Rufen Sie an mit:
Ausgabe:
Abgerollt:
quelle
Python 2 , 53 Bytes
Probieren Sie es online!
Gleiche Länge wie Funktion:
Probieren Sie es online!
Dies basiert auf Rods netter Lösung mit dem Kurzschluss-Update
b|=b&p and p
. Indem Sie die Anzahl der Variablen als Eingabe verwendenn
, können Sie den Schleifencode verkürzen.quelle
Jelly ,
121110 Bytes-1 danke an Erik den Outgolfer (ersetze das Atom
œ&
durchf
)Ein dyadischer Link, der
E
auf der linken Seite (als Liste mit Listen mit zwei Längen) undS
auf der rechten Seite (als Ganzzahl) eine [de-duplizierte] Liste zurückgibt.Probieren Sie es online! oder sehen Sie sich eine Testsuite an .
Wie?
quelle
œ&
Dief
Rückgabewerte von 's und ' s haben immer die gleiche boolesche Eigenschaft.Perl 5
-n0
,4939 BytesGeben Sie den Startwert in einer Zeile in STDIN an, gefolgt von Zeilen mit äquivalenten Zahlenpaaren (oder geben Sie den Startwert zuletzt oder in der Mitte an oder geben Sie mehrere Startwerte an, alles funktioniert).
Probieren Sie es online!
Dies kann ein Element in der Ergebnismenge mehrmals ausgeben. Diese 48-Byte-Variation gibt jedes äquivalente Element nur einmal aus:
Probieren Sie es online!
quelle
Ruby , 39 Bytes
Probieren Sie es online!
quelle
K (ngn / k) ,
373635 BytesProbieren Sie es online!
{
}
Funktion mit Argumentenx
,y
undz
darstelltN
,E
undS
jeweils!x
ist die Liste 0 1 ... x-1&2
ist die Liste0 0
y,,&2
Wir addieren das Paar0 0
,y
um den Sonderfall eines Leerzeichens zu vermeideny
+y,,&2
Das Gleiche wird von einer Liste von Paaren zu einem Paar von Listen übertragen{
}[+y,,&2]
ist eine Projektion, dh eine Funktion, in derx
der Wert von+y,,&2
und isty
das Argument handelt, das beim Aufrufen der Projektion übergeben wird|y x
isty
bei Indizesx
, umgekehrt (|
)@[y;x;&;|y x]
änderey
an Indizes,x
indem&
du das Minimum ( ) des existierenden Elements und ein Element aus nimmst|y x
/
ruf weiter an bis zur Konvergenza:
zuweisen aa[z]=z
Boolesche Maske der Elemente vona
gleich demz
-ten&
konvertiert die Boolesche Maske in eine Liste von Indizesquelle
Oktave ,
4845 BytesNimmt Eingaben als "Adjazenz-Matrix" auf, benutzt zum Beispiel
[0 0 0; 0 0 1; 1 0 0]
dafür[2 = 3, 3 = 1]
, probiert es online aus!Erläuterung
Zuerst konstruieren wir die vollständige Adjazenzmatrix für den transitiven Graphen, wobei wir die Summe aus
eye(size(A))
(Elemente sind reflexiv),A
(Eingabe) undA'
(Beziehung ist symmetrisch) verwenden.Wir berechnen den transitiven Abschluss, indem wir die Potenz berechnen,
nnz(A)
die ausreicht (nnz(A)
die Obergrenze für die Länge eines Pfades). Von dort müssen wir nur noch die rechte Zeile mit(u,:)
undfind
alle Nicht-Null-Einträge abrufen.quelle
Python 2 , 87 Bytes
Probieren Sie es online!
quelle
Pari / GP , 80 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6), 87 Byte
Eine Deduplizierung wäre mit
&&[...new Set(d[n]||[n])]
einem Aufwand von 14 Byte möglich.quelle