Herausforderungsbeschreibung
Beginnen wir mit einigen Definitionen:
- Eine Relation ist eine Menge geordneter Elementpaare (in dieser Herausforderung werden Ganzzahlen verwendet).
Zum Beispiel [(1, 2), (5, 1), (-9, 12), (0, 0), (3, 2)]
ist eine Beziehung.
eine Beziehung heißt transitive wenn für irgendwelche zwei Paare von Elementen
(a, b)
und(b, c)
in dieser Beziehung ein Paar(a, c)
ebenfalls vorhanden ist,[(1, 2), (2, 4), (6, 5), (1, 4)]
ist transitiv, weil es enthält(1, 2)
und(2, 4)
, aber(1, 4)
auch,[(7, 8), (9, 10), (15, -5)]
ist transitiv, weil es keine zwei Paare gibt(a, b)
, die so(c, d)
vorhanden sind, dassb
=c
.[(5, 9), (9, 54), (0, 0)]
ist nicht transitiv, weil es(5, 9)
und enthält(9, 54)
, aber nicht(5, 54)
Bestimmen Sie anhand einer Liste von Ganzzahlpaaren, ob eine Beziehung transitiv ist oder nicht.
Input-Output
Sie erhalten eine Liste mit Paaren von ganzen Zahlen in einem angemessenen Format. Betrachten Sie eine Beziehung
[(1, 6), (9, 1), (6, 5), (0, 0)]
Die folgenden Formate sind äquivalent:
[(1, 6), (9, 1), (6, 5), (0, 0)] # list of pairs (2-tuples)
[1, 9, 6, 0], [6, 1, 5, 0] # two lists [x1, x2, ..., xn] [y1, y2, ..., yn]
[[1, 6], [9, 1], [6, 5], [0, 0] # two-dimentional int array
[4, 1, 6, 9, 1, 6, 5, 0, 0] # (n, x1, y1, ..., xn, yn)
[1+6i, 9+i, 6+5i, 0+0i] # list of complex numbers
... many others, whatever best suits golfing purposes
Ausgabe: ein wahrer Wert für eine transitiven Beziehung, sonst falsch. Sie können davon ausgehen, dass die Eingabe aus mindestens einem Paar besteht und dass die Paare eindeutig sind.
quelle
(1,3) (2,1) (3,4) (1,4) (2,4)
. Wenn die Paare nicht bestellt würden, wäre dies nicht transitiv, weil(2,3)
es fehlt.[(7, 8), (9, 10), (15, -5)]
) nicht transitiv sein?Antworten:
Haskell, 42 Bytes
Anwendungsbeispiel:
f [(1,2), (2,4), (6,5), (1,4)]
->True
.(Äußere) Schleife über alle Paare
(a,b)
und (innere) Schleife über dieselben Paare, die jetzt aufgerufen werden(c,d)
und jedes Mal, wennb==c
überprüft wird, ob(a,d)
es sich auch um ein vorhandenes Paar handelt. Kombinieren Sie die Ergebnisse mit logischand
.quelle
Prolog, 66 Bytes
Die Beziehung ist nicht transitiv, wenn wir (A, B) und (B, C) so finden, dass (A, C) nicht gilt.
quelle
MATL ,
2725 BytesDas Eingabeformat ist eine Matrix (die
;
als Zeilentrennzeichen verwendet wird), wobei jedes Beziehungspaar eine Spalte ist. Zum Beispiel Testfällewerden jeweils eingegeben als
Die Wahrheitsausgabe ist eine aus Einsen gebildete Matrix. Falsy ist eine Matrix, die mindestens eine Null enthält.
Probieren Sie es online!
Erläuterung
Der Code reduziert zuerst die Eingabe-Ganzzahlen auf eindeutige, 1-basierte Ganzzahlwerte. Aus diesen Werten wird die Adjazenzmatrix generiert. Matrix multipliziert es mit sich selbst; und wandelt Werte ungleich Null in der Ergebnismatrix in Einsen um. Schließlich wird geprüft, ob kein Eintrag in der letzteren Matrix den in der Adjazenzmatrix überschreitet.
quelle
JavaScript (ES6),
69 bis67 Byte2 Bytes gespart dank einer Idee von @Cyoce. Es gab vier vorherige 69-Byte-Formulierungen:
quelle
.every
[e]
. Auch wenn die Zuweisung 8 Bytes kostet,e
sparen Sie dennoch ein Byte. Ich ging jedoch noch einen Schritt weiter, indem ich eine Abkürzung für machtea.every
, die ein zweites Byte sparte.Brachylog , 24 Bytes
Probieren Sie es online!
Erläuterung:
Mit anderen Worten, wenn die Eingabe Paare
[A:B]
und enthält[B:C]
, können wir zulassen, dass die Eingabe alle anderen Elemente setzt[A:B]
und[B:C]
am Anfang löscht und eine Liste erstellt[A:B:B:C]
. Dann kehren wir wahrheitsgemäß vom inneren Prädikat (Falsch aus dem gesamten Programm) zurück, wenn[A:C]
es nicht da ist.quelle
CJam (22 Bytes)
Online-Testsuite . Dies ist ein anonymer Block (eine Funktion), der die Elemente als Array mit zwei Ebenen verwendet. Die Testsuite führt jedoch eine Zeichenfolgenmanipulation durch, um die Eingabe zuerst in ein geeignetes Format zu bringen.
Präparation
quelle
Pyth, 14 Bytes
Testsuite
Das Eingabeformat wird erwartet
[[0, 0], [0, 1], ... ]
quelle
Mathematica, 49 Bytes
Reine Funktion, die eine Liste von Paaren benötigt. Wenn die Eingangsliste enthält
{a,b}
und ,{b,c}
aber nicht{a,c}
für einigea, b, c
, ersetzt sie durch0
. Wahrheit ist die Eingabeliste, falsch ist0
.quelle
C ++ 14, 140 Bytes
Als unbenanntes Lambda, das über den Referenzparameter zurückkehrt. Erfordert, dass seine Eingabe ein Container von ist
pair<int,int>
. Den langweiligen O (n ^ 3) -Ansatz wählen.Ungolfed und Nutzung:
quelle
Python 2 ,
916755 BytesProbieren Sie es online!
-24 Bytes dank Leaky Nun
-12 Bytes dank Bubbler
quelle
lambda x
auflambda s
.for
s.Axiom 103 Bytes
ungolfed:
die Übungen
quelle
Pyth -
2221 BytesTest Suite .
quelle
Clojure,
5653 BytesUpdate: Anstatt zu verwenden,
:when
überprüfe ich einfach, ob für alle Paare von[a b]
[c d]
entwederb != c
oder[a d]
aus dem Eingabesatz gefunden wird.Original:
Wow, Clojure für Schleifen ist cool: D Hiermit wird überprüft, ob die
for
Schleife keinen falschen Wert generiert, der auftritt, wenn er[a d]
nicht aus der Eingabemenge gefunden wird.Diese Eingabe muss aus zwei Elementen bestehen:
Wenn die Eingabe listenartig sein
(%[a d])
muss, muss sie durch((set %)[a d])
zusätzliche 6 Bytes ersetzt werden.quelle
Beide Lösungen sind unbenannte Funktionen, die eine Liste geordneter Paare als Eingabe und Rückgabe von
True
oder verwendenFalse
.Mathematica, 65 Bytes
#~Permutations~{2}]
Erstellt die Liste aller geordneten Paare von geordneten Paaren aus der Eingabe undJoin@@@
konvertiert diese in geordnete Vierfache. Diese werden dann von der Funktion bearbeitetIf[#2==#3,{#,#4},Nothing]&@@@
, die eine coole Eigenschaft hat: Wenn die beiden mittleren Elemente gleich sind, gibt sie das geordnete Paar zurück, das aus der ersten und der letzten Zahl besteht. AndernfallsNothing
wird ein spezielles Mathematica-Token zurückgegeben, das automatisch aus Listen verschwindet. Das Ergebnis ist also die Menge der geordneten Paare, die in der Eingabe enthalten sein müssen, damit sie transitiv sind.SubsetQ[#,...]
erkennt diese Eigenschaft.Mathematica, 70 Bytes
Table[...,{i,#},{j,#}]
Erstellt ein miti
und indiziertes 2D-Arrayj
, das direkt aus der Eingabe entnommen wird (daher sind beide geordnete Paare). Die Funktion dieser beiden Indizes lautetLast@i!=#&@@j||#~MemberQ~{#&@@i,Last@j}
: "Entweder stimmen das zweite Element voni
und das erste Element vonj
nicht überein, oder die Eingabe enthält das geordnete Paar, das aus dem ersten Element voni
und dem letzten Element von besteht.j
" Dadurch wird ein 2D-Array von Booleschen Werten erstellt, dasAnd@@And@@@
zu einem einzigen Booleschen Wert zusammengefasst wird .quelle
APL (NARS), 39 Zeichen, 78 Byte
Prüfung:
eine Sekunde 'Lösung' folgen Sie goto Möglichkeiten:
quelle
Common Lisp, 121 Bytes
Probieren Sie es online!
quelle