Wyzwanie
Otrzymujesz dwa różne ciągi bitów o tej samej długości. (Na przykład 000
i 111
.) Twoim celem jest znalezienie ścieżki od jednego do drugiego, który:
- Na każdym kroku należy zmienić tylko jeden bit (można przejść od
000
jednego z001
,010
,100
). - Nie można dwukrotnie odwiedzić tego samego ciągu bitów.
- Ścieżka jest tak długa, jak to możliwe, zgodnie z tymi ograniczeniami.
Na przykład, przechodząc od 000
do 111
, możemy obrać ścieżkę
000, 001, 011, 010, 110, 100, 101, 111
który odwiedza wszystkie 8 łańcuchów bitów o długości 3, więc musi być jak najdłuższy.
Zasady
- Obowiązują standardowe luki.
- Możesz wziąć dane wejściowe jako dwa ciągi zer i jedynek lub jako dwie tablice zer i jedynek lub jako dwie tablice wartości boolowskich.
- Możesz nie mieć wkład w postaci dwóch liczb całkowitych z prawej reprezentacji binarnej (pisanie
000
i111
tak0
i7
nie jest ważna). - Jeśli chcesz, możesz wziąć długość bitów jako dane wejściowe.
- Twój program może wypisać ścieżkę, drukując ciągi bitów odwiedzane pojedynczo lub zwracając tablicę odwiedzonych ciągów bitów (każdy w tym samym formacie co dane wejściowe).
- Twój wynik powinien zawierać początek i koniec ścieżki (które są twoimi danymi wejściowymi).
- To jest code-golf , wygrywa najkrótszy kod w bajtach.
Przykłady
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
Misza Ławrow
źródło
źródło
Odpowiedzi:
Łuska ,
27 2624 bajtówBrutalna siła, bardzo wolna. Wypróbuj online!
Wyjaśnienie
Łuska czyta naturalnie od prawej do lewej.
źródło
Mathematica, 108 bajtów
Wejście:
Wynik:
źródło
Mathematica, 175 bajtów
Ładne pierwsze pytanie!
Wejście
źródło
Haskell ,
212207 bajtówTo chyba zbyt długo, ale w końcu działa teraz. (Dzięki @Lynn za sztuczkę kartezjańską !) Thansk @nimi za -5 bajtów!
Wypróbuj online!
Wyjaśnienie:
źródło
x<-mapM id$[1>0,1<0]<$b
[True,False]
? Jeśli[False,True]
również działa, możesz użyć[0>1..]
.Bool
jestEnum
, i zapomniałem, że<$
jest dostępny (po raz pierwszy wypróbowany,*>
którego nie ma w Preludium)!Mathematica
116114 bajtówZ kilkoma bajtami zaoszczędzonymi dzięki Miszy Ławrowowi.
Wejście (8 wymiarów)
Wyjście (długość = 254, po 1,82 sekundach)
Tuples[{0,1},{l=Length@#}],{2}]
i generuje liczby 0 ... 8 jako listy binarne.Zewnętrzne
Tuples...{2}
tworzy wszystkie uporządkowane pary tych liczb binarnych.Plus@@x
sumuje każdą z par, generując trojaczki 0, 1.Cases....Count[Plus@@x, 1]==1
zwraca wszystkie sumy zawierające pojedynczą 1. Powstają, gdy dwie oryginalne liczby binarne są połączone krawędzią.Rules
łączy wierzchołki wykresu, przy czym każdy wierzchołek jest liczbą binarną.Graph
tworzy wykres odpowiadający wspomnianym wierzchołkom i krawędziom.FindPath
znajduje do 2 ^ n ścieżek łączących wierzchołek a z wierzchołkiem b, podane liczby.Last
bierze najdłuższą z tych ścieżek.Dla trzech wymiarów wykres można przedstawić w płaszczyźnie, jak pokazano tutaj:
Dla danych wejściowych
{0,0,0}, {1,1,1}
wyprowadzane są następujące dane:{{{0, 0, 0}, {0, 0, 1}, {0, 1, 1}, {0, 1, 0}, {1, 1, 0}, {1, 0, 0}, {1, 0, 1}, {1, 1, 1}}}
Ścieżkę tę można znaleźć na powyższym wykresie.
Może być również pomyślany jako następująca ścieżka w 3-przestrzeni, gdzie każdy wierzchołek odpowiada punktowi
{x,y,z}
. {0,0,0} reprezentuje początek, a {1,1,1} reprezentuje „przeciwny” punkt w sześcianie jednostkowym.Zatem ścieżka rozwiązania odpowiada przesunięciu krawędzi wzdłuż kostki jednostkowej. W tym przypadku ścieżka jest hamiltonowska: odwiedza każdy wierzchołek jeden raz (tzn. Bez skrzyżowań i pominiętych wierzchołków).
źródło
2^(l+2)
w twoim kodzie?Haskell ,
141123 bajtówUżywa list liczb całkowitych. Wypróbuj online!
Wyjaśnienie
Główną funkcją jest
!
, a funkcjami pomocniczymi są#
ic
. Podana lista bitówc
daje wszystkie możliwe sposoby odwrócenia jednego z nich, np[0,1,1] -> [[1,1,1],[0,0,1],[0,1,0]]
.Funkcja
#
przyjmuje listę list („pamięć”) i listę („początkowy ciąg bitów”). Konstruuje wszystkie ścieżki hipersześcianu, które zaczynają się od elementu początkowego, zawierają tylko wyraźne ciągi bitów i nie nadepną na ciągi w pamięci.Główna funkcja
!
wiąże to wszystko razem. Trik, którego tu używam, top*>x
(x
powtarzanelength p
razy) zamiastlength p
. Ponieważ dłuższe powtórzeniax
pojawiają się później w naturalnym uporządkowaniu list,maximum
wybiera najdłuższą ścieżkę w obu przypadkach, ponieważ pierwsze współrzędne par są porównywane przed drugimi.źródło
Galaretka ,
2527 bajtów+2 bajty, aby naprawić błąd podczas gry w golfa :( mam nadzieję, że znajdę krótszą drogę.
Pełny program przyjmujący ciągi bitów za pomocą
1
i2
* jako list. Argumentami sąfrom
ito
. Program drukuje listę tego samego.*
0
i1
może być używany zamiast tego kosztem bajtu (dodaj’
pomiędzyL2ṗ
iŒ!ç€...
do zmniejszenia).Wypróbuj online!
W jaki sposób?
aktualizuję ...
źródło
[1,1]
i wyniki[2,2]
generowane przez program[[1, 1], [2, 1], [1, 2], [2, 2]]
Try Try Online nie są prawidłową ścieżką.