To powszechna łamigłówka, którą wielu z was rozwiązało ręcznie. Teraz nadszedł czas, aby napisać algorytm, aby rozwiązać to samo.
Są równe liczby drążków dopasowanych ustawionych w dwóch różnych bokach naprzeciwko siebie. Między nimi jest jedna pusta przestrzeń. Powiedz coś takiego jak na poniższym rysunku (jeśli całkowita liczba pasujących kijów wynosi 4).
Każdy kij może przesunąć się o jeden krok w kierunku do przodu (jeśli bezpośrednia przednia przestrzeń jest wolna), lub można go przeskoczyć nad jednym kijem z przodu i wylądować w wolnej przestrzeni (jeśli ta przestrzeń jest wolna). Ruch w odwrotnym kierunku nie jest możliwy (nawet przestrzeń jest wolna). Niedozwolony jest również skok do tyłu. Tylko jeden ruch jest dozwolony w jednym kroku.
Teraz musisz napisać algorytm, aby znaleźć minimalne wymagane kroki, za pomocą których wszystkie drążki zapałek po lewej stronie wylądują po prawej stronie, a wszystkie drążki zapałek po prawej stronie wylądują po lewej stronie.
Na przykład: jeśli w sumie są 2 kijki do zapałek (po 1 z każdej strony), kroki będą następujące:
Uwaga: na powyższym rysunku najpierw przesunięto lewy drążek boczny. Inne rozwiązanie istnieje, gdy prawy drążek boczny porusza się pierwszy. Ale w przypadku tego problemu musisz podać tylko jedno rozwiązanie, przy założeniu, że lewy drążek porusza się pierwszy.
Poniższy rysunek opisuje ruchy za pomocą 4 kijów zapałek (2 z każdej strony):
Uwaga: na powyższym rysunku najpierw przesunięto lewy drążek boczny. Inne rozwiązanie istnieje, gdy prawy drążek boczny porusza się pierwszy. Ale w przypadku tego problemu musisz podać tylko jedno rozwiązanie, przy założeniu, że lewy drążek porusza się pierwszy.
[Założenie: Wejście może być dowolną liczbą parzystą od 02 do 14 (tj. 1 do 7 pasujących kijów z każdej strony). W przypadku danych wejściowych poza tym zakresem nie ma potrzeby sprawdzania poprawności ani podawania komunikatu o błędzie. Uwaga: W wyniku każdy krok jest oddzielony znakiem „|” (rura) znak. Programiści COBOL powinni zawsze przyjmować PIC 9 (2) jako wielkość wejściową i mogą również zakładać, że wyjście ma być ustalone maksymalnej długości 450 znaków, wypełnione spacjami po prawej stronie.]
Przykładowe dane wejściowe:
02
Przykładowe dane wyjściowe:
01To02|03To01|02To03|
Przykładowe dane wejściowe:
04
Przykładowe dane wyjściowe:
02To03|04To02|05To04|03To05|01To03|02To01|04To02|03To04|
Przykładowe dane wejściowe:
06
Przykładowe dane wyjściowe:
03To04|05To03|06To05|04To06|02To04|01To02|03To01|05To03|07To05|06To07|04To06|02To04|03To02|05To03|04To05|
źródło
Odpowiedzi:
APL 129
Poniższy kod przenosi dane wejściowe i wyjściowe na ekran w określonym formacie:
Spora część kodu zajmuje formatowanie wyniku. Uzupełnieniem logiki jest pojawienie się symbolu ⋄ w kodzie.
Poniżej znajduje się wynik dla wpisu 08 jako kontroli:
źródło
JavaScript
178 174161prompt
zan
toalert
odpowiedź s. (Bez0
wyściółki)Najnowszy:
2:
1:
Wykorzystuje to koncepcję, że wzorzec jest dublowany:
A zatem
n=2
wzór ruchu jest następujący:Co równa się
Ten wzór powtarza się tak (
n=8
)Widzimy tutaj kilka wzorów:
n/2
, który powtarza się 3 razy, a następnie zmniejsza z powrotem do 1.1
, a liczba skoków sekwencyjnych rośnie od 1,n/2
a następnie maleje z powrotem do 1.n=14
:Przykładowe dane wyjściowe:
f(2)
:f(8)
:f(40)
:Oto pseudo kod do zademonstrowania metody:
źródło
l/L/r/R
im/j
. Podoba mi się pomysł oddzielenia odległości od kierunkuC -
216213Moje rozwiązanie opiera się na dwóch faktach:
Pole „do” to pole „z” poprzedniego ruchu (ponieważ zawsze tworzysz puste miejsce w miejscu, z którego się poruszasz, i zawsze przechodzisz do pustego miejsca)
Przesuwane odległości i kierunki są bardzo regularne. Dla pierwszych 3 przypadków testowych są to:
1 -2 1
1 -2 -1 2 2 -1 -2 1
1 -2 -1 2 2 1 -2 -2 -2 1 2 2 -1 -2 1
Mając to na uwadze, po prostu napisałem program do tworzenia i kontynuowania tego wzoru. Jestem prawie pewien, że musi istnieć naprawdę piękny i znacznie bardziej elegancki rekurencyjny sposób na napisanie tego, ale jeszcze tego nie rozgryzłem:
I grał w golfa (chociaż było to wyzwanie kodowe, a nie golfowe):
źródło
scanf
. Aktualizuję swoją odpowiedź lepszą wersją.N(2)=rLr
,N(4)=rLlRRlLr
,N(6)=rLlRRrLLLrRRlLr
, itd.Matematyka
To podejście buduje
Nest
edytowaną sekwencję wielkości i kierunku ruchów, sformatowaną jako{fromPosition,toPosition}
, zaczynając od pozycjin
, gdzien
odnosi się do liczby par dopasowania. NastępnieFold
jest sekwencją w funkcję rozpoczynającą się od ruchu{n, n+1}
.Wizualizacja zamiany
r
,,b
io
są odpowiednio obrazami lub czerwonym dopasowaniem, niebieskim dopasowaniem i brakiem dopasowania.Poniżej sformatowano dane wyjściowe z,
z
aby wyświetlić zamiany z dopasowaniami.swaps
tworzy listę stanów przy użyciu uporządkowanych parz
poleceń as, aby permutować listę początkową i kolejne.swapMatches
wyświetla stany w siatce.źródło
Javascript 191
Znaki liczone za pomocą
grep =|tr -d \ |wc -c
źródło
02
wartości są prawidłowe, ale brakuje w nim końcowego|
. W pozostałych dwóch przypadkach wartości są dalekie, a formatowanie10
również jest nieprawidłowe. Nie jestem również pewien swojej metody liczenia postaci. Dlaczego liczysz tylko ciało funkcji minus zwrot?tr -d \ |wc -c
bierze pod uwagę nowe linie