Narysuj prostopadłościan ASCII

14

Biorąc pod uwagę trzy liczby całkowite> = 2, utwórz sześcian ASCII w rzucie ortogonalnym (szafkowym). Trzy liczby całkowite przedstawiają wysokość, szerokość i głębokość (mierzone widocznymi znakami), w tym rogi. Narożniki powinny być „o” lub „+”, dowolny wybór.

w: 10, h: 5, d: 4 Tak więc daje:

   o--------o
  /        /|
 /        / |
o--------o  |
|        |  o
|        | /
|        |/
o--------o

Teraz, aby uczynić to nieco trudniejszym, wszystkie twarze mogą być pełne, przezroczyste lub może ich brakować. Zamawiamy twarze w następujący sposób:

   o--------o
  /        /|
 /    2   / |
o--------o 3|
|        |  o
|   1    | /
|        |/
o--------o

  ---
  |2|
-------
|5|1|3|
-------
  |4|
  ---
  |6|
  ---

I podaj listę tokenów, S, T lub M. Oryginalny przykład to:

w 10
h 5
d 4
S S S S S S

   o--------o
  /        /|
 /        / |
o--------o  |
|        |  o
|        | /
|        |/ 
o--------o

Jeśli jedna twarz jest przezroczysta, możemy zobaczyć wszystko, co się za nią kryje:

T S S S S S

   o--------o
  /        /|
 /        / |
o--------o  |
|  o-----|  o
| /      | /
|/       |/
o--------o


T T T T T T

   o--------o
  /|       /|
 / |      / |
o--------o  |
|  o-----|--o
| /      | /
|/       |/
o--------o

W przypadku par brakujących ścian sąsiednie krawędzie lub narożniki nie są już widoczne:

M M S S S S

   o--------o
  /|       /|
 / |      / |
o  |     o  |
|  o-----|  o
| /      | /
|/       |/
o--------o

M M S S M S

   o--------o
   |       /|
   |      / |
   |     o  |
   o-----|  o
  /      | /
 /       |/
o--------o

Code golf, najkrótszy kod wygrywa! Końcowe spacje i znaki nowej linii są w porządku, możesz wybrać metodę wprowadzania i kolejność wprowadzania.

NiklasJ
źródło
5
Jak ścisły jest twój format wejściowy? czy mogę wykonać funkcję z 9 parametrami?
LiefdeWen
1
@LiefdeWen you're free to choose input method and input order. A ponieważ nic nie mówi inaczej, można zastosować dowolną z domyślnych metod wejścia / wyjścia .
dzaima
Czy mogę wziąć liczbę całkowitą jako mapę bitową dla flag przezroczystych / stałych?
Titus
@Titus Cóż .. w porządku. Wydaje mi się, że jest to trochę bardziej zabawne, jeśli naprawdę możesz samodzielnie przetestować wartości.
NiklasJ

Odpowiedzi:

5

Węgiel drzewny , 190 181 bajtów

NωA⁻ω²ςNηA⁻η²γNδA⁻δ²χA⪪S αF›⊟αMF⟦ςγςγ⟧«oκ↶»F∧›⊟αM²«oς↷³oχ↷¹»F∧›⊟αM²«↷³oχ↷³oγ↶»M⁻ωδ⁻δηF⁼§α²SG↗δ↓η↙δ↑η F∧›⊟αM²«↶¹oχ↷³oγ↷»F⁼§α¹SG↗δ←ω↙δ→ω F∧›⊟αM²«↶¹oχ↶³oς»F⁼§α⁰SUO±ωη ↷F›⊟αMF⟦γςγς⟧«oκ↷

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisałem 9 bajtów, optymalizując moje warunki. Węgiel drzewny nie ma elsetokena, więc ifpolecenia zawsze mają dwie możliwości, chyba że znajdują się na końcu bloku lub programu. Aby tego uniknąć, używam for (<bool>)zamiast tego, if (<bool>)który ma podobny efekt, gdy wyrażenie może mieć tylko wartości 0 lub 1, ale zapisuje bajt. (W celu osiągnięcia tego musiałem zmienić wyrażeń, tak aby były one zawsze prawdziwe, gdy organizm musiał być wykonywany.) Byłem również w stanie zoptymalizować if (<bool>) for (<int>)pod for (And(bool, int)).

