모래 상자
현재 작업을 위해 단위 길이의 큐브는 다음과 같이 ASCII 기호로 비스듬한 투영으로 렌더링됩니다.
+-----+
/ /|
+-----+ |
| | +
| |/
+-----+
+
정점을 위해.-
X 모서리의 경우 X를 따라 단위 길이-
는 두 정점 사이 에 5로 표시됩니다 .|
Y 모서리의 경우 Y를 따라 단위 길이는 2로 표시됩니다|
는 두 정점 사이에 두 개로 표시됩니다./
Z 모서리의 경우 Z를 따라 단위 길이/
는 두 정점 사이 에 하나로 표시됩니다 .- 꼭짓점은 세 평면이 모두 교차하는 지점에서만 그려집니다.
- 모서리는 정확히 두 평면이 교차하는 곳에만 그려집니다.
단위면이 돌출되면 원래 위치에서 단위 길이만큼 간격 띄우기되고 각 방향 (양수 및 음수)마다 4 개의 새 모서리가 작성됩니다.
각 축이 단면이 1×1이고 길이가 직육면체 인 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
+-----+
/ /|-+
+-----+ |/|
+---| | +-----+
/ | |/ /|
+-----+-----+-----+ |
| / /| | +
| +-----+ | |/
+---| | +-----+
| |/| +
+-----+ |/
+-----+
우승 기준
모든 언어에서 가장 짧은 바이트 단위의 솔루션이 이깁니다. 사용 된 방법과 코드에 대한 간단한 설명을 추가하십시오.
답변
자바 스크립트 (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 개의면으로 구성됩니다.
이행
그리기 기능은
입니다. 다음 매개 변수와 함께 작동합니다.
: 그리기 시작 위치
: 너비
: 높이
: 측면의 유형
꼭짓점은 항상 그려집니다. 다른 매개 변수의 값에 따라
가장자리가 그려 지거나 지워집니다.
t = 0 인 경우
, 함수는 전방을 그린다
........... ...........
..+-----+.. ..+ +..
..| |.. or .. ..
..| |.. .. ..
..+-----+.. ..+ +..
........... ...........
t = 1 인 경우
, 그 상부 측을 그린다
........... ...........
...+-----+. ...+ +.
../ /.. or .. ..
.+-----+... .+ +...
........... ...........
t = 2 인 경우
, 그것은 오른쪽을 그립니다 :
......+.... ......+....
...../|.... ..... ....
....+ |.... or ....+ ....
....| +.... .... +....
....|/..... .... .....
....+...... ....+......
각 변의 좌표
및 크기
는 일정한 값을 가지거나 입력 변수 중 하나에 정확히 의존합니다 :
,
또는
사용할 입력 변수와 점검 할 조건은 모두 매개 변수 c ∈ [ 1..8 로 식별됩니다.
요약하면, 측면은 다음과 같이 완전히 설명됩니다.
따라서 각 측면에 대해 다음 10 개의 매개 변수를 저장해야합니다.
다음은 그려야 할 15면의 매개 변수입니다.
We force all values into the range
by applying the following operations:
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
.
답변
APL (Dyalog Classic), 162 161 132 130 bytes
{' |+/+ +-? ??? ++'[⍉(⊃~∘0)⍤1⍣3⍉↑a↑¨⍨↓(--1-⌊/∘,)2-/1⌽↑⍳⍴a←16|29|1+{2⊥+/¨∊¨=⌿¨⍵(⍉⍵)(⍉↓⍵)}⌺2 2 2{⍉⍤2⍉⌽0,⍵}⍣6↑3/↓2/6⌿1<⍵+.=⍨↑⍳1+2×⍵]}
- 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
wherecx
,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
답변
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←∧∧ηζ⁶+
후자 압출 사이의 결합을 그립니다.
답변
숯 , 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 방향으로 겹치면 내부 모서리입니다. 두 개의 빈 공간 중 하나가 시점을 향한 방향 (배열의 마지막 항목) 일 때만 관심이 있다는 점을 제외하고는 외부 가장자리의 보완과 같이 작동합니다.
답변
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 행렬을 생성하고 혼합하는 대신 산란 인덱스 할당을 사용하여 수행한다는 점을 제외하고 동일한 알고리즘