Kocham> <>,> <> to życie! Języki 2D są niesamowite! W tym wyzwaniu będziesz musiał powiedzieć, czy „podejrzana” droga ma koniec, podczas gry w golfa.
Definicja
Rybia droga zbudowana jest z płytek, w tym następujących:
v (go down)
> (go right)
^ (go up)
< (go left)
/ (mirror)
\ (mirror)
Każda inna postać (z wyjątkiem -|+
) może być uważana za rozrywkę, na przykład niektóre kwiaty (lub głowy ryb) na granicy drogi.
Droga zawsze zaczyna się w lewym górnym rogu prostokątnej siatki oddzielonej -|+
symbolami. Droga kończy się, jeśli podążając nią, znajdziesz się na granicy, w przeciwnym razie utkniesz w nieskończonej ścieżce.
Znalezienie drogi na drodze odbywa się zgodnie z instrukcjami podanymi przez v>^<
i lusterka. Lustro odbije się o 90 ° w zależności od tego, skąd pochodzisz. Oto jak to działa (używając v>^<
do pokazania wskazówek):
^ ^
>/< >\<
v v
</> <\>
^ ^
Droga może wyglądać tak, jeśli kończy się:
+--------------------+
|>\/ this way >\/> | this one ends here
| v^ \/ |
| v^ ^.^ |
| \/\ >v |
| /\/ ^< |
+--------------------+
Nieskończona pętla:
+--------+
|>>\ This|
|\\ is |
| \\ a |
| \ /trap|
+--------+
Specyfika
Droga niekoniecznie składa się tylko z instrukcji. Do uzupełnienia można użyć spacji lub liter. Oznacza to, że musisz kontynuować ruch w tym samym kierunku, chyba że przejdziesz przez postać <v^>-|
.
Zawsze będzie jeden v>^<
w lewym górnym rogu, <
lub ^
sugeruje, że ta droga się kończy.
Możesz przesłać funkcję przyjmującą ciąg jako parametr lub samodzielny program, używając STDIN / cokolwiek, co jest najbliższą alternatywą w twoim języku.
Twoje zgłoszenie musi zostać zwrócone lub wydrukowane na wartościach true / falsy STDOUT po zakończeniu. Prawdziwe wartości oznaczają, że droga ma koniec, podczas gdy fałsz oznacza, że jest to nieskończona pętla.
Przypadki testowe
+--------------------+
|>\/ this way >\/> | this one ends here
| v^ \/ |
| v^ ^.^ |
| \/\ >v |
| /\/ ><> ^< |
+--------------------+
True
+--------+
|>>\ This|
|\\ is |
| \\ a |
| \ /trap|
+--------+
False
+--+
|<v|
|^<|
+--+
True
+--+
|>v|
|^<|
+--+
False
+----------+
|v Hello \ |
|\\/\/ / |
| \/\\ \ |
|/ // >\ |
| ^/\>\\/ |
|\ /\/\/ |
+----------+
False
+-----+
|>\/\\|
|//\\/|
|\/\\\|
|//\//|
|\/\/ |
+-----+
True
2 test cases added as suggested by @MartinBüttner
+----+
|v |
|\\ |
|//\ |
|\\v |
| \/ |
+----+
False
+----+
|v |
|\\ |
|//\ |
|\\^ |
| \/ |
+----+
False
Test case inspired by @ETHproductions
+-------------------------+
|><> |
|something smells fishy...|
+-------------------------+
False
Standardowe luki są zabronione (jak zawsze).
Zwycięzcą zostanie ten z najkrótszym kodem w bajtach. (byłoby wspaniale zobaczyć odpowiedź> <> :))
źródło
Odpowiedzi:
JavaScript, ES6,
177161145 bajtówCykl możemy wykryć, przemierzając ścieżkę i wykrywając powtórzenie krotki
Oznacza to, że jeśli wchodzimy po raz drugi
(x,y)
z jakiegoś kierunkuD
, wiemy, że ten cykl będzie się powtarzał na zawsze. Dlatego kod śledzi wszystkie odwiedzone lokalizacje i z jakiego kierunku, i sprawdza ten zapis przy każdej wizycie w nowym miejscu.Kierunki w górę, w dół, w lewo iw prawo są przypisane numery
1
,2
,3
, i4
. Kod uwzględnia bieżący symbol odwiedzany (s[i+L]
) i zmienia aktualny kierunek (D
), a następnie nowy kierunek służy do rekurencyjnego wywoływania funkcji i oceny następnej spacji.5
jako kierunek wskazuje ścianę itrue
zakończenie programu.Oto wyjaśnienie kodu mniej golfowego:
Łańcuch szablonu
`431255${5-D+'X3412'[D]}`
ma zagnieżdżone wyrażenie, które obsługuje kopie lustrzane: ponieważ kierunki są liczbami, mogą być również używane jako indeksy. Wyrażenie'X3412'[D]
zwraca ósmy znak w ciągu możliwego kierunku, a zatem odpowiada\
ósmemu znakowi w ciągu symboli'><^v-|/\\'
). Wyrażenie mówi:D
jest1
(w górę), nowy kierunek po uderzeniu w\
lustro będzie3
(w lewo)D
jest2
(w dół), nowy kierunek po uderzeniu w\
lustro będzie4
(w prawo)Drugie lustro
/
użyłoby tego wyrażenia'X4321'[D]
, ale ponieważ jest to po prostu uporządkowane odliczanie4
, możemy wyrazić je prościej jako5-D
.źródło
Niezgodna> <> odpowiedź
Chciałeś> <>, dam ci> <>!
Uważam, że jedynym rozsądnym sposobem na zrobienie tego w> <> jest skopiowanie danych wejściowych w przestrzeni kodowej i umożliwienie tłumaczowi samodzielnego podjęcia decyzji, czy dane wejściowe gdzieś prowadzą. Ponieważ> <> nie implementuje już wątkowania, pozostaje nam duży problem: jeśli wejście ma pętlę, utkniemy w niej.
Biorąc pod uwagę te względy, postanowiłem uczynić rozwiązanie kompatybilne z >> internetowym tłumaczem, aby można było stwierdzić, czy tłumacz utknął na wejściu, czy po prostu starał się zrobić wszystko. Musiałem także dodać końcowe wiersze do kodu, aby interpreter online wyświetlał dodany kod i nie zawieszał się przy próbie zapisu do niego.
Aha, a ponieważ do tej pory jestem wyraźnie zdyskwalifikowany, nie zawracałem sobie głowy graniem w kod.
Bez zbędnych ceregieli kod w pełnej krasie:
Aby go użyć, skopiuj go do interpretera internetowego, dodaj wystarczającą liczbę końcowych linii do obsługi danych wejściowych, prześlij kod, podaj go
jakoi ciesz się jazdą.;
oddzielne linieKilka testów:
źródło