Xây nhà tự động


15

Các nanobots xây dựng nhà tự động đã được chế tạo, và đó là công việc của bạn để mã hóa chúng.

Đây là ngôi nhà được tạo ra bởi đầu vào 7 4 2

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

Đầu vào là một chuỗi chứa kích thước của ngôi nhà.

7 là chiều rộng.

|_____|

---7---

4 là chiều cao.

|
|
|
|

2 là độ sâu

 / 
/

Cho đầu vào này, bạn có thể tạo ra ngôi nhà?

Mã của bạn phải càng nhỏ càng tốt để nó có thể vừa với robot.

Ghi chú

Kích thước nhỏ nhất bạn sẽ được cung cấp làm đầu vào là 3 2 2. Chương trình của bạn có thể làm bất cứ điều gì với kích thước nhỏ hơn 3 2 2.

Tủ thử

3 2 10

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


Nó không phải là một khối lập phương, vì vậy tôi nghĩ rằng câu hỏi của tôi là đủ riêng biệt. Có thể thay đổi ký tự mặc dù.

2
Vui lòng kiểm tra thêm?
Leaky Nun

1
Ngoài ra, đây là một câu hỏi hay. Tôi không nghĩ chúng ta có một cái nào.
Rɪᴋᴇʀ

1
Đầu ra sẽ làm 3 2 10gì?
Hạ cấp

Câu trả lời:


3

Python 2, 128 byte

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

In từng hàng. Các chỉ số hàng iđếm ngược từ dđến -h+1.


Bạn có thể cắt 3 byte bằng cách thay thế ' '*min(d-i,h-1,w+1,h-1+i)bằng(' '*d)[max(0,i):h-1+i]
RootTwo

1

Ruby, 145 byte

Trả về một danh sách các chuỗi. Mỗi yếu tố trong danh sách tương ứng với một dòng. Nếu một chuỗi nhiều dòng phải được trả về, thêm 3 byte để thêm *$/ngay trước dấu ngoặc cuối cùng.

->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 byte

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

Trường hợp \nđại diện cho một nhân vật dòng chữ mới. Giải trình:

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

Chỉnh sửa: Đã lưu 2 byte nhờ @jrich.


Hãy thử gỡ bỏ ,r='repeat'từ phía trước và thay thế đầu tiên [r]bằng[r='repeat']
jrich

@jrich Cảm ơn, ban đầu tôi có ,r=(n,c=` `)=>c.repeat(n)và khi tôi thay đổi, tôi đã bỏ qua khả năng sắp xếp lại.
Neil

1

Python 224 301 297 byte

(Hiện hoạt động cho tất cả các hộp bao gồm 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

Giải trình:

Có ba hằng số: l (chiều dài), h (chiều cao), w (chiều rộng).

Nếu chúng ta nhìn vào một vài hộp mẫu, chúng ta có thể tìm thấy các mẫu trong khoảng cách.

Đối với hộp 3 x 4 x 3, chúng tôi sẽ sử dụng các số để biểu thị khoảng cách giữa các phần.

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

Hàng trên cùng có 4 khoảng trắng hoặc là w + 1. Ba dòng tiếp theo có w - (1 * x). X là dòng.

Đây là những mẫu tiếp tục xuyên suốt tất cả các dòng trong tất cả các hộp. Do đó, chúng ta có thể dễ dàng lập trình dòng này theo dòng, nhân số lượng khoảng trắng để phù hợp với mẫu.

Đây là một mẫu cho một hộp 5 x 5 x2.

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

Bạn có lẽ nên tiếp tục chơi golf.
Rɪᴋᴇʀ

Ngoài ra, bạn cần phải gán w,h,l=input()hoặc biến nó thành một hàm.
Rɪᴋᴇʀ

Chào mừng bạn đến với Câu đố lập trình & Code Golf! Chúng tôi yêu cầu tất cả các bài nộp phải là chương trình đầy đủ đọc từ STDIN và ghi vào STDOUT hoặc các hàm chấp nhận đối số và trả về giá trị. Chúng tôi cũng yêu cầu các bài nộp phải là ứng cử viên nặng ký để giành chiến thắng tại thời điểm đăng bài, điều đó có nghĩa là chúng tôi không cho phép các giải pháp vô căn cứ hoặc một phần không phù hợp cho môn đánh gôn.
Alex A.

Khi tôi chạy mã này ở đây , có thêm khoảng trắng ở đầu ra.
DJMcMayhem

@DrGreenEggsandoutDJ Đã sửa nó! Nó không chiếm một mẫu nhất định của h, w và l vì vậy tôi đã thêm một số câu lệnh if.
JoshK

0

Python 3.5, 328 326 313 305 295 248 byte

( Cảm ơn Kevin Lau vì lời khuyên về việc giảm kích thước của các báo cáo về chim nhạn! )

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)]))

Lấy đầu vào là 3 số nguyên theo thứ tự width, height, depth. Sẽ chơi golf nhiều hơn theo thời gian bất cứ nơi nào tôi có thể.

Hãy thử trực tuyến! (Ý)

Giải trình:

