绘制ASCII长方体


14

给定三个> = 2的整数,在正交(柜)投影中创建一个ASCII立方体。这三个整数表示包括边角的高度,宽度和深度(以可见字符为单位)。拐角应为“ 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

Answers:


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命令始终有两种选择,除非它们位于块或程序的末尾。为了避免这种情况,当表达式只能具有值0或1却保存一个字节时,我使用for (<bool>)代替if (<bool>)具有类似的效果。(为了实现这一点,我必须更改表达式,以使它们在需要执行主体时始终为真。)我还能够优化if (<bool>) for (<int>)for (And(bool, int))


神圣的基督O_O。我什至不知道如何使用木炭绘制立方体本身。您能否举一个示例在github examples文件夹上绘制一个简单的立方体?一个已经过优化的?我想将我喜欢的... 50字节的答案与应该的结果进行比较。
Magic Octopus Urn

@carusocomputing对不起,我不清楚您所说的“简单立方体”是什么,我也不是Charcoal的作者,因此我无法添加示例。
尼尔

你不是吗?废话,谁是?老实说,我以为你是。另外,我想成为一名木炭贡献者。您可以轻松地在github上成为一个人:)。显然,您在语言方面很有才华。“简单多维数据集”是指挑战的前半部分,只是制作一个X * Y * Z ASCII多维数据集。
Magic Octopus Urn

据我所知,@ carusocomputing仅使用ASCII是主要的贡献者,尽管esolang Wiki确实贡献了第二个贡献者。
尼尔

至少我会通过一些您的示例与他们联系,您比我见过的其他任何人都更进一步。我希望获得您代码的更多解释,由于该语言对我来说很有趣,因此我已经关注了您的木炭答案。
Magic Octopus Urn

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()处理一个给定的回调˚F上的给定范围[0 ... n]的

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.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兼容)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.