Piaskownica
Na potrzeby bieżącego zadania sześcian o długości jednostki jest renderowany w skośnym rzucie za pomocą symboli ASCII w następujący sposób:
+-----+
/ /|
+-----+ |
| | +
| |/
+-----+
+
dla wierzchołków.-
dla krawędzi X. Długość jednostki wzdłuż X jest reprezentowana przez pięć-
między dwoma wierzchołkami.|
dla krawędzi Y. Długość jednostki wzdłuż Y jest reprezentowana przez dwa|
między dwoma wierzchołkami./
dla krawędzi Z. Długość jednostki wzdłuż Z jest reprezentowana przez jeden/
między dwoma wierzchołkami.- Wierzchołki są rysowane tylko tam, gdzie przecinają się wszystkie trzy płaszczyzny.
- Krawędzie są rysowane tylko tam, gdzie przecinają się dokładnie dwie płaszczyzny.
Kiedy powierzchnia jednostki jest wyciągana, jest ona przesunięta o długość jednostki od jej pierwotnej pozycji i dla każdego kierunku tworzone są cztery nowe krawędzie (dodatnia i ujemna).
Można myśleć o wytłoczeniu jako o rysowaniu osi trójwymiarowego kartezjańskiego układu współrzędnych, w którym każda oś jest reprezentowana jako prostopadłościan o przekroju 1x1 i długości n
od (0,0,0)
Wytłaczany przez 1 wzdłuż X:
+-----------------+
/ /|
+-----------------+ |
| | +
| |/
+-----------------+
Zadanie
Biorąc pod uwagę trzy liczby dla osi XYZ, wyciągnij ściany sześcianu jednostkowego symetrycznie o wskazane ilości i renderuj wynik za pomocą symboli ASCII, jak określono powyżej.
Wkład
x, y, z - liczby nieujemne - długości wytłaczania dla odpowiednich osi. 0 oznacza brak wytłaczania. Dane wejściowe mogą składać się z trzech cyfr, listy trzech liczb, potrójnej, ciągu znaków lub dowolnej innej dogodnej dla Ciebie pozycji.
Wydajność
Rysunek kostki ASCII po wytłoczeniu. Dozwolone są wiodące i końcowe przestrzenie.
Przypadki testowe
X Y Z
0 0 0
+-----+
/ /|
+-----+ |
| | +
| |/
+-----+
1 0 0
+-----------------+
/ /|
+-----------------+ |
| | +
| |/
+-----------------+
0 0 1
+-----+
/ /|
/ / |
/ / +
/ / /
/ / /
+-----+ /
| | /
| |/
+-----+
1 1 0
+-----+
/ /|
+-----+ |
+---| | +-----+
/ | |/ /|
+-----+ +-----+ |
| | +
| |/
+-----+ +-----+
| | +
| |/
+-----+
2 0 1
+-----+
/ /|
+-----------+ +-----------+
/ /|
+-----------+ +-----------+ |
| / /| | +
| +-----+ | |/
+---------| | +-----------+
| |/
+-----+
1 1 1
+-----+
/ /|-+
+-----+ |/|
+---| | +-----+
/ | |/ /|
+-----+-----+-----+ |
| / /| | +
| +-----+ | |/
+---| | +-----+
| |/| +
+-----+ |/
+-----+
Kryteria wygranej
Najkrótsze rozwiązanie w bajtach w każdym języku wygrywa. Dodaj krótki opis zastosowanej metody i kod.
Odpowiedzi:
JavaScript (ES6),
525 ... 475 471459 bajtówZaoszczędź 13 bajtów dzięki @Neil
Pobiera dane wejściowe jako tablicę
[X,Y,Z]
. Zwraca macierz znaków.Wypróbuj online!
W jaki sposób?
Rysowanie kroków
Wyjście składa się z 15 stron, narysowanych w określonej kolejności.
Realizacja
Funkcja rysowania tog . Działa z następującymi parametrami:
Wierzchołki są zawsze rysowane. W zależności od wartości innego parametruc krawędzie są rysowane lub kasowane.
Jeślit=0 , funkcja rysuje przednią stronę:
Jeślit=1 , rysuje górną stronę:
Jeślit=2 , rysuje prawą stronę:
Współrzędne(x,y) i rozmiar (w,h) każdej strony mają stałą wartość lub zależą dokładnie od jednej ze zmiennych wejściowych: X , Y lubZ
Podsumowując, strona jest w pełni opisana przez:
Dlatego musimy przechowywać następujące 10 parametrów dla każdej strony:
Poniżej znajdują się parametry 15 stron, które należy narysować:
Wynikiem jest 15 liczb dokładnie 10 cyfr dziesiętnych, które są przechowywane jako 15 grup po 7 cyfr w bazie 36.
Na przykład pierwsza strona jest kodowana jako
4032070460
i przechowywana jako1uol9h8
.źródło
Array(W*2+9).fill` `
oszczędza bajt.APL (Dyalog Classic) ,
162161132130 bajtówWypróbuj online!
(1 + 4*cx + 2*cy + cz) mod 16
gdziecx
,cy
,cz
to liczba samej wartości „pręty” wzdłuż osi x, y, z, to jest wektory wzdłuż tej osi, która składa o tej samej wartości: 0 0 lub 1 1. robimy wyjątek, jeśli podtablica ma wartość zero (lub wszystko-jeden - to nie ma znaczenia) i rozważamy jej liczbę 0 zamiast 28-|/+
dziękuje Scottowi Milnerowi za wykrycie, że niektórzy
+
są renderowani jako?
sźródło
Węgiel drzewny , 325 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wprowadź wyciągnięcia, ale przedwcześnie je zachowaj, aby zaoszczędzić bajty.
Jeśli co najmniej dwa profile są zerowe, po prostu narysuj prostopadłościan o wymiarach (2x + 1, 2y + 1, 2z + 1). Inaczej:
Wydrukuj lewy profil, jeśli istnieje.
Wydrukuj dolny profil, jeśli istnieje.
Wydrukuj tylny profil, jeśli istnieje.
Wszystkie pozostałe profile spotykają się w tym momencie (który nie jest rysowany do samego końca!)
Wydrukuj przedni profil, jeśli istnieje, zwracając uwagę na usunięcie części lewych i dolnych profili, które mogą się nakładać.
Wydrukuj górny profil, jeśli istnieje, zwracając uwagę na usunięcie części tylnej i lewej, które mogą się pokrywać.
Wydrukuj odpowiedni profil, jeśli taki istnieje, zwracając uwagę na usunięcie części profili dolnych i tylnych, które mogą się pokrywać.
Narysuj połączenia między tymi ostatnimi wyciągnięciami.
źródło
Węgiel drzewny ,
195164144 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Publikuję to jako osobną odpowiedź, ponieważ używa zupełnie innego podejścia do rysowania wyciągnięcia. Wyjaśnienie:
Wprowadź wyciągnięcia i oblicz połowę wielkości otaczającego prostopadłościanu, ale w liczbach całkowitych, ponieważ zakresy Węgla są zawsze liczbami całkowitymi. Początek danych wyjściowych jest odwzorowany na środku oryginalnej kostki jednostkowej.
Zapętlić wszystkie współrzędne w obrębie (w tym granicy) prostopadłościanu zawierającego wytłoczenie.
Przejdź do pozycji wyjściowej odpowiadającej tym współrzędnym.
Z podanych współrzędnych zajrzyj we wszystkich ośmiu ukośnych kierunkach, aby ustalić, czy wytłoczenie zachodzi w tym kierunku. Zerknięte współrzędne są sprawdzane, czy nadal znajdują się w prostopadłościanie, a następnie liczba osi, w których współrzędna leży w pierwotnym sześcianie, musi być większa niż 1. Zwróć uwagę, że ponieważ sześcian ma nieparzystą wysokość wyświetlania, wartości osi Y zerkane są liczbami całkowitymi, podczas gdy inne osie używają współrzędnych ułamkowych.
Rozważ liczbę kierunków, w których wytłoczenie zachodzi na siebie. Istnieje pięć interesujących przypadków, w których chcemy coś wydrukować, tak jak w przypadku zera, co oznacza, że jest to pusta przestrzeń i nie chcemy niczego drukować, podczas gdy w przypadku ośmiu oznacza to, że jest to wewnątrz wytłoczenie i wszystko, co wydrukujemy, zostanie nadrukowane warstwą bliższą punktu oczu.
Jeśli wytłoczenie zachodzi tylko w jednym kierunku, to jest to narożnik zewnętrzny i musimy wygenerować a
+
.Jeśli wytłoczenie zachodzi na siebie w dwóch kierunkach, oznacza to krawędź zewnętrzną. Jaki rodzaj krawędzi określa się na podstawie separacji między dwoma zakładkami; 6 i 7 to krawędzie skierowane tyłem do kierunku jazdy i zostaną nadpisane, 4 to krawędź ukośna, 2 to krawędź pionowa, a 1 to krawędź pozioma. (Właściwie obliczam 7 minus separację, ponieważ wydaje się to łatwiejsze.)
Jeśli wytłoczenie zachodzi na siebie w trzech kierunkach, to jest to wewnętrzny narożnik w przypadku, gdy jeden z wytłoczeń ma wartość zero i musimy wygenerować a
+
.Jeśli wytłoczenie zachodzi na siebie w czterech kierunkach, wówczas istnieją dwa przypadki: twarze (w dowolnym kierunku) i wewnętrzne rogi w przypadku z trzema dodatnimi wytłoczeniami. W tym drugim przypadku widz ma nieparzystą liczbę zakładek.
Jeśli wytłoczenie zachodzi na siebie w sześciu kierunkach, oznacza to wewnętrzną krawędź. Działa jak dopełnienie zewnętrznej krawędzi, z tą różnicą, że interesuje nas tylko wtedy, gdy jedna z dwóch pustych przestrzeni jest kierunkiem w stronę punktu oka (ostatni wpis w tablicy).
źródło
K (ngn / k) , 172 bajty
Wypróbuj online!
obowiązkowe przepisanie mojego rozwiązania APL
ten sam algorytm, z wyjątkiem tego, że renderowanie 3d-> 2d odbywa się przy użyciu (k ekwiwalentu) przypisania indeksu rozproszenia zamiast tworzenia macierzy 2d dla każdego elementu 3d i mieszania ich
źródło
ngn/apl
oferta w porównaniu doDyalog APL
rozwiązania?⍤
) i stencil (⌺
)