Đùn các mặt của khối lập phương đối xứng dọc theo XYZ


33

Hộp cát

Đối với các mục đích của nhiệm vụ hiện tại, một khối có độ dài đơn vị được hiển thị trong phép chiếu xiên với các ký hiệu ASCII như sau:

  +-----+
 /     /|
+-----+ |
|     | +
|     |/
+-----+
  • + cho các đỉnh.
  • -cho các cạnh X. Độ dài đơn vị dọc theo X được biểu thị bằng năm -giữa hai đỉnh.
  • |cho các cạnh Y. Độ dài đơn vị dọc theo Y được biểu thị bằng hai |giữa hai đỉnh.
  • /cho các cạnh Z. Độ dài đơn vị dọc theo Z được biểu thị bằng một /giữa hai đỉnh.
  • Các đỉnh chỉ được vẽ ở nơi cả ba mặt phẳng cắt nhau.
  • Các cạnh chỉ được vẽ ở nơi chính xác hai mặt phẳng cắt nhau.

Khi một mặt đơn vị được ép đùn, nó được bù bởi độ dài đơn vị từ vị trí ban đầu và bốn cạnh mới được tạo cho mỗi hướng (dương và âm).

Bạn có thể nghĩ đến việc ép đùn như vẽ các trục của hệ tọa độ 3D Cartesian trong đó mỗi trục được biểu diễn dưới dạng hình khối với tiết diện 1x1 và chiều dài ntừ (0,0,0)

Ép đùn bởi 1 dọc theo X:

  +-----------------+
 /                 /|   
+-----------------+ |
|                 | +
|                 |/
+-----------------+

Bài tập

Cho ba số cho các trục XYZ, đùn các mặt của khối đơn vị đối xứng với số lượng được chỉ định và hiển thị kết quả bằng các ký hiệu ASCII như được chỉ định ở trên.

Đầu vào

x, y, z - số không âm - chiều dài đùn cho các trục tương ứng. 0 có nghĩa là không đùn. Đầu vào có thể là ba số, một danh sách gồm ba số, bộ ba, chuỗi hoặc bất cứ thứ gì thuận tiện cho bạn.

Đầu ra

Bản vẽ ASCII của khối lập phương sau khi đùn. Hàng đầu và dấu vết được cho phép.

Các trường hợp thử nghiệm

X Y Z
0 0 0

  +-----+
 /     /|
+-----+ |
|     | +
|     |/
+-----+

1 0 0

  +-----------------+
 /                 /|   
+-----------------+ |
|                 | +
|                 |/
+-----------------+


0 0 1   
        +-----+
       /     /|
      /     / |
     /     /  +
    /     /  /
   /     /  /
  +-----+  /
  |     | / 
  |     |/
  +-----+


1 1 0

        +-----+
       /     /|      
      +-----+ |
  +---|     | +-----+
 /    |     |/     /|
+-----+     +-----+ |
|                 | +
|                 |/
+-----+     +-----+
      |     | +
      |     |/
      +-----+

2 0 1

                +-----+
               /     /|
  +-----------+     +-----------+
 /                             /|
+-----------+     +-----------+ |
|          /     /|           | +
|         +-----+ |           |/
+---------|     | +-----------+
          |     |/
          +-----+

1 1 1 

        +-----+
       /     /|-+   
      +-----+ |/|
  +---|     | +-----+
 /    |     |/     /|
+-----+-----+-----+ |
|    /     /|     | +
|   +-----+ |     |/
+---|     | +-----+
    |     |/| +
    +-----+ |/
      +-----+

Tiêu chí chiến thắng

Giải pháp ngắn nhất tính theo byte trong mọi ngôn ngữ sẽ thắng. Vui lòng thêm một mô tả ngắn về phương pháp được sử dụng và mã của bạn.


Có một giới hạn trên cho mỗi đùn?
Hiện thân của sự thiếu hiểu biết

@Embodiment of lơ là - 9 là đủ
Galen Ivanov

Câu trả lời:


14

JavaScript (ES6),  525 ... 475 471  459 byte

Đã lưu 13 byte nhờ @Neil

Đưa đầu vào như một mảng [X,Y,Z]. Trả về một ma trận các ký tự.

