自动房屋建筑商


15

自动房屋建筑纳米机器人已经制造出来,编写它们是您的工作。

这是通过输入创建的房子 7 4 2

  /-----/|
 /     / |
|-----|  |
|     |  |
|     | /
|_____|/

输入是包含房屋尺寸的字符串。

7 是宽度。

|_____|

---7---

4 是高度。

|
|
|
|

2 是深度

 / 
/

有了这个输入,您可以建造房屋吗?

您的代码必须尽可能小,以使其适合机器人。

笔记

您将输入的最小尺寸为3 2 2。您的程序可以执行尺寸小于3 2 2

测试用例

3 2 10

          /-/|
         / / |
        / / /
       / / /
      / / /
     / / /
    / / /
   / / /
  / / /
 / / /
|-| /
|_|/


它不是一个多维数据集,所以我认为我的问题足够独立。可以改变字符。

2
请问更多的测试用例?
Leaky Nun

1
另外,这是一个很好的问题。我认为我们还没有。
Rɪᴋᴇʀ

1
输出将用于3 2 10什么?
Downgoat '16

Answers:


3

Python 2,128字节

w,h,d=input();i=d
while-i<h:c='|/'[i>0];print' '*i+c+'- _'[(d>i!=0)+(h+i<2)]*(w-2)+c+' '*min(d-i,h-1,w+1,h-1+i)+'/|'[d-i<h];i-=1

逐行打印。该行指数i从倒计时d-h+1


您可以通过替换' '*min(d-i,h-1,w+1,h-1+i)(' '*d)[max(0,i):h-1+i]
RootTwo

1

Ruby,145个字节

返回字符串列表。列表中的每个元素都对应一行。如果必须返回多行字符串,请添加3个字节以添加*$/在最后一个括号之前。

->w,h,d{s=' ';(0..m=d+h-1).map{|i|(i<d ?s*(d-i)+?/:?|)+(i<1||i==d ??-:i==m ??_ :s)*(w-2)+(i<d ? ?/:?|)+(i<h ?s*[i,d].min+?|:s*[m-i,h-1].min+?/)}}

1

JavaScript(ES6),169字节

(w,h,d)=>[...Array(d+h--)].map((_,i)=>` `[r=`repeat`](i<d&&d-i)+(c=`|/`[+(i<d)])+` _-`[i&&i-d?h+d-i?0:1:2][r](w-2)+c+` `[r]((i<d?i:d)-(i>h&&i-h))+`|/`[+(i>h)]).join`\n`

哪里 \n代表文字换行符。说明:

(w,h,d,)=>                          Parameters
[...Array(d+h--)].map((_,i)=>       Loop over total height = d + h
 ` `[r=`repeat`](i<d&&d-i)+         Space before roof (if applicable)
 (c=`|/`[+(i<d)])+                  Left wall/roof edge
 ` _-`[i&&i-d?h+d-i?0:1:2][r](w-2)+ Space, floor or eaves between walls
 c+                                 Right wall/roof edge (same as left)
 ` `[r]((i<d?i:d)-(i>h&&i-h))+      Right wall
 `|/`[+(i>h)]                       Back wall/floor edge
).join`                             Join everything together
`

编辑:由于@jrich,节省了2个字节。


尝试删除,r='repeat'从正面和第一替换[r][r='repeat']
jrich

@jrich谢谢,我原来有,r=(n,c=` `)=>c.repeat(n),当我改变方法时,我忽略了重新安排的可能性。
尼尔

1

Python 224 301 297字节

(现在适用于所有包含1x1x1的盒子)

l,w,h=input()
s,r,d,v,R,x=" "," - ","/","|",range,(l*3-1)
print s*(w+1)+r*l
for n in R(w):
    if n<h:e,c=v,n
    else:e,c=d,h
    print s*(w-n)+d+s*x+d+s*c+e
if h-w>=1:e,c=v,w
elif w>h:e,c=d,h
else:e,c=d,w
print s+r*l+s*c+e
for n in R(h):
    if h>w+n:e,c=v,w
    else:e,c=d,h-n-1
    print v+s*x+v+s*c+e
print r*l

说明:

接受三个常数:l(长度),h(高度),w(宽度)。

如果我们看几个样本盒,我们可以在间隔中找到图案。

对于3 x 4 x 3的盒子,我们将使用数字来表示部分之间的间距。

1234 -  -  - 
123/12345678/|
12/12345678/1|
1/12345678/12|
1 -  -  - 123|
|12345678|123/
|       8|12/
|       8|1/
|       8|/
 -  -  - 

第一行有4个空格或w +1。接下来的三行有w-(1 * x)。X是行。

这些模式在所有框中的所有行中都延续。因此,我们可以轻松地逐行对此程序进行编程,将空格数乘以适合该模式。

这是5 x 5 x2盒子的示例。

 123 -  -  -  -  -
 12/12345678912345/|
 1/              /1|
 1 -  -  -  -  - 12|
 |              |12|
 |              |12|
 |              |12|
 |              |1/
 |12345678912345|/
  -  -  -  -  -

您可能应该继续打高尔夫球。
Rɪᴋᴇʀ

另外,您需要分配w,h,l=input()或使其成为函数。
Rɪᴋᴇʀ

