Zainspirowany jednym z filmów Vi Harta (które są skarbnicą pełną potencjalnych pomysłów na wyzwania)
Wąż składa się z segmentów o tej samej długości, a połączenie między każdym segmentem może być proste lub wykonać obrót o 90 °.
Możemy zakodować takiego węża (do obrotu, który zależy od początkowego kierunku), zapisując ślizgacz , kierunek zwojów (Prosto / Lewo / Prawo). Ten, zaczynający się w lewym górnym rogu i wskazujący w prawo
-+ +--+ SR RSSR
| +-+ | S RSL S
+--+ --+ LSSL SSR
Byłby reprezentowany przez ślizgacz SRSLSSLRLRSSRSRSS
I oczywiście wąż planarny nie może się przecinać (jak w środku SSSSLLLSS
), co spowodowałoby straszne pikselowe zakończenie gry.
Twoim zadaniem jest ustalenie, czy ślizgacz jest prawidłowy, czy nie (skutkuje co najmniej jednym przecięciem się)
Wejście
Ciąg wykonany z liter SLR
z 2 < length < 10000
wyjściem
Coś prawdy, jeśli jest to prawidłowy ślizg, a coś Falsey, jeśli nie.
Przypadki testowe
__Valid__
SSLSLSRSRSSRSSSLLSSSRRLRSLRLLSSS
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR (A hilbert curve)
RLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRR
SRRSRSRSSRSSRSSSRSSSRSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS (Spiral)
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS (bigger, squigglier spiral)
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLL
__Invalid__
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRLSLLRRLLSLRRSRLLRSRRLLSRSSSRSSSSSSSRSRSSSSSSSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRSRSRSSRSSRSSSRSSSRSSSSSSSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLRLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLLSLRLSLRSLRSLRSLSLSLRSRLSLRSLRLSRSLLLRLRLRRRRSLSLSSLLSLSLSLSSLLSLSLLRLRSLLRSRLSLSSLLLLSSSSSSSSSSSSSSSSSSSSRLRLLRRLRLRLLRLRLRLRLRLSSSSLSLRLLRLSLSSLSLSLSLSLRLLRLSLLLSRSSSSSSSSSSSSSSSRLRLRLLRLRLSLSRSRSSSLSRLRLRLRSLSLSLSRLLSRLSLSLSLSLSSLSLSLLSLSRLLRLRLRLRLRLRLRLRLRLRLSLSRLRLSLLRRLSLLSLSLSLSLSLLSLSLSLRLRLRLRLRLRLRLRLRLRRLRSLSLSLSLSLSLSLSSLSSSSSLSLSSSLSLSLSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
Możesz narysować tutaj ślizgawki (R i L są odwrócone, ale nie wpływa to na ważność)
źródło
SRRR
na papierze milimetrowym z jednym kwadratem na segment, wówczas będzie się on nakładał, a zatem jest nieprawidłowy, po prostuRRR
jednak zajmowałby dokładnie kwadrat 2x2 bez nakładania się (tak jak w klasycznej grze)Odpowiedzi:
Pyth,
2220 bajtówWypróbuj sam lub uruchom testsuite .
Zwróć uwagę na wartości ASCII dla SRL, odpowiednio 83, 76, 82. Nadużywam faktu, że:
Stąd trzymam zmienną dla bieżącej pozycji i bieżącego kierunku. Dla każdego znaku mnożę bieżący kierunek przez powyższą liczbę zespoloną, a następnie dodaj go do bieżącej pozycji.
Na koniec sprawdzam, czy wszystkie odwiedzane pozycje są unikalne.
źródło
CJam, 30 bajtów
Wyjaśnienie, które wkrótce nastąpi.
Wypróbuj online tutaj lub uruchom cały pakiet .
źródło
S
, czy to oznacza, że wąż zajął już zarówno (0,0), jak i (1,0)?JavaScript (ES6), 84
89Uruchom snippet w przeglądarce Firefox, aby przetestować.
Niektóre uwagi:
undefined
. Przy pierwszej wizycie operator tyldy zmienia go na -1, co jest prawdą. Ostatecznie podczas drugiej wizyty wartość zmienia się na 0, co jest fałszem, aevery
pętla kończy się, zwracając wartość false.źródło
TI-BASIC,
49 56 5351 bajtówPodobnie do metody orlp, tworzy listę wszystkich punktów w płaszczyźnie złożonej odwiedzanych przez węża, zaczynając od początku. Jeśli lista nie zawiera zduplikowanych elementów, kod zwraca pewną wartość dodatnią. Zauważ, że w ciągu ponad 999 elementów kalkulator nie będzie w stanie wygenerować wystarczająco długiej listy i popełni błąd.
EDYCJA: Zapisano dwa bajty kosztem brzydoty, ponieważ żadne dwa punkty sieci na płaszczyźnie złożonej nie mogą znajdować się w tej samej odległości od e ^ i.
źródło
TI-BASIC,
6058 bajtówEdit: Ignoruj wszystko poniżej: Roztwór ti-podstawowy pracy jest tutaj , przez Thomas-KWA. Idź do góry!
⁻
jest[(-)]
kluczem, a Ans jest[2ND]->[(-)]
. Uruchom go, umieszczając instrukcje węża w cudzysłowach ([ALPHA]->[+]
), a następnie dwukropek, a następnie nazwę programu. Na przykład, jeśli nazwiesz program „SNAKE”, uruchomisz test w OP jako"SRSLSSLRLRSSRSRSS":prgmSNAKE
.Edycja: Nie działa
SRRLSLLRRRS
. Mam poprawioną wersję o wielkości 61 bajtów, ale nie działa w pierwszym niepoprawnym przypadku testowym:Spróbuję naprawić jutro.
Aktualizacja: więc problem polega na tym, że mój algorytm jest wadliwy. Gdybym użył pętli For (w przeciwieństwie do seq ((aby osiągnąć to samo)), to (właściwie oba powyższe algorytmy) można opisać następująco:
Nie działa to jednak w przypadku nieprawidłowych ślizgaczy takich jak
SRLRLRLRLRRRSS
. Spróbuję teraz wymyślić lepszy algorytm ... lub wykraść inną odpowiedź.Jestem w 90% pewien, że można to
seq(
właściwie zastąpić jednym poleceniem, ale na razie jest to tak małe, jak tylko mogę. Jeśli zamierzasz zbudować to do 8xp za pomocą Sourcecodera, a nie pisać, pamiętaj, że≠
należy go zastąpić,!=
a⁻1+
bit należy zastąpić~1+
.źródło
Rubinowy 87
89Test online: http://ideone.com/pepeW2
Wersja bez golfa:
źródło
Golfscript 49
49 50Oczekuje, że łańcuch będzie istniał na stosie i zwraca albo
0
albo1
.Możesz wypróbować online z testami na ważne i nieprawidłowe węże.
Jest to w zasadzie ten sam pomysł, co w mojej odpowiedzi Ruby . Tylko tablica kierunkowa jest traktowana inaczej, ponieważ AFAIK Golfscript nie ma funkcji arary obrotu. W tym przypadku buduję odpowiednio dużą tablicę kierunków, mnożąc ją 10000 razy, a następnie przycinając od początku 0, 1 lub 3 elementy, w zależności od bieżącego polecenia (S, R lub L). Bieżący „kierunek”, do którego należy się przenieść, jest zawsze pierwszym elementem w tablicy.
Oto z komentarzami:
Edytować:
Zapisano 1 znak, modyfikując sposób zużycia tablicy „kierunków”.
Edytować:
zapisano 1 znak, przesuwając o 10 zamiast 1, aby skorzystać ze
?
składni (mocy).źródło