a=>([X,Y,Z]=a,m=[],W=X*6+Z*2,'1uol9h824lsqpq17de52u1okgnv21dnjaww111qmhx1gxf4m50xg6pb42kzijq21xyh34t0h2gueq0qznnza2rrimsg3bkrxfh3yrh0em').replace(/.{7}/g,s=>[[c,x,A,y,B,w,C,h,D,t]=parseInt(s,36)+s,Y*W,Z,X,Y|!W,Z*X,X*Y*!Z,X*Z*!Y,Y*Z*!X][c]&&(g=H=>V<h&&((m[r=y-(3-B)*p+(t>1?H-V:V)+Y*3+Z*2]=m[r]||Array(W*2+9).fill` `)[x-2*(3-A)*p+(t>1?V:H-V*t)+W]=` ${c>5?'  + ':t>1?'|-':'-|'}+/+`[(H%~-w?0:+t?4:2)|!(V%~-h)],g(++H<w?H:!++V)))(V=0,p=a[c%3],w-=-3*C*p,h-=-D*p))&&m

Hãy thử trực tuyến!

Làm sao?

Vẽ các bước

Đầu ra bao gồm 15 mặt, được vẽ theo thứ tự cụ thể.

hoạt hình

Thực hiện

Hàm vẽ là g . Nó hoạt động với các tham số sau:

  • (x,y) : nơi bắt đầu vẽ
  • w : chiều rộng
  • h : chiều cao
  • t : loại phụ

Các đỉnh luôn được vẽ. Tùy thuộc vào giá trị của một tham số c , các cạnh được vẽ hoặc xóa.

Nếu t=0 , hàm vẽ mặt trước:

...........      ...........
..+-----+..      ..+     +..
..|     |..  or  ..       ..
..|     |..      ..       ..
..+-----+..      ..+     +..
...........      ...........

Nếu t=1 , nó vẽ một mặt trên:

...........      ...........
...+-----+.      ...+     +.
../     /..  or  ..       ..
.+-----+...      .+     +...
...........      ...........

Nếu t=2 , nó vẽ một bên phải:

......+....      ......+....
...../|....      .....  ....
....+ |....  or  ....+  ....
....| +....      ....  +....
....|/.....      ....  .....
....+......      ....+......

(x,y)(w,h)XYZ . Bên cạnh đó, mỗi bên được rút ra khi và chỉ khi một điều kiện cụ thể được đáp ứng.

c[1..8] .

Tóm lại, một bên được mô tả đầy đủ với:

{ctx=ox+mx×Py=oy+my×Pw=ow+mw×Ph=oh+mh×P

Pc

Do đó, chúng ta cần lưu trữ 10 tham số sau cho mỗi bên:

[c,ox,mx,oy,my,ow,mw,oh,mh,t]

Dưới đây là các thông số của 15 mặt cần được rút ra:

sidecoxmxoymyowmwohmht0400237046014602346302226222403423366204030243062071240052220270341632600712301720222704008562224012294200370301101002370130111602313302126002070400137200070301148602040302

[0..9]

mx(mx+6)/2mymy+3mwmw/3

Kết quả là 15 số có đúng 10 chữ số thập phân, được lưu dưới dạng 15 nhóm 7 chữ số trong cơ sở 36.

Ví dụ, mặt đầu tiên được mã hóa dưới dạng 4032070460và được lưu trữ dưới dạng 1uol9h8.


Tôi nghĩ Array(W*2+9).fill` ` tiết kiệm một byte.
Neil

Rất tiếc, xin lỗi, xấu của tôi, tôi phải thấy nó sai hoặc một cái gì đó. Xem thường.
Hiện thân của sự thiếu hiểu biết

@EmbodimentofIgnorance Không phải lo lắng. :)
Arnauld

3
Hình dung tuyệt vời ngoài mô tả truyền thống mát mẻ của bạn! Sự tôn trọng!
Galen Ivanov

@GalenIvanov Cảm ơn bạn! Tôi thực sự thích làm việc với thử thách này.
Arnauld

13

APL (Dyalog Classic) , 162 161 132 130 byte

{' |+/+ +-? ??? ++'[⍉(⊃~∘0)⍤13⍉↑a↑¨⍨↓(--1-⌊/∘,)2-/1⌽↑⍳⍴a←16|29|1+{2⊥+/¨∊¨=⌿¨⍵(⍉⍵)(⍉↓⍵)}⌺2 2 2{⍉⍤2⍉⌽0,⍵}⍣63/↓2/61<⍵+.=⍨↑⍳1+2×⍵]}

