XYZ를 따라 큐브의면을 대칭으로 돌출시킵니다.


33

모래 상자

현재 작업을 위해 단위 길이의 큐브는 다음과 같이 ASCII 기호로 비스듬한 투영으로 렌더링됩니다.

  +-----+
 /     /|
+-----+ |
|     | +
|     |/
+-----+
  • + 정점을 위해.
  • -X 모서리의 경우 X를 따라 단위 길이 -는 두 정점 사이 에 5로 표시됩니다 .
  • |Y 모서리의 경우 Y를 따라 단위 길이는 2로 표시됩니다| 는 두 정점 사이에 두 개로 표시됩니다.
  • /Z 모서리의 경우 Z를 따라 단위 길이 /는 두 정점 사이 에 하나로 표시됩니다 .
  • 꼭짓점은 세 평면이 모두 교차하는 지점에서만 그려집니다.
  • 모서리는 정확히 두 평면이 교차하는 곳에만 그려집니다.

단위면이 돌출되면 원래 위치에서 단위 길이만큼 간격 띄우기되고 각 방향 (양수 및 음수)마다 4 개의 새 모서리가 작성됩니다.

각 축이 단면이 1x1이고 길이가 직육면체 인 3D 직교 좌표계의 축을 그리는 것처럼 돌출을 생각할 수 있습니다. n 가 (0,0,0) 인

X를 따라 1만큼 돌출 :

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

태스크

XYZ 축에 세 개의 숫자가 주어지면 단위 ​​큐브의면을 표시된 양만큼 대칭으로 돌출시키고 위에 지정된 ASCII 기호로 결과를 렌더링합니다.

입력

x, y, z – 음수가 아닌 숫자-각 축의 압출 길이. 0은 압출이 없음을 의미합니다. 입력은 세 개의 숫자, 세 개의 숫자 목록, 트리플, 문자열 또는 편리한 어떤 것이 될 수 있습니다.

산출

압출 후 큐브의 ASCII 도면. 선행 및 후행 wihtespaces가 허용됩니다.

테스트 사례

X Y Z
0 0 0

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

1 0 0

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


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


1 1 0

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

2 0 1

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

1 1 1 

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

우승 기준

모든 언어에서 가장 짧은 바이트 단위의 솔루션이 이깁니다. 사용 된 방법과 코드에 대한 간단한 설명을 추가하십시오.


각 돌출에 대한 상한이 있습니까?
무지의 구현

@ 무지의 구현-9면 충분합니다
Galen Ivanov

답변:


14

자바 스크립트 (ES6),  525 ... 475471  459 바이트

@Neil 덕분에 13 바이트 절약

입력을 배열로 [X,Y,Z]받습니다. 문자 행렬을 반환합니다.

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

온라인으로 사용해보십시오!

방법?

그리기 단계

출력은 특정 순서로 그려진 15 개의면으로 구성됩니다.

생기

이행

그리기 기능은 입니다. 다음 매개 변수와 함께 작동합니다.

  • (엑스,와이) : 그리기 시작 위치
  • : 너비
  • h : 높이
  • : 측면의 유형

꼭짓점은 항상 그려집니다. 다른 매개 변수의 값에 따라기음가장자리가 그려 지거나 지워집니다.

t = 0 인 경우=0 , 함수는 전방을 그린다

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

t = 1 인 경우=1 , 그 상부 측을 그린다

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

t = 2 인 경우=2 , 그것은 오른쪽을 그립니다 :

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

각 변의 좌표 (엑스,와이) 및 크기 (,h) 는 일정한 값을 가지거나 입력 변수 중 하나에 정확히 의존합니다 : 엑스 , 와이 또는

사용할 입력 변수와 점검 할 조건은 모두 매개 변수 c [ 1..8 로 식별됩니다.기음[1..8]

요약하면, 측면은 다음과 같이 완전히 설명됩니다.

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

P기음

따라서 각 측면에 대해 다음 10 개의 매개 변수를 저장해야합니다.

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

다음은 그려야 할 15면의 매개 변수입니다.

sidecoxmxoymyowmwohmht0400237046014602346302226222403423366204030243062071240052220270341632600712301720222704008562224012294200370301101002370130111602313302126002070400137200070301148602040302

We force all values into the range [0..9] by applying the following operations:

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

It results in 15 numbers of exactly 10 decimal digits, which are stored as 15 groups of 7 digits in base 36.

For instance, the first side is encoded as 4032070460 and stored as 1uol9h8.


I think Array(W*2+9).fill` ` saves a byte.
Neil

Oops,sorry, my bad, I must of saw it wrong or something. Disregard.
Embodiment of Ignorance

@EmbodimentofIgnorance No worries. :)
Arnauld

