In dieser Herausforderung besteht Ihre Aufgabe darin, aus einer Folge von Anweisungen ein ungerichtetes Diagramm zu erstellen. Es gibt eine Direktive für jede nichtnegative Ganzzahl und jede transformiert einen gegebenen Graphen in einen neuen.
- Anweisung
0
: Fügen Sie einen neuen getrennten Knoten hinzu. - Anweisung
1
: Fügen Sie einen neuen Knoten hinzu und verbinden Sie ihn mit jedem vorhandenen Knoten. - Richtlinie
m > 1
: Entfernen Sie alle Knoten, deren Grad (Anzahl der Nachbarn) durch teilbar istm
. Beachten Sie, dass dies0
durch alle teilbar istm
, sodass nicht verbundene Knoten immer entfernt werden.
Die Anweisungen werden nacheinander von links nach rechts angewendet, beginnend mit dem leeren Diagramm. Zum Beispiel wird die Sequenz [0,1,0,1,0,1,3]
wie folgt verarbeitet und mit großartiger ASCII-Grafik erklärt. Wir beginnen mit dem leeren Diagramm und fügen einen einzelnen Scheitelpunkt hinzu, wie von 0
:
a
Dann wird eine weitere Eckpunkt hinzuzufügen und es an die erste Verbindung, wie angewiesen durch 1
:
a--b
Wir fügen einen weiteren getrennten Vertex und dann einen verbundenen hinzu, wie von 0
und angewiesen 1
:
a--b c
\ \ /
`--d
Wir wiederholen dies noch einmal nach Anweisung von 0
und 1
:
,--f--e
/ /|\
a--b | c
\ \|/
`--d
Zum Schluss entfernen wir die Eckpunkte des 3. Grades a
und b
, wie von 3
:
f--e
|\
| c
|/
d
Dies ist der durch die Sequenz definierte Graph [0,1,0,1,0,1,3]
.
Eingang
Eine Liste nichtnegativer Ganzzahlen, die eine Folge von Anweisungen darstellen.
Ausgabe
Die Anzahl der durch die Sequenz definierten Knoten im Diagramm.
Testfälle
[] -> 0
[5] -> 0
[0,0,0,11] -> 0
[0,1,0,1,0,1,3] -> 4
[0,0,0,1,1,1] -> 6
[0,0,1,1,0,0,1,1,2,5,7,0,1] -> 6
[0,0,1,1,1,1,5,1,4,3,1,0,0,0,1,2] -> 6
[0,0,1,1,0,0,1,1,5,2,3,0,0,1,1,0,0,1,1,3,4,0,0,1,1,2,1,1] -> 8
[0,0,1,1,0,0,1,1,2,5,7,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,8] -> 14
Detaillierte Regeln
Sie können eine Funktion oder ein vollständiges Programm schreiben. Die kürzeste Byteanzahl gewinnt. Standardlücken sind nicht zulässig. Bitte erläutern Sie Ihren Algorithmus in Ihrer Antwort.
Es ist eine Woche vergangen, deshalb habe ich die kürzeste Antwort akzeptiert. Wenn später eine noch kürzere erscheint, aktualisiere ich meine Auswahl. Eine lobende Erwähnung geht an Peter Taylors Antwort , auf der mehrere andere basierten, einschließlich des Gewinners.
quelle
Antworten:
Pyth ,
3731Diese Lösung verwendet eine Reduktionsfunktion (
u
), um eine Liste zu erstellen, wobei jeder Eintrag einem in der Liste verbleibenden Knoten entspricht und der Wert des Eintrags damit übereinstimmt, ob der Knoten ursprünglich unter der Direktive 0 oder 1 hinzugefügt wurde.G
ist die Akkumulatorvariable in der Reduktionsfunktion und enthält die oben genannte Liste. Es wird auf die leere Liste initialisiertY
.H
Nimmt den Wert jedes MitgliedsQ
der Eingabe nacheinander. Das Ergebnis des Ausdrucks wirdG
jedes Mal zugewiesen , und der nächste Eintrag vonQ
wird zugewiesenH
, und der Ausdruck wird erneut ausgeführt.Für eine
G
ordnungsgemäße Aktualisierung gibt es zwei Möglichkeiten, eine für Direktive 0 oder 1 und eine für die anderen Direktiven. Diese Fälle unterscheiden sich mit dem ternären? ... <H2 ...
Wenn
H
0 oder 1 ist, dann werden alle brauchen wir ist append zu tunH
zuG
.+GH
erreicht dies.Andernfalls müssen Sie zunächst für jeden Knoten im Diagramm ermitteln, wie viele Nachbarn er hat. Dies erfolgt in zwei Schritten:
Zuerst
s>GT
zählt die Anzahl der Knoten , an oder nach dem Eingangsknoten , die 1s ist. Diese sind alle mit dem Eingangsknoten verbunden, außer dass wir um 1 überzählen, wenn der Eingangsknoten eine 1 ist.Zweitens benötigen wir die Anzahl der Knoten, die früher als der damit verbundene Eingangsknoten sind. Dies ist 0, wenn der Eingabeknoten eine 0 ist, und der Index des Eingabeknotens
T
, wenn der Eingabeknoten eine 1 ist. Dieser Wert würde gegeben sein durch*@GTT
. Es gibt jedoch immer noch die Überzählung aus dem ersten Abschnitt, die korrigiert werden muss. Daher berechnen wir*@GTtT
stattdessen, was 1 weniger ist, wenn der Eingabeknoten eine 1 ist. Diese Werte werden summiert, um die Anzahl der mit dem Eingabeknoten verbundenen Knoten zu erhalten.% ... H
will give 0 ist, dass die Zahl durch teilbarH
ist und daher entfernt werden sollte, andernfalls wird sie nicht 0 ergeben.f ... UG
gibt also die Indizes der Eingabe an, die nicht entfernt werden sollten, daf
es sich um einen Filter handelt und 0 falsch ist.m@Gd
konvertiert diese Indizes in die Nullen und Einsen der entsprechenden Knoten.Schließlich wird, sobald die resultierende Liste der mit 0 und 1 bezeichneten Knoten gefunden ist, ihre Länge berechnet (
l
) und gedruckt (implizit).Breite Idee dank @PeterTaylor.
quelle
GolfScript (53 Bytes)
Online-Demo
Ich habe noch nicht wirklich Golf gespielt, aber ich habe festgestellt, dass es nicht sehr einfach ist, die Variablen
H
und zu eliminierenT
, so dass dies ein lokales Minimum sein könnte.Übernimmt die Eingabe von stdin im Format
[0 1 2 3]
. Lässt die Ausgabe auf stdout.Ungolfed:
quelle
CJam,
129 75 73 68 61 4642 BytesLösung basierend auf Peters Algorithmus:
Code-Erweiterung folgt.
Vorherige Lösung (61 Bytes):
Nimmt Eingaben von STDIN wie:
Ausgang ist die Nummer auf STDOUT:
Algorithmus :
U
die ID des hinzuzufügenden Knotens speichert.0
, fügen Sie[U]
eine Liste mit Listen hinzu1
, fügen SieU
zu jeder Liste in der Liste der Listen eine weitere Liste hinzu, die aus dem ersten Element jeder Liste der Listen und bestehtU
length - 1
teilbaren Listen herausm
und notiere weiterhin das erste Element dieser Listen. Nach dem Filtern entferne ich alle entfernten IDs aus der verbleibenden Liste der IDs.Code-Erweiterung :
Probieren Sie es hier aus
quelle
Pyth,
888075 ZeichenIch bin fertig. Vielleicht hat jemand anderes ein paar Golftipps.
Y
ist die Adjazenzliste des Graphen. Aus Golfgründen behalte ich auch nach dem Löschen des Knotens einen Knoten in dieser Liste (ansonsten müsste ich alle Indizes aktualisieren). Jeder Knoten hat sich als Nachbarn. Die ListeJ
verfolgt die gelöschten Knoten.Ich zeige die Änderungen der Adjazenzliste an der Beispieleingabe
[0,1,0,1,0,1,3]
:Der Algorithmus ist dann ziemlich einfach: Iteriere über alle Eingaben, wenn Eingabe == 0: füge einen neuen Knoten mit sich selbst als Nachbarn hinzu, wenn Eingabe == 1: füge einen neuen Knoten mit allen Knoten als Nachbarn hinzu (auch die gelöschten) und füge hinzu dieser Knoten zur Adjazenzliste aller Knoten, wenn Eingabe> 1: Ermitteln Sie die Knoten mit # Nachbar-1% Eingabe == 0 und fügen Sie sie hinzu
J
, um jeweils die Nachbarn jedes Knotens mit zu aktualisierenJ
. Am Ende drucken Sie die Länge vonY
minus der Länge von (der Menge von)J
.Verwendung
Rufen Sie einfach das Skript auf und geben Sie eine Eingabe
[0,1,0,1,0,1,3]
oder einen anderen Testfall ein.quelle
APL,
716555 Zeichen{⍬≡⍺:≢⍵⋄r←1↓⍺⋄1<c←⊃⍺:r∇i⌿⍵/⍨i←0≠c|+/⍵⋄c:r∇∨⌿↑a(⍉a←⍵,1)⋄r∇0,0⍪⍵}∘(0 0⍴0)
{⍺←0 0⍴0⋄⍬≡⍵:≢⍺⋄(⍺{1<⍵:i⌿⍺/⍨i←×⍵|+/⍺⋄⍵:-⌿↑(1,1⍪⍺)1⋄0,0⍪⍺}⊃⍵)∇1↓⍵}
{g←0 0⍴0⋄(≢g)⊣{1<⍵:g⌿⍨←g/⍨←×⍵|+/g⋄(⊃g)-←g⍪⍨←g,⍨←⍵}¨2,⍵}
Das Diagramm wird als boolesche Adjazenzmatrix dargestellt. Zeilen / Spalten werden nach Bedarf hinzugefügt und entfernt.
quelle
Python 2, 296
Jeder Knoten erhält eine eindeutige ID und die Nachbar-IDs jedes Knotens werden aufgezeichnet. Wenn die Direktive 0 ist, wird eine leere Nachbarliste für den neuen Knoten hinzugefügt. Wenn die Direktive 1 ist, werden die IDs aller vorhandenen Knoten zur Nachbarliste für den neuen Knoten, und alle anderen Nachbarlisten werden aktualisiert, um die neue Knoten-ID aufzunehmen. Für m> 1 werden Knoten mit Nachbarlisten, die ein Vielfaches von m sind, aus der Knotenliste und allen Nachbarlisten entfernt. Vielen Dank an @Optimizer für das Erkennen eines Fehlers in einer früheren Version.
quelle
NetLogo, 160
Die Implementierung ist unkompliziert, da jedes Symbol gelesen und die entsprechende Aktion ausgeführt wird.
Sie können von der Befehlszeile aus als ausführen
f[0 0 1 1 0 0 1 1 2 5 7 0 1]
.quelle
Ruby
159157 ( Demo )Dies definiert eine Funktion, die
G
mit der Stabby-Lambda-Syntax aufgerufen wird . Verwenden SieG[[0, 1]]
, um es mit den Befehlen0
und aufzurufen1
.Die Implementierung ist ziemlich einfach: Es gibt eine
Node
Struktur (N
oben genannt), die über diel
Eigenschaft Verweise auf alle verknüpften Knoten enthält .G
Erstellt Knoten nach Bedarf und bearbeitet deren Verknüpfungen. Eine lesbare Version finden Sie hier .quelle
CJam,
9997 BytesHier gibt es noch viel zu golfen. Der Algorithmus basiert auf dem Verfolgen der Adjazenzmatrix, aber das Darstellen der leeren Matrix, ohne sie speziell behandeln zu müssen, bereitet mir Kopfschmerzen.
Teste es hier.
Die Eingabe ist ein Array im CJam-Stil:
Mit diesem Testgeschirr können Sie alle Tests ausführen:
quelle
Python 2, 174
Damit kann wohl noch viel gespielt werden.
Ich habe ein Wörterbuch benutzt
g
, um die Grafik darzustellen. Die Knoten sind durch Zahlen gekennzeichnet und werden der Menge benachbarter Knoten zugeordnet. Dies bedeutet, dass jede Aktualisierung einer Kante an beiden Endpunkten ausgeführt werden muss.Neue Knotenindizes werden durch Hochzählen erstellt
n
. Jedes Mal erstelle ich einen neuen leeren Knotenn
. Für das Kommando0
bleibt es nur. Für den Befehl1
ist er über mit dem anderen Knoten verbundeng[i]^={n};g[n]^={i}
. Verwenden von xoder machen es so, dass der Knoten nicht mit sich selbst verbunden ist. Bei Befehlen> 1 wird es sofort gelöscht.Das Filtern von Knoten, deren Grad ein Vielfaches ist, wird durchgeführt, indem zuerst Knoten gefunden werden, die übrig bleiben (
h
), dannand
die Liste der Knoten und die Nachbarn jedes Knotens ermittelt werden.Schließlich ist die Anzahl der Einträge im Diagrammwörterbuch die Antwort.
quelle
Mathematica, 223 Bytes
Wow, das war länger als ich erwartet hatte.
Verwendung:
Hier sind die Ergebnisse aus den Testfällen:
Weniger golfen:
Die Art und Weise, wie dies funktioniert, ist die Darstellung des Diagramms als Liste von "Listen von Nachbarn".
Für die 0- Direktive füge ich einfach eine leere Liste an.
Für die Direktive 1 hänge ich eine Liste aller vorherigen Knoten an und füge den neuen Knoten allen vorherigen Knoten hinzu.
Bei einer Direktive > 1 habe ich die angegebenen Knoten entfernt und den Rest aktualisiert.
quelle