欢迎来到编程难题和代码高尔夫球!我们要求所有提交都是从STDIN读取并写入STDOUT的完整程序,或者是接受参数和返回值的函数。我们还要求投稿在发布时必须是赢得竞赛的重要竞争者,这意味着我们不允许代码高尔夫使用非高尔夫或部分高尔夫的解决方案。
Alex A.

当我在此处运行此代码时,输出中会有多余的空格。
DJMcMayhem

@DrGreenEg​​gsandHamDJ修复了!它没有说明h,w和l的某种模式,因此我添加了一些if语句。
2013年

0

Python的3.5,328 326 313 305 295 248字节

感谢Kevin Lau提供的有关减小三元语句大小的提示!

def s(w,h,d):R,M=range,max;S,V,L=' |/';O=w-2;D=d-M(0,d-h);Q=h-M(0,h-d);print('\n'.join([S*(d-i)+L+' -'[i<1]*O+L+S*[h-1,i][i<=D-1]+'/|'[i<=D-1]for i in R(D+M(0,d-h))]+[V+[' -'[i==h],'_'][i<2]*O+V+S*[i-1,d][i>Q]+'/|'[i>Q]for i in R(Q+M(0,h-d),0,-1)]))

将输入作为3个整数,顺序为width, height, depth。我会尽可能多地打高尔夫球。

在线尝试!(爱迪生)

说明:

为了便于说明,假定函数使用以下参数执行,(3,2,3)其中3是宽度(w),2是高度(h),3是深度(d)。话虽如此,让我首先展示整个功能的主要部分:

'\n'.join([S*(d-i)+L+' -'[i<1]*O+L+S*[h-1,i][i<=D-1]+'/|'[i<=D-1]for i in R(D+M(0,d-h))]+[V+[' -'[i==h],'_'][i<2]*O+V+S*[i-1,d][i>Q]+'/|'[i>Q]for i in R(Q+M(0,h-d),0,-1)])

在这里,创建了组成整个“房屋”的两个列表,然后通过文字换行(\n)将它们连接在一起。让我们分别将它们称为list a和list b,并分析其中的每一个:

  • a是创建列表的地方:

    [S*(d-i)+L+' -'[i<1]*O+L+S*[h-1,i][i<=D-1]+'/|'[i<=D-1]for i in R(D+M(0,d-h))]
    

    此列表包含d房屋的第一行。在这里,i是范围内的每个数字0=>(d-(d-h))+d-hd-h=0如果是负数或零。首先,将d-i空格添加到列表中,然后是a /,然后是压缩的条件语句返回的所有内容。在此条件语句中,w-2如果返回空格数i>1。否则-返回相同数量的。然后,这些之后是另一个/,然后是空格,空格的数量现在取决于是否i<=d-(d-h)-1。如果是,则i添加空格。否则,h-1将添加空格。最后,全部以a /或a 开头|,如果在|处添加i<=d-(d-h)-1,否则添加a/被添加。在3x2x3棱镜的情况下,将由list返回a

          /-/|
         / / |
        / / /
    
  • b是创建列表的地方:

    [V+[' -'[i==h],'_'][i<2]*O+V+S*[i-1,d][i>Q]+'/|'[i>Q]for i in R(Q+M(0,h-d),0,-1)]`
    

    此列表包含棱镜的其余线。在此列表中,i是整数范围内的每个整数(h-(h-d))+h-d=>0h-d=0如果为负或为零。要开始此列表,首先|添加a ,因为这些行始终以a开头|。然后,根据-_是否添加空格i=hi<2。如果为i<2,则_添加a。否则,-如果添加i=h,则添加a;如果i>hi<h或,则添加空格i>2。做出此决定后,将w-2添加所选字符的编号。此后,|添加另一个,然后添加一个i-1d多个空格。如果i>h-(h-d),则d多个空格。除此以外,i-1添加空格数。最后,所有这些都以a |或a结束 a/|如果添加i>h-(h-d)/则添加,如果添加,则添加i<=h-(h-d)。对于3x2x3棱镜,列表b返回:

        |-| /
        |_|/
    

创建2个列表后,最终使用加上新的文字行(\n'\n'.join()。这是您完成的棱镜,在这种情况下,将如下所示:

       /-/|
      / / |
     / / /
    |-| /
    |_|/

1
Python布尔值的计算结果为整数,这意味着您的大多数三元数都可以压缩为'-_'[f<2]。最后,R=range;S,V,L=' |/'可以分配初始变量,因为在这种情况下字符串很乐意为您解包。
价值墨水

没关系,我忘记了运算符在Python中不存在...但是其余的应该可以工作!
价值墨水

@ KevinLau-notKenny Wow,谢谢你的提示!:)我不知道三元表达式可以用这种方式表达!
R. Kap

只要不修改其中的变量,就可以将其用于三元组。例如,a=1 if b<9 else c=5不能表示为,[a=1,c=5][b<9]因为您最终将同时修改ac。这是PPCG Python高尔夫技巧页面:codegolf.stackexchange.com/questions/54/…–
Value Ink,

您仍然还有一个三元组'_'if f<2else' -'[f==h]。请记住,布尔值以整数形式求值,因此您可以将此“三元”“链接”到固定的另一个值上[' -'[f==h],'_'][f<2]。另外,您还没有使用过我的小费S,V,L=' |/'
价值墨水
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.