挑战四:现在的组装线!


12

<<上一页 下一页>>

圣诞老人能够重新制造精灵过夜偷走的所有礼物!现在,他必须将它们发送到装配线进行包装。他通常有一个摄像头来监督装配线,既要确保精灵们做得很好,又要确保装配线的图片在广告海报上看起来不错[需要引用]

不幸的是,他的相机坏了,所以他希望您对装配线的外观进行模拟!

为了使装配线保持最高效率,并减少发生错误或故障的风险,所有现有的包装盒均具有相同的宽度,以使其完美地适合于输送带。

挑战

给定一个由其尺寸表示的礼物清单,输出带有所有礼物的传送带。

礼物是这样绘制的:

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

该礼物的宽度为1,高度为2,长度为4。请注意,加号不计入边长,因此长度为4的礼物实际上横跨6个位置。

所有礼物都紧挨着绘制,最接近的两个字符之间有一个空格。也就是说,礼物的左下角之间的间距应使如果礼物盒具有长l和宽w,则下一个礼物盒的左下角将恰好l + w + 4位于前一个箱子的左下角的右侧。

绘制完所有存在的盒子之后,通过用width + 2下划线替换最后一行中每条盒子之间的空间来绘制传送带。

与礼品盒的最终输出(l, w, h)[(4, 1, 2), (8, 1, 3), (1, 1, 1)]是:

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

格式化规格

您可以选择采用3元组的列表,其中一个元素在整个列表中是一致的(即宽度),也可以采用当前宽度,然后采用2元组的列表表示长度和每个礼物的高度。您可以以任何顺序和任何合理的格式接受输入,但是礼物的显示顺序必须与输入时的顺序相同。

您可以为ASCII艺术选择任何合理的输出格式(包括从函数返回)。

测试用例

这些测试用例以[(l, w, h), ...]格式给出。

[(4, 1, 2), (8, 1, 3), (1, 1, 1)]:

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

[(5, 3, 4), (8, 3, 1), (1, 3, 7)]:

                               +-+
                              / /|
                             / / |
    +-----+                 / /  |
   /     /|                +-+   |
  /     / |                | |   |
 /     /  |     +--------+ | |   |
+-----+   |    /        /| | |   |
|     |   +___/        / +_| |   +
|     |  /___/        / /__| |  /
|     | /___+--------+ /___| | /
|     |/____|        |/____| |/
+-----+_____+--------+_____+-+

[(0, 0, 0)] (this is the most interesting test case ever :P)

 ++
+++
++

[(8, 3, 0), (0, 3, 8)] (more zero cases)

                   ++
                  //|
                 // |
                //  |
               ++   |
               ||   |
               ||   |
               ||   |
    +--------+ ||   |
   /        /+_||   +
  /        //__||  /
 /        //___|| /
+--------+/____||/
+--------+_____++

规则

  • 适用标准漏洞
  • 这是,因此最短答案以字节为单位
  • 没有答案将被接受

注意:我从Advent Of Code中汲取了灵感,来挑战这个系列。我没有与此网站的隶属关系

通过在此处查看第一个挑战的“链接”部分,可以查看该系列中所有挑战的列表。


@AdmBorkBork 所有当前的盒子都具有相同的宽度
Erik the Outgolfer

1
如果木炭不破坏这一点,我不知道会怎样。
–totalhuman

@totallyhuman实际上,brainf ** k将赢得挑战:P
HyperNeutrino

您可以在meta上发表文章以索引所有这些问题吗?
RamenChef

@RamenChef嗯,好主意。我可能会这样做:P
HyperNeutrino

Answers:


4

木炭96 81字节

NθWS«→FυG↗→↙⁺²θ_≔I⪪ι υ≔⊟υπ≔§υ⁰ρ→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ ↑πP↗⊕θP←⊕ρ↓+↓πF²«↷⁴+ρ↷²+π↷¹+θ↶³

在线尝试!链接是详细版本的代码。输入的是第一行的宽度,然后是随后几行的其他尺寸,以空白行结尾。说明:

Nθ

输入宽度。

WS«

循环遍历其余行,直到到达空白行。

→FυG↗→↙⁺²θ_

在礼物之间拉紧皮带。该u变量预定义为一个空列表,因此在第一次通过时不执行任何操作,而在以后通过一个单独的元素结束,导致此代码运行一次。(使用if会少打高尔夫球。)

≔I⪪ι υ

在空间上分割尺寸,将其转换为整数,然后将其保存在中u

≔⊟υπ

删除最后一个尺寸并将其保存在中p

≔§υ⁰ρ

将第一个尺寸复制到r,但将其保留在其中,u以便在下一个循环中绘制皮带。

→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ 

万一皮带重叠,请擦除礼物的内部。

↑πP↗⊕θP←⊕ρ↓+↓π

绘制礼物的内部线条。

F²«↷⁴+ρ↷²+π↷¹+θ↶³

围绕礼物的外观绘制一半,然后重复另一半。


1

PIP160个 154字节

153个字节的代码,-l标志+1 。

{YMX:_+B+3MUaRV$.({UwhlWg+^11{a<=h+w?J[sXa-haN[0hh+w]?'-XlWR'+sXlWR("/|"a<h)RV(("+|/"aCMw).sXw)@<MN[ah+w-awh]'_Xw-a+1|s]sXl+w+3}M,y}MUa)R`_ +`'_X#_<|:'_}

此函数采用包含的列表的列表[width height length]在线尝试!

怎么样?

顶层说明:

  • 定义一个函数,该函数返回代表一个框的行的列表
  • 将函数映射到给定的每个尺寸列表
  • 逐项连接结果行列表
  • 使用正则表达式替换进行一些后期处理,以使下划线正常运行

发表评论,我将添加更详细的解释。


0

Python 2,508字节

def f(B):
 d=B[0][1]+2;H=max(B)[0]+d+1;W=sum(sum(b[1:])+3for b in B)+len(B);r=[[' ']*i+W*['_']for i in range(d)]+[W*[' ']for _ in' '*H];o=0
 for h,w,l in B:
	for i in range(w+2,1,-1):r[i-1][o+i-2:o+l+i]=[' ']*(l+2)+['/'];r[h+i][o+i-1]=r[h+i][o+l+i]='/'
	r[0][o:o+l+2]=r[h+1][o:o+l+2]=r[w+h+2][o+w+1:o+w+l+3]=['+']+['-']*l+['+']
	for i in range(1,h+1):m=min(i,w)-1;r[i][o:o+l+2+m]=['|']+[' ']*l+['|']+[' ']*m;r[i+w+1][o+l+w+2]='|'
	r[w+1][o+l+w+2]='+';o+=l+w+4
 for l in r[H-1::-1]:print''.join(l).rstrip('_')

在线尝试!

取得以下清单的清单 [height, width, length]

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.