Hãy thử trực tuyến!

  • tạo ra một mảng bool 3d của các khối đơn vị
  • nhân rộng mỗi cubie 6 3 2 lần dọc theo xyz
  • bao quanh với số không
  • cho mỗi 2 × 2 × 2 subarray tính toán một số giữa 0 và 16 xác định sản lượng char tương ứng: (1 + 4*cx + 2*cy + cz) mod 16nơi cx, cy, czlà số của cùng một giá trị "thanh" dọc theo trục x, y, z, tức là vectơ cùng mà trục đó bao gồm có cùng giá trị: 0 0 hoặc 1 1. chúng tôi tạo một ngoại lệ nếu phân đoạn là tất cả bằng không (hoặc tất cả - không quan trọng) và chúng tôi xem xét số 0 thay vì 28
  • cho mỗi ô tính toán trong đó char tương ứng sẽ được vẽ trên màn hình
  • cho mỗi ô xây dựng một ma trận trong suốt (0 đệm) chỉ chứa một "pixel" mờ
  • trộn các ma trận - tại thời điểm này, chúng ta có một mảng 5d với các kích thước inx, iny, inz, outx, outy
  • giảm ba trục đầu tiên, chỉ giữ vật phẩm không trong suốt (≠ 0) đầu tiên dọc theo chúng
  • sử dụng bảng tra cứu (một chuỗi) để chuyển đổi các số thành -|/+

cảm ơn Scott Milner vì đã phát hiện ra rằng một số +s được hiển thị là ?s


Làm thế nào để bạn thực sự kiểm tra điều này? Tôi muốn thử ép đùn 2,3,4 chẳng hạn, nhưng dường như không có gì rõ ràng để làm việc.
Neil

algo rất lãng phí, vì vậy 2 3 4 hết bộ nhớ, nhưng 2 3 3 là trong tầm tay
ngn

@Neil tôi đã thực hiện một sửa chữa nhỏ và bây giờ 2 3 4 hoạt động. mất một byte làm tác dụng phụ :)
ngn

Một giải pháp APL dài bằng một nửa Char than trong một thử thách nghệ thuật ascii ?! Chuyện gì đang xảy ra vậy?!
Xù xì

3
Không chắc chắn 100%, nhưng tôi khá chắc chắn rằng đây không phải là hành vi mong muốn vào 0 1 1
Scott Milner

6

Than , 325 byte

≔×⁶Nθ≔׳Nη≔⊗Nζ¿‹¹№⟦θηζ⟧⁰«B⁺⁷⊗θ⁺⁴⊗η↗↗⊕⊗ζ+⁺⁵⊗θP↙⊗⊕ζ↓+↓⁺²⊗η↙+↙⊕⊗ζ»«F‹⁰θ«↗+↗←+←⊖θ↙+/P→θ↓+↓²+⊖θ+»F‹⁰η«J⁶¦³↗+↗↓+↓⊖η↙+/P↑η←+←⁵↑+↑⊖η+»F‹⁰ζ«J⁸±²↓+↓↓↗+↗⊖ζ↑+↑²P↙ζ←+←⁵↙+↙⊖ζ+»J⁶¦⁰F‹⁰ζ«G↓³↙⊕ζ←⁷↑³↗⊕ζ ↙+↙⊖ζ↓+↓²+→⁵P↗ζ↑+↑²P←⁶↗+↗⊖ζ»F‹⁰η«G←⁶↑⊕η↗³→⁶↓⊕η ↑+↑⊖η←+←⁵↙+/P↓η+⁵P↗²↓+↓⊖η»F‹⁰θ«G↗²→⊕θ↓⁴↙²←⊕θ →+⊖θ↗+/↑+↑²P←θ↙+/P↓³←+←⊖θ»P↗∧∧θη²P↓∧∧ζθ³P←∧∧ηζ⁶+

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

≔×⁶Nθ≔׳Nη≔⊗Nζ

Nhập vào các ép đùn, nhưng đặt trước chúng để lưu byte.

¿‹¹№⟦θηζ⟧⁰«B⁺⁷⊗θ⁺⁴⊗η↗↗⊕⊗ζ+⁺⁵⊗θP↙⊗⊕ζ↓+↓⁺²⊗η↙+↙⊕⊗ζ»«

Nếu ít nhất hai trong số các điểm đùn bằng 0, thì chỉ cần vẽ một hình khối có kích thước (2x + 1, 2y + 1, 2z + 1). Nếu không thì:

F‹⁰θ«↗+↗←+←⊖θ↙+/P→θ↓+↓²+⊖θ+»

In đùn trái, nếu có.

F‹⁰η«J⁶¦³↗+↗↓+↓⊖η↙+/P↑η←+←⁵↑+↑⊖η+»

In ép đùn xuống, nếu có.

F‹⁰ζ«J⁸±²↓+↓↓↗+↗⊖ζ↑+↑²P↙ζ←+←⁵↙+↙⊖ζ+»

In đùn trở lại, nếu có.

J⁶¦⁰

Tất cả các điểm đùn còn lại đều gặp nhau tại thời điểm này (điều này không được rút ra cho đến khi kết thúc!)

F‹⁰ζ«G↓³↙⊕ζ←⁷↑³↗⊕ζ ↙+↙⊖ζ↓+↓²+→⁵P↗ζ↑+↑²P←⁶↗+↗⊖ζ»

In ép đùn phía trước, nếu có, chú ý xóa các phần của phần đùn trái và xuống có thể chồng lên nhau.

F‹⁰η«G←⁶↑⊕η↗³→⁶↓⊕η ↑+↑⊖η←+←⁵↙+/P↓η+⁵P↗²↓+↓⊖η»

In ép đùn lên, nếu có, cẩn thận để xóa các phần của lưng và đùn trái có thể chồng lên nhau.

F‹⁰θ«G↗²→⊕θ↓⁴↙²←⊕θ →+⊖θ↗+/↑+↑²P←θ↙+/P↓³←+←⊖θ»

In ép đùn bên phải, nếu có, chú ý xóa các phần của phần đùn xuống và phần sau có thể chồng lên nhau.

P↗∧∧θη²P↓∧∧ζθ³P←∧∧ηζ⁶+

Vẽ các phép nối giữa các đùn sau.


325 byte trong Than?! Trong một thử thách nghệ thuật ascii ?! Điều đó đủ để khiến tôi thậm chí không thử điều này trong pt (vaScri) pt!
Xù xì

@Shaggy Đây có thể không phải là một cách tiếp cận tối ưu, và có thể có những cách chơi golf mà tôi đã bỏ qua. Tôi phải nói rằng mặc dù phương pháp của ngn có vẻ hấp dẫn, nhưng có vẻ như anh ta vẽ hình dạng vào một mảng bên trong và sau đó thực hiện phát hiện cạnh để tạo đầu ra của mình.
Neil

@Shaggy Tôi đã đưa ra một giải pháp 195 byte, mà tôi đã đăng riêng vì đây là một cách tiếp cận hoàn toàn khác. Vẫn còn thiếu APL.
Neil

3

Than , 195 164 144 byte

≔⁺³×⁶Nθ≔⁺²×³Nη≔⊕⊗NζF…·±ζζF…·±ηηF…·±θθ«J⁻λι⁺κι≔⟦⟧δFE²↔⁻⁺ιμ·⁵FE²↔⁻κνFE²↔⁻⁺λξ·⁵⊞δ⌊⟦‹μζ‹νη‹ξθ‹¹№E⟦μνξ⟧‹π⊕ρ¹⟧≡Σδ¹+²§ |-/⁺⌕δ¹⌕⮌δ¹¦³+⁴§ +Σ…δ⁴¦⁶§ |-/⌕δ⁰

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Tôi đang đăng bài này như một câu trả lời riêng biệt vì nó sử dụng một cách tiếp cận hoàn toàn khác để vẽ khối. Giải trình:

≔⁺³×⁶Nθ≔⁺²×³Nη≔⊕⊗Nζ

Nhập các phần tử đùn và tính một nửa kích thước của hình khối kèm theo, nhưng theo số học số nguyên vì phạm vi của Char than luôn là số nguyên. Nguồn gốc của các bản đồ đầu ra đến trung tâm của khối đơn vị ban đầu.

F…·±ζζF…·±ηηF…·±θθ«

Lặp lại tất cả các tọa độ trong (bao gồm cả ranh giới) khối lập phương có chứa khối đùn.

J⁻λι⁺κι

Nhảy đến vị trí đầu ra tương ứng với các tọa độ đó.

≔⟦⟧δFE²↔⁻⁺ιμ·⁵FE²↔⁻κνFE²↔⁻⁺λξ·⁵⊞δ⌊⟦‹μζ‹νη‹ξθ‹¹№E⟦μνξ⟧‹π⊕ρ¹⟧