Neil
źródło
Święty Chrystus O_O. Nie mogłem nawet wymyślić, jak narysować sam sześcian za pomocą węgla drzewnego. Czy możesz podać przykład, aby narysować prostą kostkę w folderze przykładów github? Zoptymalizowany? Chcę porównać moją podobną ... 50 bajtową odpowiedź z tym, co powinno być.
Magic Octopus Urn
@carusocomputing Przepraszam, nie jestem pewien, co masz na myśli przez „prostą kostkę”, i nie jestem autorem samego węgla drzewnego, więc nie mogę dodać przykładu.
Neil
Nie jesteś ?! Cholera jasna, kto to jest? Szczerze myślałem, że jesteś. Prosiłbym również, aby zostać dostawcą węgla drzewnego. Możesz łatwo zostać jednym na github :). Oczywiście jesteś utalentowany w języku. I przez „prostą kostkę” mam na myśli pierwszą połowę wyzwania, po prostu zrobienie X * Y * Z kostki ASCII.
Magic Octopus Urn
@carusocomputing tylko ASCII jest głównym źródłem, o ile mogę powiedzieć, chociaż wiki esolang przypisuje drugiego autora.
Neil
przynajmniej skontaktuję się z nimi z kilkoma twoimi przykładami, posunąłeś się dalej niż ktokolwiek inny, kogo widziałem. Chciałbym uzyskać więcej objaśnień do twojego kodu, śledziłem już trochę twoje odpowiedzi na węgiel drzewny, ponieważ język jest dla mnie interesujący.
Magic Octopus Urn
2

JavaScript (ES6), 318 314 308 bajtów

Przyjmuje szerokość, wysokość i głębokość jako liczby całkowite, a twarze jako tablicę znaków.

(w,h,d,l,M=(n,F)=>[...Array(n+1).keys()].map(F),a=M((L=w--+d)*(h--+--d),i=>++i%L?' ':`
`),D=(t,Y=0,X=d,W=t&1?d:w,H=t&2?d:h,F=l[t>>2])=>F>'R'&&M(W,i=>M(H,j=>a[p=L*(Y+j-i*(t&1))+X+i-(t&2?j:0)]=(x=!(i&&i-W)|2*!(j&&j-H))?' |-o|/o/-o'[t%4*3+x]:a[F>'S'?p:0])))=>D(20)&D(D(14,h)&D(17,d,0),d,D(9,d,w)&D(6))||a.join``

W jaki sposób?

Funkcja M () przetwarza dane wywołanie zwrotne F w danym zakresie [0 ... n] .

M = (n, F) => [...Array(n + 1).keys()].map(F)

Zmienna a zawiera płaską tablicę reprezentującą siatkę wielkości (w + d) x (h + d-1) . Początkowo jest wypełniony rzędami spacji zakończonych znakami nowej linii.

a = M((L = w-- + d) * (h-- + --d), i => ++i % L ? ' ' : '\n')

Funkcja D () służy do „rysowania” powierzchni prostopadłościanu.

Dwa najmniej znaczące bity parametru t zawierają typ twarzy:

  • 0 = tył / przód
  • 1 = lewo / prawo
  • 2 = dół / góra

Bity od 2 do 4 przechowują indeks twarzy oparty na 0.

D = (                                           // given:
  t, Y = 0, X = d,                              // - the type and the initial coordinates
  W = t & 1 ? d : w,                            // - the drawing width
  H = t & 2 ? d : h,                            // - the drawing height
  F = l[t >> 2]                                 // - the character representing the status
) =>                                            //
  F > 'R' &&                                    // provided that the face is not missing:
  M(W, i =>                                     // for each i in [0...W]:
    M(H, j =>                                   //  for each j in [0...H]:
      a[                                        //    update the output
        p = L * (Y + j - i * (t & 1)) +         //    at position p
            X + i - (t & 2 ? j : 0)             //
      ] =                                       //    with either:
      (x = !(i && i - W) | 2 * !(j && j - H)) ? //    - '|', '-' or '/' on edges
        ' |-o|/o/-o'[t % 4 * 3 + x]             //    - or 'o' on vertices
      :                                         //
        a[F > 'S' ? p : 0]                      //    - or a space on solid faces
    )                                           //    - or the current character on
  )                                             //      transparent faces

Twarze są rysowane w następującej kolejności:

D(5 * 4 + 0, 0, d)  // face #5 (rear)
D(3 * 4 + 2, h, d)  // face #3 (bottom)
D(4 * 4 + 1, d, 0)  // face #4 (left)
D(2 * 4 + 1, d, w)  // face #2 (right)
D(1 * 4 + 2, 0, d)  // face #1 (top)
D(0 * 4 + 0, d, 0)  // face #0 (front)

Próbny

Arnauld
źródło
1

SOGL V0.11 , 200 194 193 192 190 bajtów

b³@*⁶
ž}1}X⁵
;aκ⁴
2-³
* o1Ο²
d=?a³:?∫:¹
be.Aā6∫D,ζLI%:C?abe"DCa∫:c+H⁴d+ /ž}{"a+Hy"e³┐²čž|"b³┌²žz"EBAøp”,ōkB°s9θW=*↑(⅜⅞~υ=\⁰ōwūΧ►ΣΤP░¶Ο⁽◄Φ7⅟▲s#‘┌Θdwι+#¶ŗ!!6c=?6d=?2aI⁶e³∙ž}5¹b+⁴Ie³@∙⁵}4¹2+⁴⁶⁵

Pobiera dane wejściowe w kolejności

width
height
depth
down-face
left-face
back-face
top-face
right-face
front-face

Związany!
Wypróbuj tutaj! (wartość skompresowana zmieniona na kompatybilną z V0.12)

dzaima
źródło