Einführung
In dieser Herausforderung erhalten Sie einen gerichteten Graphen mit Selbstschleifen. Ihre Aufgabe besteht darin, ihn in einen ungerichteten Graphen ohne Selbstschleifen umzuwandeln.
Eingang
Ihre Eingabe ist ein gerichteter Graph, bei dem der Scheitelpunkt {0, 1, ..., n-1}
für eine natürliche Zahl festgelegt ist n ≥ 0
(oder {1, 2, ..., n}
wenn Sie eine 1-basierte Indizierung verwenden). Der Graph wird als längs- gegeben n
Liste , L
wo Sie L[i]
eine Liste der out-Nachbarn von Vertex i
. Die Liste [[0,1],[0],[1,0,3],[]]
repräsentiert beispielsweise das Diagramm
.-.
| v
'-0<--2-->3
^ |
| |
v |
1<--'
Beachten Sie, dass die Nachbarlisten nicht unbedingt geordnet sind, aber garantiert keine Duplikate enthalten.
Ausgabe
Ihre Ausgabe ist ein anderes Diagramm im gleichen Format wie die Eingabe, das wie folgt daraus erhalten wird.
- Löschen Sie alle Self-Loops.
- Fügen Sie für jede verbleibende Kante
u -> v
die umgekehrte Kante hinzu,v -> u
falls diese noch nicht vorhanden ist.
Wie bei der Eingabe sind die Nachbarlisten des Ausgabediagramms möglicherweise ungeordnet, dürfen jedoch keine Duplikate enthalten. Für das obige Diagramm wäre eine korrekte Ausgabe [[1,2],[0,2],[0,1,3],[2]]
, die das Diagramm darstellt
0<->2<->3
^ ^
| |
v |
1<--'
Regeln
In den Diagrammen können Sie 0-basierte oder 1-basierte Indizierung verwenden. Beide Funktionen und vollständige Programme sind akzeptabel. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Testfälle
Diese Testfälle verwenden eine 0-basierte Indizierung. Inkrementieren Sie jede Zahl im 1-basierten Fall. Diese Nachbarlisten werden in aufsteigender Reihenfolge sortiert, sind jedoch nicht erforderlich.
[] -> []
[[0]] -> [[]]
[[],[0,1]] -> [[1],[0]]
[[0,1],[]] -> [[1],[0]]
[[0,1],[0],[1,0,3],[]] -> [[1,2],[0,2],[0,1,3],[2]]
[[3],[],[5],[3],[1,3],[4]] -> [[3],[4],[5],[0,4],[1,3,5],[2,4]]
[[0,1],[6],[],[3],[3],[1],[4,2]] -> [[1],[0,5,6],[6],[4],[3,6],[1],[1,2,4]]
[[6],[0,5,1],[5,4],[3,5],[4],[5,6],[0,3]] -> [[1,6],[0,5],[4,5],[5,6],[2],[1,2,3,6],[0,3,5]]
[[1,0],[5,1],[5],[1],[5,7],[7,1],[],[1]] -> [[1],[0,3,5,7],[5],[1],[5,7],[1,2,4,7],[],[1,4,5]]
[[2,8,0,9],[5,2,3,4],[0,2],[3,7,4],[8,1,2],[5,1,9,2],[6,9],[6,5,2,9,0],[9,1,2,0],[3,9]] -> [[2,7,8,9],[2,3,4,5,8],[0,1,4,5,7,8],[1,4,7,9],[1,2,3,8],[1,2,7,9],[7,9],[0,2,3,5,6,9],[0,1,2,4,9],[0,3,5,6,7,8]]
.e
wurde gerade vonk,Y
auf umgestelltk,b
, also benutze.e-.|f}k@QTUQbkQ
CJam,
4340353433 Bytes2 Bytes von Sp3000 gespeichert.
Dies begann als eine wirklich elegante Lösung und wurde dann immer schrecklicher, als ich versuchte, einige von mir übersehene Löcher zu flicken. Ich bin mir noch nicht sicher, ob die ursprüngliche Idee noch zu retten ist, aber ich werde mein Bestes geben ...
Teste es hier. Alternativ können Sie auch das gesamte Testkabel ausführen .
Ich werde eine Erklärung hinzufügen, sobald ich sicher bin, dass der Patient tot ist.
quelle
Python 2, 107 Bytes
Ich versuche immer noch herauszufinden, ob ich mehr Golf spielen kann, aber im Moment ist dies das Beste, was ich tun kann.
Ich benutze Sets, um Duplikate zu vermeiden. Im Gegensatz dazu
list.remove(i)
wird{S}-{i}
auch kein Fehler ausgegeben, wenni
nicht vorhandenS
.quelle
Ruby, 78 Bytes
Zum Schluss noch etwas Verwendung für die Mengenoperatoren (
[1,2]&[2]==[2]
und[3,4,5]-[4]==[3,5]
) von Ruby .ideone , einschließlich aller Testfälle, die es besteht.
quelle
CJam, 26 Bytes
Nicht sehr kurz ...
Erläuterung
quelle
JavaScript (ES6), 96
110Erstellen von Adjazenzsätzen aus der Adjazenzliste, um Duplikate zu vermeiden. Ad last erstellt die Listen neu, beginnend mit den Sätzen.
quelle
Java, 150
Erweiterter, lauffähiger Code:
quelle
Groovy - 87
Vollständiges Skript zum Ausführen von Tests:
quelle
Mathematica,
846664 Bytes1-basierte Indizierung verwenden.
quelle
Python 3, 127 Bytes
Versuchen Sie es online
Nicht mein bester Versuch ...
quelle