Opis
Zadaniem tego wyzwania jest opracowanie programu lub funkcji, która śledzi dany obiekt w przestrzeni .
I / O
Twój program otrzyma 3 dane wejściowe, które można wykorzystać w dowolny rozsądny sposób :
n
będzie wielkości boku samolotu. (Zatem, dla , samolot będzie ). Możesz założyć, n
że zawsze będzie nieparzysta liczba całkowita.
s
będzie początkową pozycją obiektu, podaną jako para współrzędnych .
D
będzie wektorem uporządkowanych par. D
będzie miała postać , gdzie będzie zawsze jednym z 'N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'
, dla kardynalnego i pierwotnego kierunku międzysercowego, a będzie liczbą całkowitą dla liczby „tyknięć”.
Biorąc pod uwagę te dane wejściowe, program musi wyprowadzić śledzenie obiektu w płaszczyźnie.
Zasady
Dane wyjściowe muszą zawierać granice płaszczyzny. Na przykład:
- 21012 + + ┌─────┐ 2│ │ 1│ │ 0│ │ 1│ │ 2│ │ -└─────┘
byłby przykładem pustej płaszczyzny . Liczby powyżej i z boku mają jedynie charakter poglądowy i nie muszą być drukowane.
Możesz użyć dowolnego znaku (znaków) dla granic, o ile nie jest to biały znak (lub jest renderowany jako biały znak). Wybrane postacie muszą wyznaczyć pełną płaszczyznę, co oznacza, że między nimi nie może być przerw.
Niektóre akceptowalne samoloty obejmują: ┌──┐ .... ---- + - + │ │. . | | | | │ │. . | | | | └──┘; ....; ----; + - + Niedopuszczalne samoloty obejmują: .... .... ++++. . . . + +. . . + +. . ; ....; ....; + +; . .
Obiektem, który ma być śledzony, może być dowolny wybrany przez ciebie znak, o ile zajmuje on tylko 1 pole na płaszczyźnie i różni się od znaków granicznych.
Śladem śledzonego obiektu mogą być również dowolne wybrane znaki, o ile zajmują one tylko 1 miejsce na płaszczyźnie i różnią się od obiektu.
Dla każdego elementu w obiekt musi przesunąć spacje w kierunku i pozostawić ślad za sobą.
Jeśli obiekt uderzy w granicę, zostanie odbity. Jeśli obiekt nadal ma jakieś ruchy, będzie poruszał się w kierunku, w którym został odbity.
Dla odniesienia, te kierunki odzwierciedlają się nawzajem:
→ po spełnieniu górnej lub dolnej granicy;
→ po spełnieniu granicy bocznej;
Ostateczne dane wyjściowe będą zawierać najnowsze możliwe ślady, to znaczy, jeśli obiekt pozostawiłby ślad w miejscu, w którym już jest ślad, nowszy znak śledzenia zastąpi starszy.
Jak zwykle standardowe luki są domyślnie zabronione .
Punktacja:
To wyzwanie dla golfa .
Przykłady:
Dane wejściowe: , ,
Opracowanie:
0 ┌─────┐ │ │ │ │ 0│ ○ │ │ │ │ │ └─────┘
0 ┌─────┐ │ ○ │ │ \ │ 0│ \ │ │ │ │ │ └─────┘
0 ┌─────┐ │∧ │ │ | \ │ 0│ ○ \ │ │ │ │ │ └─────┘
0 ┌─────┐ │∧ │ │ | \ │ 0│└ ○ \ │ │ │ │ │ └─────┘
(Zera są tylko w celach informacyjnych i nie muszą znajdować się w końcowym wyniku).
Dane wejściowe:
0 ┌─────────┐ │ │ │ │ │ │ │ ∧ │ 0│ / | │ │ ○ / | │ │⟨ / │ │ \ / │ │ ∨ │ └─────────┘
0 ┌─────────┐ │ ○ │ │ \ │ │ \ │ │ \ │ 0│ / | ⟩│ │ ∧ / / │ │⟨ \ / / │ │ \ \ / │ │ ∨ ∨ │ └─────────┘
Przypadki testowe:
Dane wejściowe: ,
Wynik:
0 ┌─────┐ │∧ │ │ | \ │ 0│└ ○ \ │ │ │ │ │ └─────┘
Dane wejściowe: , ,
Wynik:
0 ┌─────────┐ │ ○ │ │ \ │ │ \ │ │ \ │ 0│ / | ⟩│ │ ∧ / / │ │⟨ \ / / │ │ \ \ / │ │ ∨ ∨ │ └─────────┘
Dane wejściowe: , ,
Wynik:
0 ┌───┐ │ | │ 0│- ○ ┐│ │ | │ └───┘
Dane wejściowe: , ,
Wynik:
0 ┌───────────┐ │ ∧ │ │ / \ │ │┌ - / - \ \ │ │ \ | / \ \ │ │ \ | \ \ │ 0│ | / ⟩│ │ | \ / / │ │ | / ○ │ │ | / \ │ │ ∨ \ │ │ \ │ └───────────┘
'N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'
zamiast tego możemy przyjmować jako liczbę całkowitą 0-indeksowaną (lub 1-indeksowaną)? Tak[('NW',2),('S',2),('E',1)]
staje się[[7,2],[4,2],[2,1]]
na przykład.Odpowiedzi:
JavaScript (ES6), 228 bajtów
(n,x,y,[[dir,len],[dir,len],...])
Generuje ciąg znaków z
0
dla granicy,1
dla śladu i3
dla końcowej pozycji.Wypróbuj online!
W jaki sposób?
Inicjowanie i rysowanie w „kanwie” (tj. Matrycy znaków) jest w JavaScript nieco uciążliwe i długotrwałe.
Ten kod stosuje inną strategię: zamiast przechowywać dane wyjściowe w tablicy 2D, buduje ciąg znaków po znaku, od lewej do prawej i od góry do dołu. Przy każdej iteracji:
0
jeśli przekroczymy granicę.1
albo3
jeśli, albo spację w inny sposób.Podsumowując, może nie jest to najkrótsze podejście, ale pomyślałem, że warto spróbować.
źródło
Java 10,
350343340336 bajtówD
2D jest liczbą całkowitą z matrycą, w którym kierunki są 0 indeksowanych liczb całkowitychN=0, NE=1, E=2, SE=3, S=4, SW=5, W=6, NW=7
. Początkowex,y
współrzędne będą dwoma oddzielnymi parametramis
iS
. Wynikiem jest macierz znaków.Używa
#
jako granicy,*
ścieżki iO
dla pozycji końcowej (ale wszystkie trzy mogą być dowolnymi znakami ASCII w zakresie Unicode[33,99]
dla tej samej liczby bajtów, jeśli chcesz).Wypróbuj online.
-4 bajty dzięki @ceilingcat .
Można zdecydowanie zagrać w golfa, upraszczając ruchy i kierunek, w którym podróżujemy.
Wyjaśnienie:
y<2&i<2|y>=n&i>2&i<5?4-i:x<2&i>4|x>=n&i>0&i<4?8-i:y<2&i>6?5:y<n|i!=5?i:7
to gra w golfa poniżej, przy użyciu4-i
i8-i
dla większości zmian kierunku:źródło
Węgiel drzewny , 74 bajty
Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane w formacie n, x, y, d, gdzie d jest tablicą tablic par [odległość, kierunek], gdzie kierunek jest kodowaniem numerycznym 0 = południe zgodnie z ruchem wskazówek zegara do 7 = południowy wschód. Wyjaśnienie:
Wprowadź
n
i narysuj pole, którego wnętrze ma rozmiar wyśrodkowany na początku.Wejdź i przeskocz do
x
iy
(ale zaneguj,y
ponieważ oś y Węgla rośnie w dół).Pętla nad wpisami w
d
.Wyodrębnij początkowy kierunek.
Powtórz dla żądanej odległości.
Zapisz kierunek.
Wykonaj eksperymentalny ruch w tym kierunku.
Jeśli to zejdzie na boki, odwróć kierunek w poziomie.
Jeśli to zejdzie z góry lub z dołu, odwróć kierunek w pionie.
Zmniejsz kierunek modulo 8 (polecenia Pivot akceptują tylko wartości od 0 do 7).
Cofnij eksperymentalny ruch.
Ustaw właściwy kierunek, a następnie wydrukuj ślad i przesuń.
Odwróć się do domyślnego kierunku i wydrukuj obiekt w bieżącej pozycji.
źródło
JavaScript, 206 bajtów
Pobiera dane wejściowe jako (n, x, y, [[katalog, len], [katalog, len], ...]), gdzie kierunki są kodowane za pomocą masek bitowych:
Zwraca ciąg z
Różne wartości granic służą do oceny następnego kierunku
Mniej golfa
TEST
źródło
C (gcc) ,
352323 bajtyGra w golfa w dół o 29 bajtów dzięki pułapowi cat.
Wypróbuj online!
Program przyjmuje dane wejściowe jako argumenty wiersza poleceń (jak
a.out 10 1 1 3 5 0 4 7 2
):E
Wyjaśnienie
źródło