Wyzwanie to jest luźno zainspirowane grą Zachtronics Infinifactory .
Otrzymujesz widok z góry prostokątnej siatki przenośników, reprezentowanej przez >v<^
. Mogą istnieć komórki bez przenośników, reprezentowane przez spacje. Oto przykład:
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
Ta konfiguracja jest domyślnie otoczona nieskończoną liczbą spacji.
Ponadto podano wymiary prostokątnego kawałka ładunku, który umieszcza się na przenośnikach w lewym górnym rogu siatki. Twoim zadaniem jest ustalenie, czy ładunek kiedykolwiek się zatrzyma, czy też skończy się w pętli.
Oczywiście ładunek prawdopodobnie może obejmować kilka przenośników jednocześnie, więc oto zasady ustalania kierunku ładunku na każdym etapie:
Przeciwne przenośniki znoszą się nawzajem. Tak więc, jeśli ładunek 3x2 obejmuje dowolne z następujących łatek (dla zachowania przejrzystości opatrzonych łącznikami i rurkami), wynik byłby taki sam:
+---+ +---+ +---+ |>>^| | ^| |v^^| |^<<| |^ | |^^v| +---+ +---+ +---+
To samo dotyczy tych:
+---+ +---+ +---+ |v^<| | | |><>| |>>>| |>> | |>><| +---+ +---+ +---+
Ponieważ dokładne położenie przenośnika pod ładunkiem jest nieistotne, nie ma znaczenia, które pary anulujesz.
To anulowanie jest stosowane przed innymi zasadami. Dlatego w przypadku pozostałych zasad przenośniki będą dostępne tylko w co najwyżej dwóch kierunkach.
- Jeśli ładunek w ogóle nie obejmuje żadnych przenośników (ponieważ wszystkie przenośniki anulują się, ponieważ obejmują tylko przestrzenie lub ponieważ całkowicie zsunął się z rusztu), zatrzymuje się.
Jeżeli ładunek obejmuje więcej przenośników w jednym kierunku niż w drugim, ładunek przesuwa się w tym kierunku. Na przykład, jeśli ładunek 3x2 obejmuje następną łatkę
>> ^>^
przesunie się w prawo, ponieważ jest ich więcej
>
niż^
. Z drugiej strony, jeśli to obejmowało>>^ ^
ta zasada nie miałaby zastosowania, ponieważ istnieje powiązanie między
>
i^
.Pozostawia to tylko przypadki, w których występuje remis między sąsiednimi kierunkami (remis między przeciwnymi kierunkami zostałby anulowany). W takim przypadku ładunek porusza się wzdłuż osi, w którą już się porusza. Np. Jeśli ładunek 3x2 poruszający się w prawo lub w lewo pokrywa teraz łatkę
>>^ ^
przesunie się w prawo. Gdyby ta łatka dotarła w górę lub w dół, przesunie się teraz w górę. Jeśli tego rodzaju konflikt występuje na pierwszym etapie symulacji, załóż, że ładunek przesuwał się w prawo.
Szczegółowe przykłady
Rozważ kratkę przenośnika u góry i ładunek 3x2. Poniżej przedstawiono krok po kroku wizualizację procesu. Każdy krok składa się z siatki, z ładunkiem reprezentowanym przez #
, małe pudełko, które pokazuje przenośniki objęte ładunkiem, kolejne pudełko z przenośnikami po anulowaniu i regułą, która określa, gdzie przemieszcza się ładunek:
###vv < > <vv < > <vv < > <vv < > <vv < > <vv <
###^ >v v ###^ >v v v ^ >v v v ^ >v v v ^ >v v v ^ >v v
>v^^>vv^ ###v^^>vv^ ###v^^>vv^ ###^^>vv^ ###^>vv^ >###>vv^
^>^ v ^>^ v ### ^>^ v ###^>^ v ###>^ v ###^ v
> v<v >> > v<v >> > v<v >> > v<v >> > v<v >> > v<v >>
>v v<^ >v v<^ >v v<^ >v v<^ >v v<^ >v v<^
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
|> <| | | | v | | v | | >| | >| | >v| | >v| |>v^| |> ^| |v^^| | ^^|
| v | | v | | >| | >| | | | | | | | | | ^| | | | ^>| | >|
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
Rule 3 Rule 4 Rule 3 Rule 4 Rule 4 Rule 3
================================================================================
> <vv < > <### < > <vv <
v ###v v v ###v v v ###v v
>###>vv^ >v^^>vv^ >###>vv^
^>^ v ^>^ v ^>^ v
> v<v >> > v<v >> > v<v >>
>v v<^ >v v<^ >v v<^
+---+ +---+ +---+ +---+ +---+ +---+
|^ >| | >| |vv | | v | |^ >| | >|
|v^^| | ^^| |^ >| | >| |v^^| | ^^|
+---+ +---+ +---+ +---+ +---+ +---+
Rule 3 Rule 4 Rule 3
W tym momencie ładunek wchodzi w pętlę między dwiema ostatnimi ramami.
Teraz rozważ zamiast tego ładunek 2x3:
##<vv < >##vv < > <vv < > <vv < > <vv < > <vv <
## ^ >v v ##^ >v v ##^ >v v v ^ >v v v ^ >v v v ^ >v v
##>v^^>vv^ ##v^^>vv^ ##v^^>vv^ ##v^^>vv^ ##^^>vv^ >v^^>vv^
^>^ v ^>^ v ## ^>^ v ## ^>^ v ##^>^ v ##^>^ v
> v<v >> > v<v >> > v<v >> >##v<v >> > ##<v >> > ##<v >>
>v v<^ >v v<^ >v v<^ >v v<^ >v v<^ ## v<^
+--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+
|> | |> | | <| | | |v | |v | | >| | >| |>v| |>v| | | | |
| v| | v| |v | |v | | >| | >| | | | | | | | | | v| | v|
| | | | | >| | | | | | | | | | | | v| | v| |>v| |>v|
+--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+
Rule 4 Rule 3 Rule 4 Rule 3 Rule 3 Rule 3
================================================================================
> <vv < > <vv < > <vv <
v ^ >v v v ^ >v v v ^ >v v
>v^^>vv^ >v^^>vv^ >v^^>vv^
^>^ v ^>^ v ^>^ v
> ##<v >> > v<v >> > v<v >>
## v<^ ## v<^ >v v<^
## ## ##
## ##
##
+--+ +--+ +--+ +--+ +--+ +--+
| v| | v| |>v| |>v| | | | |
|>v| |>v| | | | | | | | |
| | | | | | | | | | | |
+--+ +--+ +--+ +--+ +--+ +--+
Rule 3 Rule 4 Rule 2
W ostatnim kroku obowiązuje zasada 2, ponieważ ładunek zsunął się z siatki, więc zatrzymuje się i nie ma pętli.
Zasady i założenia
Twoim wkładem będzie siatka przenośnika, jak opisano powyżej, wraz z szerokością i wysokością ładunku. Możesz wziąć te trzy parametry w dowolnej dogodnej kolejności i formacie. W przypadku siatki oznacza to, że można odczytać pojedynczy ciąg z liniami oddzielonymi znakami nowej linii lub innymi znakami, lub tablicę ciągów lub tablicę tablic znaków, o ile poszczególne komórki siatki są nadal reprezentowane przez znaki >v<^
i spacje.
Powinieneś wypisać prawdziwą wartość, jeśli konfiguracja powoduje pętlę co najmniej dwóch ramek lub wartość fałszowania, jeśli ładunek zatrzyma się.
Możesz założyć, że siatka zostanie wypełniona prostokątem ze spacjami i że ładunek początkowo będzie pasował do siatki.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Przypadki testowe
Przypadki testowe są pogrupowane według siatek.
Grid (2x2):
>v
^<
Width Height Loop?
1 1 True
1 2 True
2 1 True
2 2 False
Grid (3x3):
> v
^ <
Width Height Loop?
1 1 False
1 2 False
1 3 False
2 1 False
2 2 True
2 3 True
3 1 False
3 2 True
3 3 False
Grid (4x3):
>^>v
v^v
^ <<
Width Height Loop?
2 2 False
Grid (6x5):
>v>v>v
^v^v^v
^v^v^v
^>^>^v
^<<<<<
Width Height Loop?
1 1 True
1 2 False
2 1 True
2 2 True
2 4 True
2 5 False
3 1 False
3 2 True
3 3 True
3 5 True
6 2 False
6 3 True
6 5 False
Grid (10x6):
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
Width Height Loop?
1 1 False
2 3 False
2 6 False
3 2 True
5 4 False
6 1 True
10 6 False
Jako dodatkowy zestaw przypadków testowych należy wziąć pod uwagę, że wszelkie dane wejściowe, w których siatka składa się wyłącznie ze spacji, muszą dawać wynik fałszowania.
Ręcznie sprawdziłem wszystkie przypadki testowe, więc daj mi znać, jeśli uważasz, że popełniłem błąd.
[^^/v<]
staje się [[0,1] [0,1];[0,-1] [-1,0]]
? Czy masz na myśli, czy to od nas zależy, czy będzie to STDIN, ciąg znaków, tablica znaków itp., Ale nadal musi mieć postać ^, v,> i <?
><^v
lub spację. Wyjaśnię to.