Từ các tọa độ đã cho, nhìn trộm theo tất cả tám hướng chéo để xác định xem phần đùn có trùng với hướng đó hay không. Các tọa độ bị lén được kiểm tra rằng chúng vẫn nằm trong khối, và sau đó số trục trong đó tọa độ nằm trong khối ban đầu phải lớn hơn 1. Lưu ý rằng vì khối có chiều cao hiển thị kỳ lạ, nên các giá trị trục Y được nhìn trộm là các số nguyên trong khi các trục khác sử dụng tọa độ phân số.

≡Σδ

Xem xét số lượng các hướng trong đó đùn chồng lên nhau. Có năm trường hợp chúng tôi muốn in một cái gì đó, như trong trường hợp số 0, điều đó có nghĩa là đây là không gian trống và chúng tôi không muốn in bất cứ thứ gì, trong khi trong trường hợp tám, điều đó có nghĩa là đây là bên trong ép đùn và bất cứ điều gì chúng tôi đã in sẽ được in đè lên bởi một lớp gần điểm mắt.

¹+

Nếu ép đùn chỉ chồng lên nhau theo một hướng thì đây là góc ngoài và chúng ta cần xuất ra a +.

²§ |-/⁺⌕δ¹⌕⮌δ¹¦

Nếu ép đùn chồng lên hai hướng thì đây là cạnh ngoài. Những loại cạnh được xác định từ sự tách biệt giữa hai chồng chéo; 6 và 7 là các cạnh phía sau và sẽ bị ghi đè, 4 là cạnh chéo, 2 là cạnh dọc và 1 là cạnh ngang. (Tôi thực sự tính 7 trừ đi sự phân tách vì nó dường như dễ thực hiện hơn.)

³+

Nếu ép đùn chồng lên nhau theo ba hướng thì đây là một góc bên trong trong trường hợp một trong các ép đùn bằng 0 và chúng ta cần xuất ra a +.

⁴§ +Σ…δ⁴¦

Nếu ép đùn chồng lên nhau theo bốn hướng thì có hai trường hợp: các mặt (bất kỳ hướng nào) và các góc bên trong trong trường hợp có ba ép đùn dương. Trong trường hợp sau, có một số lượng trùng lặp lẻ đối với người xem.

⁶§ |-/⌕δ⁰

Nếu ép đùn chồng lên nhau theo sáu hướng thì đây là một cạnh bên trong. Nó hoạt động giống như phần bù của cạnh ngoài ngoại trừ việc chúng ta chỉ quan tâm khi một trong hai khoảng trống là hướng về điểm mắt (mục cuối cùng trong mảng).


2

K (ngn / k) , 172 byte

{s:1+|/'i-:&//i:1_--':1_4#!#'2*:\a:16!29!1+2/(!3){+'+x}/'{2+':''1+':'0=':x}'{++'x}\6{+'+0,|x}/{6}#{3}#'{2}#''s#1<+/x=!s:1+2*x;" |+/+ +-? ??? ++"s#@[&*/s;s/i;{x+y*~x};,//a]}

Hãy thử trực tuyến!

bắt buộc k viết lại giải pháp apl của tôi

cùng một thuật toán, ngoại trừ việc kết xuất 3d-> 2d được thực hiện với (gán k tương đương) gán chỉ số phân tán thay vì tạo ma trận 2d cho mỗi phần tử 3d và trộn chúng


Làm thế nào ngn/aplperfrom của bạn so với Dyalog APLgiải pháp của bạn ?
Galen Ivanov

@GalenIvanov sẽ không phải là một so sánh công bằng bởi vì trong giải pháp apl của tôi, tôi đã lãng phí rất nhiều bộ nhớ để tiết kiệm một vài byte và trong k ngắn hơn sẽ xảy ra nhanh hơn trong trường hợp này
ngn

Tôi đã hỏi về so sánh giữa hai giải pháp APL - một giải pháp APL / Dyalog của bạn và một giải pháp giả thuyết trong ngn / apl
Galen Ivanov

Rất tiếc, tôi không biết tại sao tôi lại đọc nó là "ngn / k" ... điều đó lại không công bằng - ngn / apl là người yêu thích javascript, dyalog là chuyên nghiệp c
ngn

1
@GalenIvanov có lẽ là không. ngn / apl đang thiếu các bổ sung gần đây cho ngôn ngữ như toán tử xếp hạng ( ) và
stpson
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.