Đối với mục đích của giải thích này, giả sử hàm được thực thi với các đối số (3,2,3)trong đó 3 là chiều rộng ( w), 2 là chiều cao ( h) và 3 là độ sâu ( d). Điều đó đang được nói, hãy để tôi bắt đầu bằng cách hiển thị phần chính của toàn bộ chức năng:

'\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)])

Ở đây, hai danh sách tạo nên toàn bộ "ngôi nhà" được tạo ra và sau đó được nối với nhau bằng các dòng mới theo nghĩa đen ( \n). Hãy gọi chúng là danh sách avà danh sách btương ứng, và phân tích từng người trong số họ:

  • Đây là nơi danh sách ađược tạo:

    [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))]
    

    Danh sách này chứa các ddòng đầu tiên của ngôi nhà. Dưới đây, ilà mỗi số trong phạm vi 0=>(d-(d-h))+d-hnơi d-h=0nếu tiêu cực hay không. Để bắt đầu, d-ikhoảng trắng được thêm vào danh sách, theo sau là a /và sau đó bất cứ điều gì được trả về bởi một câu lệnh điều kiện nén. Trong tuyên bố có điều kiện này, w-2số lượng khoảng trắng được trả về nếu i>1. Nếu không, cùng một số lượng -được trả lại. Sau đó, những cái này được theo dõi bởi một cái khác /, và sau đó là khoảng trắng, nơi số lượng khoảng trống bây giờ phụ thuộc vào việc có hay không i<=d-(d-h)-1. Nếu có, thì ikhông gian được thêm vào. Nếu không, h-1không gian được thêm vào. Cuối cùng, đây là tất cả đứng đầu bởi a /hoặc a |, |được thêm vào nếu i<=d-(d-h)-1, nếu không thì/được thêm vào. Trong trường hợp của một 3x2x3lăng kính, điều này sẽ được trả về theo danh sách a:

          /-/|
         / / |
        / / /
    
  • Đây là nơi danh sách bđược tạo:

    [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)]`
    

    Danh sách này chứa phần còn lại của dòng lăng kính. Trong danh sách này, ilà mỗi số nguyên trong phạm vi (h-(h-d))+h-d=>0nơi h-d=0nếu tiêu cực hay không. Để bắt đầu danh sách này, trước hết a |được thêm vào vì các dòng này luôn bắt đầu bằng a |. Sau đó, hoặc là một không gian, -hoặc _được bổ sung tùy thuộc vào việc hay không i=hhay i<2. Nếu i<2, sau đó a _được thêm vào. Nếu không, một -được thêm nếu i=h, hoặc một không gian được thêm nếu i>hhay i<hhay i>2. Sau khi quyết định này được đưa ra, w-2số lượng nhân vật được chọn sẽ được thêm vào. Sau này, một |được thêm vào, và sau đó một trong hai i-1hoặc dsố lượng chỗ được thêm vào. Nếu i>h-(h-d), thì mộtdsố lượng không gian được thêm vào. Mặt khác, i-1số lượng không gian được thêm vào. Cuối cùng, đây là tất cả đứng đầu với a |hoặc a /, trong đó a |được thêm nếu i>h-(h-d), hoặc a /được thêm nếu i<=h-(h-d). Trong trường hợp của một 3x2x3lăng kính, danh sách btrả về:

        |-| /
        |_|/
    

Sau khi 2 danh sách đã được tạo, cuối cùng chúng được nối với các dòng mới ( \n) bằng chữ '\n'.join(). Đây là lăng kính hoàn thành của bạn, và trong trường hợp này, sẽ trông giống như thế này:

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

1
Booleans Python đánh giá các số nguyên, có nghĩa là hầu hết các ternary của bạn có thể được nén vào những thứ như '-_'[f<2]. Cuối cùng, R=range;S,V,L=' |/'hoạt động để gán các biến ban đầu của bạn vì các chuỗi sẽ sẵn sàng tự giải nén cho bạn trong tình huống đó.
Mực giá trị

Đừng bận tâm, tôi quên rằng toán tử không tồn tại trong Python ... Nhưng phần còn lại sẽ hoạt động!
Mực giá trị

@ KevinLau-notKenny Wow, cảm ơn vì lời khuyên! :) Tôi không biết rằng các biểu thức ternary có thể được thể hiện theo cách đó!
R. Kap

Bạn có thể sử dụng thủ thuật đó cho chim nhạn miễn là bạn không sửa đổi các biến bên trong nó. Ví dụ: a=1 if b<9 else c=5không thể được thể hiện [a=1,c=5][b<9]vì cuối cùng bạn sẽ sửa đổi cả hai ac. Dưới đây là trang mẹo chơi gôn PPCG Python: codegolf.stackexchange.com/questions/54/iêu
Ink Ink

Bạn vẫn còn một con chim nhạn vẫn còn đó , '_'if f<2else' -'[f==h]. Hãy nhớ các booleans đánh giá là số nguyên, vì vậy bạn có thể "xâu chuỗi" thứ ba này với cái khác mà bạn đã sửa để lấy [' -'[f==h],'_'][f<2]. Ngoài ra, bạn chưa sử dụng mẹo của tôi S,V,L=' |/'.
Mực giá trị
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.