Jest rzeka i wilki i kury po jednej stronie rzeki. Mają tratwę i wszyscy muszą przejść na drugą stronę. Tratwa nie może jednak samodzielnie podróżować. Tratwa zatonie, jeśli będzie na niej więcej niż dwa zwierzęta. Żadne ze zwierząt nie chce się zmoczyć, ponieważ rzeka jest zimna i brudna. Żadne ze zwierząt nie może skakać ani latać nad rzeką. Ponadto, jeśli kurczaki są po jednej stronie, po tej stronie nie może być więcej wilków niż kurczaków po tej stronie - wówczas wilki zdecydują się je zjeść. Oznacza to, że nie możesz wziąć dwóch wilków na tratwie na bok z jednym kurczakiem.
Twoim zadaniem jest stworzenie programu / funkcji, która pobierze liczbę wilków i kurczaków (większą lub równą liczbie wilków) jako dane wejściowe i znajdzie najmniejszą liczbę ruchów tratwy przez rzekę. Jeśli zadanie nie jest możliwe, program / funkcja powinna wypisać / zwrócić pusty ciąg znaków. Następnie wydrukuje / zwróci jedną metodę, jak to zrobić:
W if a wolf crosses the river on its own
C if a chicken crosses the river on its own
CW if a chicken and a wolf cross the river -- WC is also fine
CC if two chickens cross the river
WW if two wolves cross the river
Jak można wywnioskować, tratwa automatycznie przesunie się w naprzemiennych kierunkach (w lewo iw prawo, zaczynając od lewej do prawej, gdy pierwsze lub dwa zwierzęta przekroczą rzekę). To nie musi być wysyłane / zwracane. „W”, „C”, „CW”, „CC” lub „WW” na wyjściu można oddzielić co najmniej jednym z poniższych:
spaces (' ')
commas (',')
newlines
Alternatywnie możesz przechowywać wskazówki jako pozycje na liście (pusta lista oznacza brak rozwiązania).
Przypadki testowe (dane wyjściowe oddzielone przecinkami - dane wejściowe mają postać wolves,chickens
):
1,1 -> CW
2,2 -> CW,C,CC,C,CW
1,2 -> CW,W,CW
0,10 -> CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC
3,2 -> no solution
Staraj się, aby Twój kod był jak najkrótszy.
źródło
Odpowiedzi:
Perl,
179165164163157156 156 bajtówObejmuje +4 za
-p
Daj wilkom, a następnie kurczętom STDIN
Wysyła zawartość łodzi w wierszu. W tym przykładzie daje:
river.pl
:Działa jak pokazano, ale wymienić
\xhh
i\n
ich dosłowne wersji dostać twierdził wynik.Prawdopodobnie zostanie pobity przez program, który rozwiązuje ogólny przypadek (C> W> 0)
Dodaj do tego trywialne rozwiązania tylko dla wilków i tylko kurczaków oraz zakodowany specjalny przypadek dla
2 2
i3 3
(4 4
i wyżej nie mają rozwiązania). Ale to byłby nudny program.Wyjaśnienie
Bieżący stan pola jest przechowywany jako pojedynczy ciąg znaków składający się z:
w
dla wilka na brzegu z łodziąc
dla kurczaka na brzegu z łodzią\x88
(nieco odwróconyw
) dla wilka na drugim brzegu\x9c
(nieco odwróconyc
) dla kurczaka na drugim brzeguP
prawym brzegu\xaf
(odwrócony bitP
) na lewym brzegu (strona początkowa)\n
WC\nW\nWC\nC\n
(zwróć uwagę naW
s iC
są tu wielkie litery)Tablica
@F
będzie zawierać wszystkie osiągalne stany. Jest inicjowany przez ciąg początkowywolves times "w", chickens times "c", \xaf \n
Następnie program zapętla
@F
się w pętli, dzięki czemu nowe stany również są przetwarzane. Następnie dla każdego elementu:\n
która reprezentuje bieżącą pozycję zwierząt i łodzi. Jeśli było to widoczne przed pominięciem$a{$`x/\n/}++
grep(y/c//<y/w//&/c/,$_,~$_)
$\
i przechowuj, ponieważ pierwsze znalezione rozwiązanie jest najkrótsze$\||=$' x/^\w*\n/
c
iw
. (Zwierzęta po drugiej stronie nie będą pasować\w
)/(\w?)(.*)(c|w)(.+)\n(?{code})^/
. Następnie odwróć cały łańcuch przed\n
wyjątkiem zwierząt, które zostały wybrane do łodzipush@F,$1.$3.~"$`$2$4\xf5"
. Dodaj wybrane zwierzęta do ruchów, przesuwając je górną częścią:uc"$'$1$3\n"
Proces selekcji zwierząt skutecznie tasuje reprezentującą je część strunową na wiele sposobów. Tak więc np.
wcwc
Iwwcc
mogą zarówno reprezentować 2 wilki, jak i 2 kurczaki. Kontrola stanu$a{$`x/\n/}++
bez rozróżnienia rozróżni te dwa o wiele więcej stanów, niż to konieczne, zostanie wygenerowanych i sprawdzonych. Dlatego programowi zabraknie pamięci i czasu, gdy tylko liczba różnych zwierząt będzie większa. Jest to nieco ograniczone przez fakt, że obecna wersja przestanie dodawać nowe stany po znalezieniu rozwiązaniaźródło
WC,C,WC
tym, jak na prawym brzegu są 2 wilki i 1 kurczak. Koniec gryJavaScript (ES6),
251264...244240 bajtówPobiera liczbę wilków i kurczaków
(w, c)
i zwraca jedno z optymalnych rozwiązań lubundefined
jeśli nie ma rozwiązania.Sformatowane i skomentowane
Funkcja owijania:
Główna funkcja rekurencyjna:
Przypadki testowe
Pokaż fragment kodu
źródło
and finds the smallest number of times the raft has to move across the river.
. więc nie sądzę, że jest to prawidłowe rozwiązanieCJam, 133
Wypróbuj online
Wyjaśnienie:
Zasadniczo program wykonuje BFS i zapamiętuje każdy osiągnięty stan, aby uniknąć nieskończonych cykli. Stany robocze są reprezentowane jak [[Wl Cl] [Wr Cr] M1 M2… Mn] gdzie W = wilki, C = kurczaki, l = lewa strona, r = prawa strona, M = dotychczas wykonane ruchy (początkowo brak), a ruchy są jak „C”, „WC” lub „WW” itp. (praktycznie bardziej jak [„” „C”], [„W” „C”], [„WW” „”], ale jest taki sam podczas drukowania). Zapamiętane stany są reprezentowane jak [[Wl Cl] [Wr Cr] S], gdzie S jest bokiem łodzi (0 = lewy, 1 = prawy).
źródło
Perl 6 , 268 bajtów
Generuje coraz dłuższe łańcuchy
(wolf count, chicken count)
stanów dla lewego brzegu i zwraca pierwszy, który pasuje do wszystkich reguł.Okazuje się, że takie podejście nie jest ani wydajne, ani bardzo zwięzłe, ale przynajmniej fajnie było pisać.
Nie sądzę, że nigdy wcześniej nie stosowałem meta-operatorów
Z
(zip) iX
(cross), tak jakZZ-
iZX*
tutaj - trochę zaskoczony, że tak naprawdę działał.(Nowe wiersze zostały właśnie dodane do celów wyświetlania i nie są częścią liczby bajtów).
źródło
JavaScript (ES6), 227
237Zasadniczo wykonuje BFS i zapamiętuje każdy osiągnięty stan, aby uniknąć nieskończonych cykli.
W przeciwieństwie do @ aditsu, nie sądzę, żeby było miejsce na golfaMniej golfa
Test
źródło