ASCII直方体を描く


14

3以上の整数が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

1つの面が透明な場合、その背後にあるものをすべて見ることができます。

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

透明/ソリッドフラグのビットマップとして整数を使用できますか?
タイタス

@タイタスまあ。大丈夫。実際に自分で値をテストできれば、もう少し面白くなります。
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、ブロックまたはプログラムの最後にない限り、コマンドには常に2つの選択肢があります。これを回避するために、式の値を0または1のみにすることができ、バイトを節約する場合に、for (<bool>)代わりにif (<bool>)同様の効果があります。(これを実現するために、ボディを実行する必要があるときに常に真になるように式を変更する必要がありました。)に最適化if (<bool>) for (<int>)することもできましたfor (And(bool, int))


聖なるキリストO_O。木炭を使用してキューブ自体を描画する方法を理解することさえできませんでした。githubのexamplesフォルダーに単純な立方体を描くための例を配置できますか?最適化されたものですか?私は自分の好きなものを比較したい... 50バイトの答えを本来あるべき姿に。
魔法のタコUr

@carusocomputing申し訳ありませんが、「シンプルキューブ」とはどういう意味かわかりません。Charcoal自体の著者でもないので、例を追加することはできません。
ニール

そうじゃない?聖なるがらくたは誰ですか?正直に思った。また、私は木炭の貢献者になりたいです。githubで簡単に作成できます:)。あなたは明らかに言語に才能があります。そして、「単純なキューブ」とは、チャレンジの前半、つまりX * Y * Z ASCIIキューブを作成することを意味します。
魔法のタコUr

@carusocomputing ASCII-onlyは、私が知る限り、主な貢献者ですが、esolang wikiは2番目の貢献者を称賛しています。
ニール

少なくとも、私はあなたの例のいくつかを彼らに連絡したいと思います。私はあなたのコードについてもっと説明したいと思います。言語が私にとって興味深いので、私はあなたの炭火の答えに少し従いました。
魔法のタコUr

2

JavaScript(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の2つの最下位ビットは、フェイスタイプを保持します。

  • 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.11200 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.