3
Great visualization in addition to your traditionally cool description! Respect!
Galen Ivanov

@GalenIvanov Thank you! I really enjoyed working on this challenge.
Arnauld

13

APL (Dyalog Classic), 162 161 132 130 bytes

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

Try it online!

  • generate a 3d bool array of unit cubies
  • replicate each cubie 6 3 2 times along x y z
  • surround with zeroes
  • for each 2×2×2 subarray compute a number between 0 and 16 that determines the corresponding output char: (1 + 4*cx + 2*cy + cz) mod 16 where cx,cy,cz are the number of same-value "rods" along axis x,y,z, i.e. vectors along that axis that consist of the same value: 0 0 or 1 1. we make an exception if the subarray is all-zero (or all-one - those don't matter) and we consider its number 0 instead of 28
  • for each cell compute where the corresponding char should be drawn on screen
  • for each cell build a transparent (0-padded) matrix that contains only one opaque "pixel"
  • mix the matrices - at this point we have a 5d array with dimensions inx,iny,inz,outx,outy
  • reduce the first three axes, keeping only the first non-transparent (≠0) item along them
  • use a lookup table (a string) to convert the numbers into -|/+

thanks Scott Milner for spotting that some +s rendered as ?s


How do you actually test this? I wanted to try extrusions of 2,3,4 for example, but nothing obvious seemed to work.
Neil

the algo is very wasteful, so 2 3 4 runs out of memory, but 2 3 3 is within reach
ngn

@Neil i made a small fix and now 2 3 4 works. lost a byte as a side effect :)
ngn

An APL solution that's half as long as a Charcoal one on an ascii-art challenge?! What's going on?!
Shaggy

3
Not 100% sure, but I'm pretty sure that this isn't desired behavior on 0 1 1
Scott Milner

6

Charcoal, 325 bytes

≔×⁶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←∧∧ηζ⁶+

Try it online! Link is to verbose version of code. Explanation:

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

Input the extrusions, but premultiply them to save bytes.

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

If at least two of the extrusions are zero, then simply draw a cuboid of dimensions (2x+1, 2y+1, 2z+1). Otherwise:

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

Print the left extrusion, if any.

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

Print the down extrusion, if any.

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

Print the back extrusion, if any.

J⁶¦⁰

