Vẽ một hình khối ASCII


14

Cho ba số nguyên> = 2, tạo một khối ASCII trong phép chiếu trực giao (tủ). Ba số nguyên biểu thị chiều cao, chiều rộng và chiều sâu (được đo bằng các ký tự hiển thị) bao gồm các góc. Các góc nên là 'o' hoặc '+', lựa chọn miễn phí.

w: 10, h: 5, d: 4 Do đó cho:

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

Bây giờ, để làm cho điều này hơi khó hơn, tất cả các khuôn mặt có thể là rắn, trong suốt hoặc thiếu. Chúng tôi đặt hàng những khuôn mặt như thế này:

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

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

Và cung cấp một danh sách các mã thông báo, S, T hoặc M. Ví dụ ban đầu là:

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

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

Nếu một mặt trong suốt, chúng ta có thể thấy bất cứ thứ gì đằng sau nó:

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

Đối với các cặp mặt bị thiếu, các cạnh hoặc góc liền kề không còn hiển thị:

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

Mã golf, mã ngắn nhất thắng! Không gian lưu trữ và dòng mới là tốt, bạn có thể tự do chọn phương thức nhập và thứ tự nhập.


5
Làm thế nào nghiêm ngặt là định dạng đầu vào của bạn? Tôi có thể tạo một hàm với 9 tham số không?
LiefdeWen

1
@LiefdeWen you're free to choose input method and input order. Và như không có gì khác, bất kỳ phương thức nhập / xuất mặc định nào cũng có thể được sử dụng.
dzaima

Tôi có thể lấy một số nguyên làm bitmap cho các cờ trong suốt / rắn không?
Tít

@Titus Vâng .. được rồi. Tôi đoán sẽ thú vị hơn một chút nếu bạn thực sự có thể tự kiểm tra các giá trị.
NiklasJ

Câu trả lời:


5

Than , 190 181 byte

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κ↷

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉnh sửa: Đã lưu 9 byte bằng cách tối ưu hóa các điều kiện của tôi. Than không có elsemã thông báo, vì vậy ifcác lệnh luôn có hai lựa chọn thay thế, trừ khi chúng ở cuối một khối hoặc chương trình. Để tránh điều này, tôi sử dụng for (<bool>)thay vì if (<bool>)có hiệu ứng tương tự khi biểu thức chỉ có thể có các giá trị 0 hoặc 1 nhưng lưu một byte. (Để đạt được điều này, tôi đã phải thay đổi các biểu thức sao cho chúng luôn đúng khi cơ thể cần được thực thi.) Tôi cũng có thể tối ưu hóa if (<bool>) for (<int>)thành for (And(bool, int)).


Chúa Kitô O_O. Tôi thậm chí không thể tìm ra cách vẽ khối lập phương bằng than. Bạn có thể đưa ra một ví dụ để vẽ một khối lập phương đơn giản trên thư mục ví dụ github không? Một trong đó đã được tối ưu hóa? Tôi muốn so sánh câu trả lời giống như ... 50 byte của mình với câu trả lời.
Bạch tuộc ma thuật Urn

@carusocomputing Xin lỗi, tôi không rõ ý của bạn về "khối lập phương đơn giản" và tôi không phải là tác giả của chính Than, vì vậy tôi không thể thêm một ví dụ.
Neil

Bạn không?! Chúa ơi, ai vậy? Tôi thành thật nghĩ rằng bạn là. Ngoài ra, tôi yêu cầu được đóng góp than. Bạn có thể dễ dàng trở thành một người trên github :). Rõ ràng bạn có tài về ngôn ngữ. Và với "khối lập phương đơn giản", ý tôi là nửa đầu của thử thách, chỉ tạo ra một X * Y * Z khối ASCII.
Bạch tuộc ma thuật Urn

@carusocomputing ASCII-only là người đóng góp chính theo như tôi có thể nói, mặc dù wiki esolang ghi có đóng góp thứ hai.
Neil

ít nhất là tôi đã liên lạc với họ với một vài ví dụ của bạn, bạn đã đưa nó đi xa hơn bất kỳ ai khác tôi từng thấy. Tôi rất muốn nhận được nhiều lời giải thích về mã của bạn, tôi đã theo dõi câu trả lời Char than của bạn một chút vì ngôn ngữ này rất thú vị đối với tôi.
Bạch tuộc ma thuật Urn

2

JavaScript (ES6), 318 314 308 byte

Lấy chiều rộng, chiều cao và chiều sâu làm số nguyên và các mặt như một mảng ký tự.

(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``

Làm sao?

Hàm M () xử lý một cuộc gọi lại F đã cho trên một phạm vi nhất định [0 ... n] .

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

Biến a giữ một mảng phẳng biểu thị một lưới có kích thước (w + d) x (h + d - 1) . Nó ban đầu được lấp đầy với các hàng không gian kết thúc bằng dòng mới.

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

Hàm D () được sử dụng để 'vẽ' một mặt của hình khối.

Hai bit có ý nghĩa nhỏ nhất của tham số t giữ kiểu mặt:

  • 0 = phía sau / phía trước
  • 1 = trái / phải
  • 2 = đáy ​​/ đỉnh

Các bit # 2 đến # 4 giữ chỉ số khuôn mặt dựa trên 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

Các mặt được vẽ theo thứ tự sau:

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)

Bản giới thiệu


1

SOGL V0.11 , 200 194 193 192 190 byte

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+⁴⁶⁵

Đưa đầu vào theo thứ tự

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

Bị trói!
Hãy thử nó ở đây! (giá trị nén được thay đổi thành tương thích V0.12)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.