Biorąc pod uwagę zestaw zamkniętych nie nakładających się konturów 2d (oddzielonych co najmniej jedną spacją nawet na przekątnych) ze strzałkami zorientowanymi konsekwentnie w tym samym kierunku zgodnym z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara (każdy kontur ma swój własny kierunek) i liczbą dodatnią n
, przesuń strzałki n
kroki wzdłuż konturów w odpowiednim kierunku. Strzałki są reprezentowane > v < ^
odpowiednio przez kierunki w prawo, w dół, w lewo i w górę. Tam pozostałe znaki to -
(poziomo), |
(pionowo) i +
(narożnik). Gdy strzała jest na rogu, zachowuje swój obecny kierunek i zmienia ją dopiero po wykonaniu skrętu.
Zawsze będzie jakikolwiek prosty odcinek (lub spacja) między dowolnymi dwoma narożnikami (jak +-+
dla poziomego i podobnego dla pionowego) - innymi słowy, ostre U
zakręty są zabronione. Segmenty między narożnikami są pionowe lub poziome, a zagięcie w rogu zawsze wynosi 90 stopni.
Wkład:
- dodatnia liczba całkowita
n
- liczba kroków - reprezentacja konturów ASCII - może to być ciąg wieloliniowy, lista ciągów, lista znaków i tak dalej.
Wydajność:
Te same kontury ze wszystkimi strzałkami przesunęły n
kroki w ogólnym kierunku każdego konturu.
Przypadki testowe:
1.
Wkład:
n
= 1
+----->->
| |
| v---+
| |
+---<-------+
Wydajność:
+------>+
| v
| +>--+
| |
+--<--------+
2)
Wkład:
n
= 2
+-----+ +---+
| | | |
+-->--+ | v
| |
+--->---+ |
| |
+------<<---+
Wydajność:
+-----+ +---+
| | | |
+---->+ | |
| |
+----->-+ v
| |
+----<<-----+
3)
Wkład:
n
= 3
+---+ +---+ +-------+
| | | v | |
^ | | | +-<-+ |
| | ^ | | v
| +---+ +-->----+ |
| |
| +-------+ +---+ |
| | | v | |
+---+ +---+ +---+
Wydajność:
+>--+ ^---+ +-------+
| | | | ^ |
| | | | +---+ |
| | | | | |
| +---+ v----->-+ |
| |
| +-------+ +---+ v
| | | | | |
+---+ +-<-+ +---+
4
Wkład:
n
= 1
+--+
| |
| +---+
| |
+----+ |
| |
+-+
Wydajność:
+--+
| |
| +---+
| |
+----+ |
| |
+-+
5
Wkład
n
= 4
^>>>>
^ v
^ v>>>>
^ v
<<<<<<<<v
Wydajność:
^>>>>
^ v
^ v>>>>
^ v
<<<<<<<<v
6.
Wkład:
n
= 1
^->
^ v
<<v
Wydajność:
^>+
^ v
<<v
Napisz funkcję lub program rozwiązujący powyższe zadanie. Wygrywa najkrótszy kod w bajtach w każdym języku. Nie zniechęcaj się językami golfa. Wyjaśnienie algorytmu i kodu jest bardzo mile widziane.
There will always be a straight segment (or a space) between any two corners (like +-+ for the horizontal and similar for the vertical) - in other words the sharp U turns are forbidden.
Odpowiedzi:
JavaScript (ES6),
210 ... 182180 bajtówPrzyjmuje dane jakom
(m)(n)
, gdzie jest listą znaków. Zwraca wynik w tym samym formacie.Wypróbuj online!
W jaki sposób?
Możesz użyć tego linku, aby zobaczyć sformatowaną wersję źródła.
Obwoluta
Funkcja rekurencyjna jest po prostu używana jako opakowanie, które wywołuje kod główny, aby przesunąć wszystkie strzałki o 1 krok i ciągle wywołuje się za pomocą aż .g n−1 n=0
Zaktualizuj metodę
Nie możemy bezpiecznie przenosić każdej strzałki pojedynczo, ponieważ groziłoby nam zastąpienie nie zaktualizowanych strzałek zaktualizowanymi. Zamiast tego najpierw usuwamy wszystkie strzałki i obliczamy ich nowe pozycje. Stosujemy nowe stanowiska po raz drugi.
Odbywa się to przez ponowne użycie jako ciągu do przechowywania aktualizacji pozycji jako kodu JS.n
Na przykład w pierwszym przypadku testowym jest ustawione na:n
(Zauważ, że wiodąca liczba - która jest oryginalną wartością - jest nieszkodliwa).n
Nowe pozycje są stosowane po prostu przez zrobienie
eval(n)
.Kierunki
Każda strzałka jest konwertowana na kierunek (nazwany w kodzie), przy użyciu następującego kompasu:d
$
Odpowiednie wartości i oblicza się w następujący sposób:dx dy
Narożniki
Jeśli następny znak w określonym kierunku to spacja lub jest poza zakresem, oznacza to, że znajdujemy się na rogu i musimy skręcić o 90 ° lub 270 °. Właśnie dlatego funkcja pomocnika testuje do 3 różnych kierunków: , nazwa i .h d dxor1 dxor3
Jeśli znajdujemy się na rogu, nadpisujemy komórkęd
+
. W przeciwnym razie nadpisujemy go albo-
albo|
, w zależności od parzystości .Uwaga : Parametr nie jest nazwany tylko dlatego, że wygląda na Uber L33T, ale także dlatego, że pozwala nam porównać dany znak z (niejawnie przymuszony do łańcucha), aby wiedzieć, czy jest to spacja (poniżej ), znak konturu (powyżej ) lub inną strzałkę (również powyżej ).h h
$
"$"
"$"
"$"
Wersja animowana
Pokaż fragment kodu
źródło
K (ngn / k) ,
183 161157 bajtówWypróbuj online!
{
}/
wywołany z int lewym arg n, spowoduje zastosowanie tej funkcji w{
}
n razy do prawego argA:"^>v<"
strzałyD,:-D:(-1 0;!2)
,Y, forx dla 4 głównych kierunkóws:(#x;#*x)
kształt wejścia: wysokość, szerokośćc:~^x
kontury - macierz logiczna pokazująca, gdzie znajdują się spacjer:" -+|"c*+/'3'0,c,0
odtwórz matrycę znaków z konturem, ale bez strzałek, licząc self + górny + dolny dla każdej komórkic
i zastępując 1->-
, 2->+
, 3->|
t:A?,/x
rodzaje strzałek: 0 1 2 3 dla^>v<
, wszystkie pozostałe komórki są reprezentowane jako0N
(null)p:+s\&~^t
współrzędne strzałek$[#p
;;:r]
jeśli nie ma żadnych strzałek, wróćr
q:+p+/:D@4!(t^0N)+/:0 1 3
wszystkie 3 możliwe nowe pozycje dla każdej strzały - jeśli idzie naprzód, jeśli skręca w lewo i skręca w prawoq:q@'*'&'~^x ./:/:q
dla każdej strzałki wybierz pierwszą opcję, która wyląduje na kontrze@[,/r;s/+q;:;A@D?q-p]
spłaszczr
i umieść na niej strzały w ich nowych pozycjach i w nowych kierunkachs#
zmienić kształt do oryginalnego kształtuźródło
Węgiel drzewny , 105 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Obejmuje 22 bajty używane w celu uniknięcia konieczności uciążliwego formatu wejściowego. Wyjaśnienie:
Dogodnie wprowadź kontury i liczbę kroków.
Znaki kierunku są używane kilka razy, więc łańcuch jest tutaj buforowany. Indeks znaku kierunku w tym ciągu nazywany jest jego kierunkiem.
Wydrukuj oryginalne kontury bez przesuwania kursora.
Pętla nad postaciami w konturze.
Jeśli obecne znaki są znakami kierunku ...
... następnie zapisz kierunek i pozycję na liście ...
... i zamień znak na odpowiedni znak linii.
W przeciwnym razie wypisz postać i przejdź do następnej postaci.
Pętla nad zapisanymi pozycjami.
Przejdź do zapisanej pozycji.
Wyodrębnij zapisany kierunek.
Zapętlaj odpowiednią liczbę kroków.
Znajdź kierunek następnego kroku, którym jest dowolny kierunek, który nie jest ani odwrotny, ani pusty.
Zrób krok w tym kierunku. (Wskaźniki kierunku węgla dla
Move
polecenia są dwa razy większe niż mój kierunek).Wydrukuj odpowiedni znak kierunku.
źródło
APL (Dyalog Unicode) , 111 bajtów SBCS
Wypróbuj online!
podobny do mojej odpowiedzi k
źródło