เครื่องสร้างบ้านอัตโนมัติ


15

nanobots สร้างบ้านอัตโนมัติได้ถูกประดิษฐ์ขึ้นและเป็นหน้าที่ของคุณในการกำหนดรหัส

นี่คือบ้านที่สร้างขึ้นโดยการป้อนข้อมูล 7 4 2

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

อินพุตเป็นสตริงที่มีขนาดของบ้าน

7 คือความกว้าง

|_____|

---7---

4 คือความสูง

|
|
|
|

2 คือความลึก

 / 
/

เมื่อรับข้อมูลนี้คุณสามารถสร้างบ้านได้หรือไม่

รหัสของคุณจะต้องเล็กที่สุดเท่าที่จะเป็นไปได้เพื่อให้สามารถใส่ในโรบอตได้

หมายเหตุ

ขนาดเล็กที่สุดคุณจะได้รับเป็น input 3 2 2มี 3 2 2โปรแกรมของคุณสามารถทำอะไรที่มีขนาดที่มีขนาดเล็กกว่า

Testcases

3 2 10

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

ที่เกี่ยวข้อง
Leun Nun

มันไม่ใช่ลูกบาศก์ดังนั้นฉันคิดว่าคำถามของฉันแยกจากกันพอสมควร สามารถเปลี่ยนตัวอักษรได้

2
กรุณาทดสอบเพิ่มเติมหรือไม่
Leun Nun

1
นอกจากนี้เป็นคำถามที่ดี ฉันคิดว่าเรายังไม่มี
Rɪᴋᴇʀ

1
ผลลัพธ์จะเป็น3 2 10อย่างไร
Downgoat

คำตอบ:


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


คุณสามารถตัดแต่ง 3 ไบต์โดยแทนที่' '*min(d-i,h-1,w+1,h-1+i)ด้วย(' '*d)[max(0,i):h-1+i]
RootTwo

1

