ASCII 직육면체 그리기


14

세 개의 정수> = 2가 주어지면 직교 (캐비닛) 투영에서 ASCII 큐브를 만듭니다. 3 개의 정수는 모서리를 포함하여 높이, 너비 및 깊이 (표시 문자로 측정)를 나타냅니다. 모서리는 'o'또는 '+'여야합니다 (자유 선택).

w : 10, h : 5, d : 4 따라서 다음을 제공합니다.

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

이제 이것을 조금 더 어렵게 만들기 위해 모든면이 단단하거나 투명하거나 빠질 수 있습니다. 우리는 다음과 같이 얼굴을 주문합니다.

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

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

그리고 토큰 목록 S, T 또는 M을 제공하십시오. 원래 예는 다음과 같습니다.

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

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

한면이 투명하면 뒤에있는 것을 볼 수 있습니다.

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

누락 된면 쌍의 경우 인접한 모서리 또는 모서리가 더 이상 보이지 않습니다.

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

코드 골프, 최단 코드 승리! 후행 공백과 줄 바꿈은 괜찮습니다. 입력 방법과 입력 순서를 자유롭게 선택할 수 있습니다.


5
입력 형식이 얼마나 엄격합니까? 9 개의 파라미터로 기능을 만들 수 있습니까?
LiefdeWen

1
@LiefdeWen you're free to choose input method and input order. 아무 것도 말하지 않았 듯이 기본 입력 / 출력 방법을 사용할 수 있습니다.
dzaima

투명 / 고체 플래그의 비트 맵으로 정수를 사용할 수 있습니까?
Titus

@Titus 음 .. 좋아. 실제로 스스로 값을 테스트 할 수 있다면 좀 더 재미있을 것 같습니다.
NiklasJ

답변:


5

, 190 181 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 편집 : 내 조건을 최적화하여 9 바이트를 절약했습니다. 숯에는 else토큰이 없으므로 if명령은 블록이나 프로그램의 끝에 있지 않으면 항상 두 가지 대안이 있습니다. 이것을 피하기 위해 표현식 for (<bool>)대신 if (<bool>)0 또는 1 값을 가질 수 있지만 바이트를 저장할 때 비슷한 효과가있는 대신 사용 합니다 . (이 I를 달성하기 위해 필요한 몸이 실행될 때 항상 사실 수 있도록 표현을 변경했다.) 나는 최적화로도 할 수 있었다 if (<bool>) for (<int>)으로 for (And(bool, int)).


거룩한 그리스도 O_O. 숯을 사용하여 큐브 자체를 그리는 방법조차 알 수 없었습니다. github examples 폴더에 간단한 큐브를 그리는 예제를 작성할 수 있습니까? 최적화 된 것? 내가 좋아했던 것에 대한 50 바이트 대답을 비교하고 싶습니다.
매직 문어 Urn

@carusocomputing 죄송합니다, "간단한 큐브"의 의미에 대해 잘 모르겠습니다. 저는 Charcoal 자체의 저자가 아니므로 예제를 추가 할 수 없습니다.
Neil

당신은 아닌가요?! 이런 쓰레기, 누구야? 솔직히 생각했다. 또한, 숯 기부자가 되라고 요청했습니다. github에서 쉽게 하나가 될 수 있습니다 :). 당신은 분명히 언어에 재능이 있습니다. 그리고 "간단한 큐브"라는 말은 도전의 전반부를 의미하며 단지 X * Y * Z ASCII 큐브를 만듭니다.
Magic Octopus Urn

esolang 위키가 두 번째 기고자를 인정하지만 @carusocomputing ASCII만이 내가 말할 수있는 한 주요 기고자입니다.
Neil

최소한 나는 당신의 몇 가지 예를 들어 그들에게 연락 할 것입니다. 당신은 내가 본 다른 사람보다 더 많이 가져갔습니다. 나는 당신의 코드에 대해 더 많은 설명을 얻고 싶습니다. 언어가 나에게 흥미 롭기 때문에 숯불 답변을 조금 따랐습니다.
Magic Octopus Urn

2

자바 스크립트 (ES6), 318 (314) 308 바이트

너비, 높이 및 깊이를 정수로,면을 문자 배열로 사용합니다.

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

어떻게?

함수 M () 은 주어진 범위 [0 ... n] 에서 주어진 콜백 F 를 처리합니다 .

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

변수 a 는 크기 (w + d) x (h + d-1) 의 그리드를 나타내는 평면형 배열을 보유합니다 . 처음에는 줄 바꿈으로 끝나는 공백 행으로 채워집니다.

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

함수 D () 는 직육면체의면을 '그리기'위해 사용됩니다.

매개 변수 t 의 최하위 비트 는면 유형을 유지합니다.

  • 0 = 후면 / 전면
  • 1 = 왼쪽 / 오른쪽
  • 2 = 하단 / 상단

비트 # 2 ~ # 4는 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

면은 다음 순서로 그려집니다.

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)

데모


1

SOGL V0.11 , 200 194 193 192 190 바이트

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

순서대로 입력을받습니다

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

묶여!
여기 사용해보십시오! (압축 된 값이 V0.12 호환으로 변경됨)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.