Aby dowiedzieć się, czym jest wieża w Hanoi, skorzystaj z Google lub zajrzyj na stronę Wikipedii .
Twój kod powinien być w stanie zrobić 2 rzeczy, a są to:
- Zaakceptuj dane wprowadzone przez użytkownika, które określają liczbę dysków w punkcie początkowym wieży Hanoi
- Twórz dane wyjściowe w wybrany przez siebie sposób (o ile jest to logiczne), aby pokazać rozwiązanie łamigłówki typu tower.
Przykład logicznego wyjścia może wyglądać następująco (przy użyciu startu na 4 dyski):
L1L2C1L1R-2R-1L1L2C1C-1R-2C1L1L2C1
L
reprezentuje lewy kołek, C
reprezentuje środkowy kołek i R
reprezentuje prawy kołek, a liczby oznaczają, jak daleko przesunąć dysk na tym kołku i w jakim kierunku. Liczby dodatnie oznaczają liczbę kołków przesuwających się w kierunku skrajnie prawego kołka (ponieważ dyski zaczynają się od skrajnego lewego kołka).
Te zasady Tower of Hanoi są proste:
- Jednocześnie można przenosić tylko jeden dysk.
- Każdy ruch polega na wzięciu górnego dysku z jednego z kołków i zsunięciu go na inny kołek, na inne dyski, które mogą już znajdować się na tym kołku.
- Żaden dysk nie może być umieszczony na mniejszym dysku.
Dyski zaczynają się od skrajnie lewego kołka, największego na dole, oczywiście najmniejszego na górze.
Odpowiedzi:
Łuska , 5 bajtów
Wypróbuj online!
Każde
n
wyjście reprezentuje przenoszenie dyskun
na następny dostępny kołek (cykliczne owijanie).Wyjaśnienie
źródło
Python, 76 znaków
Na przykład dla N = 3 zwraca:
źródło
Perl - 54 znaki
Uruchom
perl -M5.010
i wprowadź liczbę dysków na standardowym wejściu.Format wyjściowy:
Jedna linia na ruch, pierwsza cyfra to peg, druga cyfra to peg (od 0)
Przykład:
źródło
$x=--$_&-$_,say(($_-$x)%3,($_+$x)%3)for 2..1<<<>
GolfScript (
31 2524 znaków)Z podziękowaniami dla Ilmari Karonen za wskazanie, że moje oryginalne
tr
s / permutacje można skrócić o 6 znaków. Rozkładając je jako produkt dwóch permutacji, udało mi się uratować jeszcze jedną.Zauważ, że biorąc pod uwagę
3%
wzrost długości o jeden znak:Niektóre osoby mają naprawdę skomplikowane formaty wyjściowe. To powoduje, że kołek został przeniesiony z (ponumerowane 0, 1, 2) i kołek został przeniesiony do. Specyfikacja nie mówi, do którego kołka się przenieść, więc przechodzi do kołka 1.
Na przykład
źródło
])~{.{3^3%}%2,@{2\-}%++}*
Perl, 75
79znakówCałkowite kradzież formatu wyjściowego Keitha Randalla:
Wywołaj
-M5.010
za pomocą dlasay
.(Myślę, że można to poprawić, jeśli można znaleźć sposób wykorzystania wartości zwracanej przez funkcję zamiast po prostu ją tłumić.)
źródło
say
”]SML, 63
funkcja połączenia
f(n,s,t)
z:źródło
Bash (64 znaki)
Publikowanie tego, mimo że jest ponad dwa razy dłuższe niż w GolfScript, ponieważ lubię to,
t
aby służyć jakoecho $s
.źródło
Scala,
928887 znakówFormat wyjściowy
Powiedz liczbę dysków = 3,
źródło
C,
989287 znakówImplementuje najbardziej trywialny algorytm.
Dane wyjściowe mają postać, w
ab ab ab
której każda para oznacza „przenieś górną płytę z kołka a na kołek b”.EDYCJA : Ruchy są teraz zakodowane w postaci szesnastkowej - 0x12 oznacza przejście z kołka 1 do kołka 2. Zapisano niektóre znaki.
EDYCJA : Czyta liczbę ze standardowego wejścia zamiast parametru. Krótszy
Przykład:
% echo 3 | ./hanoi
13 12 32 13 21 23 13
źródło
h(x,printf(...))
jest po prostu sposobem, aby zadzwonićprintf
przedh
wywołaniem. Ostatnin++
powstaje po wewnętrznychh
powrotach. Służy do cofania inicjałun--
.;
to tutaj będzie tak samo.,
jest często przydatny (np.if(x)a,b;
zastępujeif(x){a;b;}
), ale nie ma tu żadnej przewagi.Galaretka , 5 bajtów
Wypróbuj online!
0
przenieś najmniejszy dysk o jedno miejsce w prawo (w razie potrzeby wracając do początku)1
przenieś drugi najmniejszy dysk do jedynej legalnej kolumny2
przenieś trzeci najmniejszy dysk do jedynej legalnej kolumnyitp.
Algorytm
Rekurencyjnie widzimy rozwiązanie problemu Towers of Hanoi; przenieść stos wielkości n z A do B , przenoszenie stosu wielkości n -1 od A do C , to dysk o rozmiarze n z A do B , a następnie przemieszczać stos wielkości n -1 od B do C . Spowoduje to utworzenie wzoru o następującej formie (w formacie wyjściowym używanym przez ten program):
Możemy zauważyć, że ta sekwencja to A007814 w OEIS. Inną możliwą definicją sekwencji jest „ k- ty (oparty na 1) elementem sekwencji jest liczba zer na końcu liczby k, gdy jest zapisana binarnie”. I właśnie to oblicza program.
Wyjaśnienie
Najpierw obliczamy liczbę ruchów w rozwiązaniu, 2 n -1. Okazuje się, że najkrótsze jest obliczenie jednego dodatkowego ruchu i odrzucenie go później, więc jest to
2*
np. 2 do siły czegoś. (Jedyne dane, które do tej pory przyjęliśmy, to argument wiersza poleceń, więc domyślnie jest używany)Następnie używamy wbudowanego Jelly do obliczania liczby zer na końcu liczby w bazie b ; To . Ponieważ obliczamy binarnie, tak jest . Wszystko, co musimy zrobić, to zastosować to wbudowane do liczb od 1 do 2 n -1 włącznie.
ọb
ọ2
Istnieją dwa proste sposoby iteracyjne nad zakresu liczb w galarecie,
€
aR
, a moje wcześniejsze próby tego problemu stosować jedną z nich. Jednak w tym przypadku możliwe jest nieco krótsze:Ṗ
podanie liczby jako wartości wejściowej pozwoli ci wykonać iterację, która zatrzymuje jeden element na krótko (ogólnie rzecz biorąc,Ṗ
jest wbudowanym narzędziem do przetwarzania wszystkich elementów oprócz jednego). To jest dokładnie to, co chcemy w tym przypadku (bo2*
generuje zbyt wielu elments), więc używając go do linku2*
iọ2
do2*Ṗọ2
daje nam rozwiązanie 5-bajtowy problemu.źródło
Awk, 72 znaki
Format wyjściowy jest taki sam jak w przypadku Keitha Randalla .
źródło
Skrypt Bash,
10096 znakówFormat wyjściowy jest taki sam jak w przypadku Keitha Randalla .
Edit : Saved 4 znaków przez peter komentarzu „s.
źródło
$@
J, 23 bajty
rozwiązanie liczb binarnych
To rozwiązanie wykorzystuje metodę zliczania binarnego opisaną w tym filmie .
Oznacza to, że generuję cyfry binarne od
1
do2^n
, a następnie biorę przyrostki o długości 2 i porównuję każdy bit z odpowiednim bitem z poprzedniej liczby i sprawdzam, czy są one nierówne. Liczba nierównych bitów stanowi wynik tego ruchu.Dane wyjściowe, np. Dla 3 dysków, gdzie najmniejszy dysk jest oznaczony jako 1:
1
oznacza „przenieś najmniejszy dysk o jeden kołek w prawo, w razie potrzeby zapętlając z powrotem do pierwszego kołka”n
, dla wszystkich innychn
, oznacza „przenieś dyskn
do legalnego kołka” (zawsze będzie dokładnie jeden)Wypróbuj online!
rozwiązanie rekurencyjne
Taki sam wynik jak w powyższym rozwiązaniu, ale logika tutaj sprawia, że problem rekurencyjny jest wyraźniejszy.
Wizualizacja go jako drzewa podkreśla również ten punkt:
Wypróbuj online!
źródło
APL (Dyalog Classic) , 19 bajtów
Wypróbuj online!
wyjście to macierz 2-kolumnowa liczb całkowitych w {0,1,2} - od kołka do kołka
źródło
K (ngn / k) , 23 bajty
Wypróbuj online!
źródło
R , 73 bajty
Umieszczenie R na mapie. Zainspirowany [odpowiedzią Keitha Randalla] [1] z uproszczonym wprowadzaniem, drukuj tylko koniec i uruchom peg, aby zapisać 2 bajty. Również kołki 0-indeksowane.
Wypróbuj online!
źródło
JavaScript (ES6), 45b
np. wywołanie
h(4, 'A', 'B', 'C')
(przenieś 4 dyski z kołka A na kołek C za pomocą kołka pomocniczego B)zwraca
'ABACBCABCACBABACBCBACABCABACBC'
(przenieś płytę z kołka A na kołek B, przenieś płytę ze kołka A na kołek C, przenieś płytę ze kołka B na kołek C itp.)źródło