Herausforderung
Sie erhalten zwei unterschiedliche Bitfolgen gleicher Länge. (Zum Beispiel 000
und 111
.) Ihr Ziel ist es, einen Pfad von einem zum anderen zu finden, so dass:
- Bei jedem Schritt ändern Sie nur ein Bit (Sie gehen
000
zu einem001
,010
,100
). - Sie können dieselbe Bitfolge nicht zweimal besuchen.
- Der Pfad ist unter diesen Bedingungen so lang wie möglich.
Wenn wir zum Beispiel von 000
nach gehen 111
, können wir den Weg nehmen
000, 001, 011, 010, 110, 100, 101, 111
der alle 8-Bit-Strings der Länge 3 aufruft, muss also so lang wie möglich sein.
Regeln
- Es gelten Standardlücken.
- Sie können die Eingabe als zwei Folgen von Nullen und Einsen oder als zwei Arrays von Nullen und Einsen oder als zwei Arrays von Booleschen Werten verwenden.
- Sie können nicht die Eingabe als zwei ganzen Zahlen mit der rechten Binärdarstellung nehmen ( das Schreiben
000
und111
wie0
und7
sind nicht gültig). - Wenn Sie möchten, können Sie die Länge der Bitfolgen als Eingabe verwenden.
- Ihr Programm kann den Pfad ausgeben, indem es die jeweils besuchten Bitfolgen druckt oder ein Array der besuchten Bitfolgen zurückgibt (jeweils im gleichen Format wie die Eingabe).
- Ihre Ausgabe sollte den Anfang und das Ende des Pfads enthalten (dies sind Ihre Eingaben).
- Dies ist Code-Golf , der kürzeste Code in Bytes gewinnt.
Beispiele
0 1 -> 0, 1
10 01 -> 10, 00, 01 or 10, 11, 01
000 111 -> any of the following:
000, 100, 110, 010, 011, 001, 101, 111
000, 100, 101, 001, 011, 010, 110, 111
000, 010, 110, 100, 101, 001, 011, 111
000, 010, 011, 001, 101, 100, 110, 111
000, 001, 101, 100, 110, 010, 011, 111
000, 001, 011, 010, 110, 100, 101, 111
1001 1100 -> 1001, 0001, 0000, 0010, 0011, 0111, 0101, 0100, 0110, 1110, 1010, 1011, 1111, 1101, 1100 (other paths exist)
code-golf
binary
graph-theory
Mischa Lawrow
quelle
quelle
Antworten:
Schale ,
27 2624 BytesBrute Force, also sehr langsam. Probieren Sie es online!
Erläuterung
Schale liest natürlich von rechts nach links.
quelle
Mathematica, 108 Bytes
Eingang:
Ausgabe:
quelle
Mathematica, 175 Bytes
Schöne erste Frage!
Eingang
quelle
Haskell ,
212207 BytesDas ist wahrscheinlich viel zu lang, aber es funktioniert jetzt endlich. (Danke an @Lynn für den kartesischen Produkttrick !) Thansk @nimi für -5 Bytes!
Probieren Sie es online!
Erläuterung:
quelle
x<-mapM id$[1>0,1<0]<$b
[True,False]
? Wenn[False,True]
auch klappt, kannst du verwenden[0>1..]
.Bool
istEnum
, und ich habe vergessen , dass<$
verfügbar ist (zunächst versucht ,*>
die nicht in Prelude ist)!Mathematica
116114 BytesMit mehreren Bytes dank Mischa Lawrow gespeichert.
Eingabe (8 Dimensionen)
Ausgabe (Länge = 254, nach 1,82 Sekunden)
Tuples[{0,1},{l=Length@#}],{2}]
& generiert die Zahlen 0 ... 8 als Binärlisten.Das äußere
Tuples...{2}
erzeugt alle geordneten Paare dieser Binärzahlen.Plus@@x
summiert jedes der Paare und erzeugt Tripletts von 0, 1.Cases....Count[Plus@@x, 1]==1
Gibt alle Summen zurück, die eine einzelne 1 enthalten. Diese entstehen, wenn die beiden ursprünglichen Binärzahlen durch eine Flanke verbunden sind.Rules
verbindet die Eckpunkte des Graphen, wobei jeder Eckpunkt eine Binärzahl ist.Graph
Erstellt einen Graphen, der den Scheitelpunkten und Kanten entspricht.FindPath
findet bis zu 2 ^ n Pfade, die Scheitelpunkt a mit Scheitelpunkt b verbinden, die angegebenen Zahlen.Last
nimmt den längsten dieser Wege.Für drei Dimensionen kann das Diagramm wie hier gezeigt in einer Ebene dargestellt werden:
Für die Eingabe wird
{0,0,0}, {1,1,1}
Folgendes ausgegeben:{{{0, 0, 0}, {0, 0, 1}, {0, 1, 1}, {0, 1, 0}, {1, 1, 0}, {1, 0, 0}, {1, 0, 1}, {1, 1, 1}}}
Diesen Pfad finden Sie in der obigen Grafik.
Es kann auch als folgender Pfad im 3-Raum gedacht werden, wobei jeder Scheitelpunkt einem Punkt entspricht
{x,y,z}
. {0,0,0} repräsentiert den Ursprung und {1,1,1} repräsentiert den "entgegengesetzten" Punkt in einem Einheitswürfel.Der Lösungsweg entspricht also einem Durchlaufen von Kanten entlang des Einheitswürfels. In diesem Fall ist der Pfad ein Hamilton-Pfad: Er besucht jeden Scheitelpunkt einmal (dh ohne Kreuzungen und ohne ausgelassene Scheitelpunkte).
quelle
2^(l+2)
in Ihrem Code?Haskell ,
141123 BytesVerwendet Listen mit ganzen Zahlen. Probieren Sie es online!
Erläuterung
Die Hauptfunktion ist
!
und die Hilfsfunktionen sind#
undc
. Gibt bei einer gegebenen Liste von Bitsc
alle möglichen Möglichkeiten zum Umdrehen einer von ihnen an, z[0,1,1] -> [[1,1,1],[0,0,1],[0,1,0]]
.Die Funktion
#
nimmt eine Liste von Listen (der "Speicher") und eine Liste (die "anfängliche Bitfolge"). Es werden alle Hypercube-Pfade erstellt, die mit dem Anfangselement beginnen, nur unterschiedliche Bitstrings enthalten und die Strings im Speicher nicht betreten.Die Hauptfunktion
!
verbindet alles miteinander. Ein Trick , den ich hier verwenden istp*>x
(x
wiederholtelength p
mal) stattlength p
. Da längere Wiederholungenx
später in die natürliche Reihenfolge der Listen kommen,maximum
wählt man in beiden Fällen den längsten Pfad, da die ersten Koordinaten der Paare vor den zweiten verglichen werden.quelle
Jelly ,
2527 Bytes+2 Bytes, um einen Fehler beim Golfen zu beheben :( Hoffentlich finde ich aber einen kürzeren Weg.
Ein vollständiges Programm, das die Bit-Strings mit
1
und2
* als Listen verwendet. Die Argumente sindfrom
undto
. Das Programm druckt eine Liste von Listen derselben.*
0
und1
können stattdessen auf Kosten eines Bytes verwendet werden (’
zwischenL2ṗ
undŒ!ç€...
zu dekrementieren).Probieren Sie es online!
Wie?
Aktualisierung...
quelle
[1,1]
und[2,2]
eine Ausgabe von,[[1, 1], [2, 1], [1, 2], [2, 2]]
wenn ich es online versuche, was kein gültiger Pfad ist.