ทับทิม 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
`

แก้ไข: บันทึก 2 ไบต์ขอบคุณ @jrich


ลองลบ,r='repeat'จากด้านหน้าแล้วแทนที่อันแรก[r]ด้วย[r='repeat']
jrich

@ jrich ขอบคุณฉันมี แต่เดิม,r=(n,c=` `)=>c.repeat(n)และเมื่อฉันเปลี่ยนแทคฉันมองข้ามความเป็นไปได้สำหรับการจัดเรียงใหม่
Neil

1

Python 224 301 297 Bytes

(ตอนนี้ใช้ได้กับทุกกล่องรวมถึง 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ɪᴋᴇʀ

ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! เราต้องการให้การส่งทั้งหมดเป็นโปรแกรมเต็มรูปแบบที่อ่านจาก STDIN และเขียนไปยัง STDOUT หรือฟังก์ชั่นที่ยอมรับข้อโต้แย้งและคืนค่า นอกจากนี้เรายังกำหนดให้การส่งผลงานเข้าประกวดเป็นเรื่องร้ายแรงสำหรับการชนะในเวลาโพสต์ซึ่งหมายความว่าเราไม่อนุญาตให้มีการแก้ไขหรือไม่ได้รับการแก้ไขบางส่วนสำหรับการตีกอล์ฟ
Alex A.

เมื่อฉันเรียกใช้รหัสนี้ที่นี่มีช่องว่างเพิ่มเติมในผลลัพธ์
DJMcMayhem

@DrGreenEggsandHamDJ แก้ไขมัน! มันไม่ได้มีรูปแบบเป็น h, w และ l ดังนั้นฉันจึงเพิ่มบางคำสั่งถ้า
JoshK

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ในการสั่งซื้อของ จะตีกอล์ฟมากขึ้นเมื่อเวลาผ่านไปทุกที่ที่ฉันทำได้

ลองออนไลน์! (Ideone)

คำอธิบาย:

สำหรับวัตถุประสงค์ของคำอธิบายนี้สมมติว่าฟังก์ชั่นถูกดำเนินการโดยมีอาร์กิวเมนต์(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) ลองเรียกรายการaและรายการ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-hที่d-h=0ถ้าลบหรือเป็นศูนย์ ในการเริ่มต้นd-iจะมีการเพิ่มช่องว่างลงในรายการตามด้วย a /จากนั้นรายการใดก็ตามที่ส่งคืนโดยคำสั่งเงื่อนไขแบบบีบอัด ในคำสั่งเงื่อนไขนี้จำนวนของช่องว่างจะถูกส่งกลับถ้าw-2 i>1มิฉะนั้นจำนวนเดียวกัน-จะถูกส่งกลับ จากนั้นเหล่านี้จะตามมาด้วยอีกและช่องว่างแล้วที่จำนวนของช่องว่างในขณะนี้ขึ้นอยู่กับว่าหรือไม่/ i<=d-(d-h)-1ถ้าเป็นเช่นนั้นiจะมีการเพิ่มช่องว่าง มิฉะนั้นh-1จะเพิ่มช่องว่าง ในที่สุดสิ่งนี้จะถูกเติมโดย a /หรือ a |ซึ่ง|จะถูกเพิ่มถ้าi<=d-(d-h)-1มิฉะนั้น/ถูกเพิ่ม ในกรณีของ3x2x3ปริซึมรายการนี้จะถูกส่งกลับโดย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=>0ที่h-d=0ถ้าจำนวนลบหรือศูนย์ ในการเริ่มต้นรายการนี้ก่อนอื่น a |จะถูกเพิ่มเนื่องจากบรรทัดเหล่านี้เริ่มต้นด้วย|เสมอ จากนั้นทั้งพื้นที่-หรือ_มีการเพิ่มขึ้นหรือไม่หรือi=h i<2หากi<2มีการ_เพิ่มa มิฉะนั้น-จะถูกเพิ่มถ้าi=hหรือพื้นที่ที่จะถูกเพิ่มถ้าi>hหรือหรือi<h i>2หลังจากทำการตัดสินใจนี้แล้วw-2จำนวนของตัวละครที่เลือกจะถูกเพิ่ม หลังจากนี้|จะมีการเพิ่มอีกหนึ่งรายการจากนั้นเพิ่มช่องว่างอย่างใดอย่างหนึ่งi-1หรือdหลายช่อง ถ้าเป็นi>h-(h-d)เช่นนั้นdจำนวนช่องว่างจะถูกเพิ่ม มิฉะนั้นi-1จะเพิ่มจำนวนช่องว่าง สุดท้ายนี้เป็นยอดทั้งหมดออกมีทั้ง|หรือ/ในที่|ถูกเพิ่มถ้าi>h-(h-d)หรือถูกเพิ่มถ้า/ i<=h-(h-d)ในกรณีของ3x2x3ปริซึมรายการbจะส่งคืน:

        |-| /
        |_|/
    

หลังจากที่ได้รับการสร้าง 2 รายการที่พวกเขาจะเข้าร่วมในที่สุดก็มีเส้นใหม่ที่แท้จริง ( \n) '\n'.join()โดยใช้ นี่คือปริซึมที่สมบูรณ์ของคุณและในกรณีนี้จะมีลักษณะดังนี้:

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

1
booleans หลามประเมินจำนวนเต็มซึ่งหมายความว่าส่วนใหญ่ของ ternaries '-_'[f<2]ของคุณสามารถบีบอัดเพื่อสิ่งที่ต้องการ ในที่สุดR=range;S,V,L=' |/'ทำงานเพื่อกำหนดตัวแปรเริ่มต้นของคุณเนื่องจากสตริงจะคลายตัวเองให้คุณในสถานการณ์นั้น
มูลค่าหมึก

ไม่เป็นไรฉันลืมว่าโอเปอเรเตอร์นั้นไม่มีอยู่ใน Python ... แต่ที่เหลือก็ใช้ได้!
หมึกมูลค่า

@ KevinLau-notKenny Wow ขอบคุณสำหรับเคล็ดลับ! :) ฉันไม่ทราบว่าสามารถแสดงออกทางไตรภาคได้ในลักษณะนั้น!
R. Kap

คุณสามารถใช้เคล็ดลับสำหรับ ternaries ตราบใดที่คุณไม่ได้แก้ไขตัวแปรภายใน ยกตัวอย่างเช่นa=1 if b<9 else c=5ไม่สามารถแสดงเป็น[a=1,c=5][b<9]เพราะคุณจะจบลงด้วยการปรับเปลี่ยนทั้งในและa cนี่คือหน้าเคล็ดลับการเล่นกอล์ฟ PPCG Python: codegolf.stackexchange.com/questions/54/…
หมึกมูลค่า

คุณยังมีไตรภาคหนึ่งที่ยังอยู่ที่นั่น, '_'if f<2else' -'[f==h]. โปรดจำไว้ว่า booleans ประเมินเป็นจำนวนเต็มเพื่อให้คุณสามารถ "ลูกโซ่" ternary นี้เพื่อคนอื่น ๆ [' -'[f==h],'_'][f<2]ที่คุณจะได้รับการแก้ไข นอกจากนี้คุณยังไม่ได้ใช้เคล็ดลับของฉันด้วยS,V,L=' |/'เลย
หมึกมูลค่า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.