The remaining extrusions all meet at this point (which doesn't get drawn until the very end!)

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

Print the front extrusion, if any, taking care to erase parts of the left and down extrusions that may overlap.

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

뒷면 돌출부와 왼쪽 돌출부의 일부가 지워지도록주의하면서 위쪽 돌출을 인쇄하십시오 (있는 경우).

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

튀어 나올 수있는 다운 및 백 돌출 부분을 지우도록주의하면서 올바른 돌출을 인쇄하십시오.

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

후자 압출 사이의 결합을 그립니다.


차콜에서 325 바이트?! 온 아스키 기술의 도전! Ja (vaScri) pt에서 이것을 시도조차하지 않기에 충분합니다!
얽히고 설킨

@Shaggy 이것은 최적의 접근 방식이 아닐 수 있으며 어쨌든 간과했던 골프 방법이있을 수 있습니다. ngn의 방법이 흥미로워 보이지만 모양을 내부 배열로 그린 다음 가장자리 감지를 수행하여 출력을 생성하는 것처럼 보입니다.

@Shaggy 저는 완전히 다른 접근법이므로 별도로 게시 한 195 바이트 솔루션을 생각해 냈습니다. 그래도 APL은 아직 부족합니다.
Neil

3

, 195 (164) 144 바이트

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

온라인으로 사용해보십시오!링크는 자세한 버전의 코드입니다. 압출을 그리는 데 완전히 다른 접근법을 사용하기 때문에 이것을 별도의 답변으로 게시하고 있습니다. 설명:

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

돌출을 입력하고 둘러싸는 입방체의 절반 크기를 계산하지만 숯의 범위는 항상 정수이므로 정수 산술입니다. 출력 원점은 원래 단위 큐브의 중심에 매핑됩니다.

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

돌출을 포함하는 직육면체 내 (경계 포함)의 모든 좌표를 반복합니다.

J⁻λι⁺κι

해당 좌표에 해당하는 출력 위치로 이동하십시오.

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

주어진 좌표에서 돌출이 해당 방향으로 겹치는 지 여부를 결정하기 위해 8 개의 대각선 방향을 모두 들여다 봅니다. 엿보기 좌표가 여전히 직육면체 내에 있는지 확인한 다음 좌표가 원래 큐브 내에있는 축의 수는 1보다 커야합니다. 큐브의 디스플레이 높이가 홀수이므로 Y 축 값입니다. 다른 축은 분수 좌표를 사용하는 반면 들여다 보는 것은 정수입니다.

≡Σδ

돌출이 겹치는 방향의 수를 고려하십시오. 0의 경우와 같이 무언가를 인쇄하고 싶은 5 가지 경우가 있습니다. 이것은 빈 공간이고 아무것도 인쇄하고 싶지 않다는 것을 의미합니다. 8 개의 경우에는 이것이 내부에 있음을 의미합니다 우리가 인쇄 한 압출 물과 모든 것은 시점에 가까운 층에 의해 중복 인쇄됩니다.

¹+

돌출이 한 방향으로 만 겹치는 경우 외부 모서리이므로를 출력해야합니다 +.

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

돌출이 두 방향으로 겹치는 경우 외부 모서리입니다. 두 종류의 겹침 사이의 분리로 어떤 종류의 가장자리가 결정됩니까? 6과 7은 후면 가장자리이며 덮어 쓰기됩니다. 4는 대각선 가장자리, 2는 세로 가장자리, 1은 가로 가장자리입니다. (실제로는 더 쉬운 것처럼 7에서 분리를 뺀 값을 계산합니다.)

³+

압출이 세 방향으로 겹치는 경우 압출 중 하나가 0이고을 출력해야하는 경우 내부 모서리입니다 +.

⁴§ +Σ…δ⁴¦

돌출이 네 방향으로 겹치는 경우 두 가지 경우가 있습니다 :면 (모든 방향)과 세 개의 포지티브 돌출이있는 경우 내부 모서리. 후자의 경우 시청자에 대해 홀수의 겹치는 부분이 있습니다.

⁶§ |-/⌕δ⁰

돌출이 6 방향으로 겹치면 내부 모서리입니다. 두 개의 빈 공간 중 하나가 시점을 향한 방향 (배열의 마지막 항목) 일 때만 관심이 있다는 점을 제외하고는 외부 가장자리의 보완과 같이 작동합니다.


2

K (ngn / k) , 172 바이트

{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]}

온라인으로 사용해보십시오!

의무 k 다시 쓰기 내 apl 솔루션

3d> 2d 렌더링은 각 3d 요소에 대해 2d 행렬을 생성하고 혼합하는 대신 산란 인덱스 할당을 사용하여 수행한다는 점을 제외하고 동일한 알고리즘


어떻게 것 ngn/apl당신에 비해 perfrom Dyalog APL해결책은?
Galen Ivanov

내 APL 솔루션에 내가 몇 바이트를 저장하는 메모리를 많이 낭비하기 때문에 @GalenIvanov 그것은 공정한 비교되지 않을 것, 그리고 K에 짧은 빨리이 경우에 될 일
NGN

두 가지 APL 솔루션 (귀하의 APL / Dyalog 하나와 ngn / apl의 가상 솔루션) 간의 비교에 대해 물었습니다.
Galen Ivanov

죄송합니다, 왜 "ngn / k"로 읽었는지 모르겠습니다 ... 다시 불공평합니다-ngn / apl은 취미 자바 스크립트, dyalog는 전문 ​​c
ngn

1
@GalenIvanov는 아마 아닐 것입니다. NGN / APL은 순위 연산자와 같은 언어 (에 최근 추가 누락 ) 및 스텐실 ( )
NGN
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.