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.
źródło
[^^/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.Odpowiedzi:
Ruby,
306 298 251 204198Edycja: Bardzo dziękuję Ventero, który znacznie skrócił kod, stosując niesamowite sztuczki!
Wejście i wyjście
Kod reprezentuje funkcję ruby, która przyjmuje trzy parametry:
Zwraca
1
(prawda) w przypadku pętli lubnil
(fałsz), gdy ładunek odpoczywa.Testy
Tutaj przechodzi wszystkie testy Martina: http://ideone.com/zPPZdR
Wyjaśnienie
W kodzie nie ma sprytnych sztuczek; jest to dość prosta implementacja zasad.
W poniższym kodzie
move
jest funkcja rekurencyjna, która wykonuje ruch zgodnie z regułami i:Bardziej czytelna wersja jest dostępna tutaj .
Uwaga: kod do gry w golfa przeszedł kilka modyfikacji i nie jest już podobny do wersji do odczytu.
źródło
r
zawiera dodatkowe wpisy poza czterema kierunkami,r[y>=0&&x>=0&&g[y]&&g[y][x]]+=1
należy zapisać kilka bajtów.Python 2, 207 bajtów
Wprowadź siatkę jako listę wierszy, np
następnie szerokość i wysokość. Zwraca
0
lubTrue
odpowiednio.Wyjaśnienie
źródło
cmp
do zmiennej?D
do klawisza pozycji powinno to zrobić.Julia -
394300246214 bajtówZwraca 1, jeśli ładunek zapętla się, i 0, jeśli zatrzyma się. To nie jest „ściśle” prawda / fałsz, ponieważ Julia nie zezwala na 0 i 1 w kontekście boolowskim ... ale uważam wartości,
x
dla którychbool(x)==true
są prawdziwe ibool(x)==false
są fałszywe.Dane wejściowe
A
powinny mieć postać tablicy znaków. Jeśli kopiujesz / wklejasz siatkę przenośnika, musisz ustawić ją w odpowiedniej formie. Aby uniknąć konieczności ręcznego obsługiwania go, użyj następujących poleceń:Gdzie oczywiście
(PASTE GRID HERE)
należy zastąpić samą siatką. Sprawdź dwukrotnie spacje na końcu każdej linii, aby upewnić się, że faktycznie ma wszystkie spacje (nie sprawdza, czy wszystkie linie mają równą długość). Zauważ, że ten wiersz nie jest częścią rzeczywistego kodu rozwiązania, a jedynie wygodnym fragmentem kodu, aby ułatwić korzystanie z kodu rozwiązania.Nie golfowany:
Uwaga:
1-[19 8]i%82%3
wybrano mapowanie pięciu możliwych znaków na odpowiednie pary współrzędnych za pomocą najbardziej efektywnej metody, jaką mogłem znaleźć. Jest to również powód użycia 5 do wypełnienia spacji podczas tworzeniaG
- jest to jednocyfrowy znak, który odwzorowuje[0 0]
.Przykład użycia:
źródło
f(A,x,y)=
jest krótszy niżf=(A,x,y)->
.f=
i uczynię z niej anonimową funkcję, kiedy skończę grać w golfa.f()=
kontra()->
.