Pembangun rumah otomatis

15

Nanobot pembuatan rumah otomatis telah dibuat, dan tugas Anda untuk membuat kode.

Ini rumah yang dibuat oleh input 7 4 2

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

Input adalah string yang berisi dimensi rumah.

7 adalah lebarnya.

|_____|

---7---

4 adalah tingginya.

|
|
|
|

2 adalah kedalamannya

 / 
/

Dengan masukan ini, dapatkah Anda membuat rumah?

Kode Anda harus sekecil mungkin agar dapat masuk ke dalam robot.

Catatan

Dimensi terkecil yang akan Anda berikan sebagai input adalah 3 2 2. Program Anda dapat melakukan apa saja dengan dimensi yang lebih kecil dari3 2 2 .

Testcases

3 2 10

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

sumber
Terkait .
Leaky Nun
Ini bukan kubus, jadi saya pikir pertanyaan saya cukup terpisah. Bisa mengubah karakter.
2
Tolong, lebih banyak testcases?
Leaky Nun
1
Juga, ini pertanyaan yang bagus. Saya pikir kita belum memilikinya.
Rɪᴋᴇʀ
1
Untuk apa hasilnya 3 2 10?
Downgoat

Jawaban:

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

Mencetak baris demi baris. Indeks baris idihitung mundur dari dke -h+1.

Tidak
sumber
Anda dapat memangkas 3 byte dengan menggantinya ' '*min(d-i,h-1,w+1,h-1+i)dengan(' '*d)[max(0,i):h-1+i]
RootTwo
1

Ruby, 145 byte

Mengembalikan daftar string. Setiap elemen dalam daftar sesuai dengan garis. Jika string multiline harus dikembalikan, tambahkan 3 byte untuk ditambahkan *$/tepat sebelum braket terakhir.

->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+?/)}}
Nilai Tinta
sumber
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`

Dimana \nmewakili karakter baris baru literal. Penjelasan:

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

Sunting: Disimpan 2 byte berkat @jrich.

Neil
sumber
Coba lepaskan ,r='repeat'dari depan dan ganti yang pertama [r]dengan[r='repeat']
jrich
@ jrich Terima kasih, saya awalnya ,r=(n,c=` `)=>c.repeat(n)dan ketika saya mengubah taktik saya mengabaikan kemungkinan pengaturan ulang.
Neil
1

Python 224 301 297 Bytes

(Sekarang Berfungsi untuk semua kotak termasuk 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

Penjelasan:

Dibawa dalam tiga konstanta: l (panjang), h (tinggi), w (lebar).

Jika kita melihat beberapa kotak sampel kita dapat menemukan pola dalam spasi.

Untuk kotak 3 x 4 x 3, kami akan menggunakan angka untuk mewakili spasi antar bagian.

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

Baris atas memiliki 4 spasi atau yang merupakan w + 1. Tiga baris berikutnya memiliki w - (1 * x). X menjadi garis.

Ini adalah pola yang berlanjut di seluruh garis di semua kotak. Oleh karena itu, kita dapat dengan mudah memprogram baris ini demi baris, mengalikan jumlah spasi agar sesuai dengan pola.

Berikut adalah contoh untuk kotak 5 x 5 x2.

 123 -  -  -  -  -
 12/12345678912345/|
 1/              /1|
 1 -  -  -  -  - 12|
 |              |12|
 |              |12|
 |              |12|
 |              |1/
 |12345678912345|/
  -  -  -  -  -
JoshK
sumber
Anda mungkin harus tetap bermain golf.
R
Selain itu, Anda harus menetapkan w,h,l=input()atau menjadikannya fungsi.
R
Selamat Datang di Programming Puzzles & Code Golf! Kami mewajibkan semua kiriman menjadi program lengkap yang membaca dari STDIN dan menulis ke STDOUT atau fungsi yang menerima argumen dan mengembalikan nilai. Kami juga mensyaratkan pengajuan untuk menjadi pesaing serius untuk menang pada saat posting, yang berarti kami tidak mengizinkan solusi ungolfed atau ungolfed sebagian untuk golf kode.
Alex A.
Ketika saya menjalankan kode ini di sini , ada spasi tambahan di output.
DJMcMayhem
@DrGreenEggsandHamDJ Memperbaikinya! Itu tidak menjelaskan pola h, w, dan l tertentu, jadi saya menambahkan beberapa pernyataan if.
JoshK
0

Python 3.5, 328 326 313 305 295 248 byte

( Terima kasih kepada Kevin Lau untuk tip tentang mengurangi ukuran pernyataan ternary! )

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

Mengambil input sebagai 3 bilangan bulat dalam urutan width, height, depth. Akan golf lebih dari waktu ke waktu dimanapun saya bisa.

Cobalah online! (Ideone)

Penjelasan:

Untuk keperluan penjelasan ini, asumsikan fungsi dieksekusi dengan argumen di (3,2,3)mana 3 adalah lebar ( w), 2 adalah tinggi ( h), dan 3 adalah kedalaman ( d). Yang sedang berkata, izinkan saya mulai dengan menunjukkan bagian utama dari seluruh fungsi:

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

Di sini, dua daftar yang membentuk seluruh "rumah" dibuat dan kemudian bergabung bersama dengan baris baru secara literal ( \n). Mari kita sebut mereka masing-masing adaftar dan daftar b, dan analisis masing-masing:

  • Di sinilah daftar adibuat:

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

    Daftar ini berisi dbaris pertama rumah. Di sini, iadalah setiap angka dalam kisaran di 0=>(d-(d-h))+d-hmana d-h=0jika negatif atau nol. Untuk memulai, d-ispasi ditambahkan ke daftar, diikuti oleh a /dan kemudian apa pun yang dikembalikan oleh pernyataan kondisional terkompresi. Dalam pernyataan bersyarat ini, w-2jumlah spasi dikembalikan jika i>1. Kalau tidak, jumlah yang sama -dikembalikan. Kemudian, ini ditindaklanjuti oleh yang lain /, dan kemudian spasi, di mana jumlah ruang sekarang tergantung pada apakah atau tidak i<=d-(d-h)-1. Jika ya, maka ispasi ditambahkan. Jika tidak, h-1spasi ditambahkan. Akhirnya, ini semua diakhiri dengan baik a /atau a |, di mana| ditambahkan jika i<=d-(d-h)-1, sebaliknya a/telah ditambahkan. Dalam kasus3x2x3prisma, ini akan dikembalikan oleh daftar a:

          /-/|
         / / |
        / / /
    
  • Di sinilah daftar bdibuat:

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

    Daftar ini berisi sisa garis prisma. Dalam daftar ini, iadalah setiap bilangan bulat dalam kisaran di (h-(h-d))+h-d=>0mana h-d=0jika negatif atau nol. Untuk memulai daftar ini, pertama a |ditambahkan karena baris ini selalu dimulai dengan a |. Kemudian, baik spasi, -atau _ditambahkan tergantung pada apakah atau tidak i=hatau i<2. Jika i<2, maka a _ditambahkan. Jika tidak, -ditambahkan jika i=h, atau ruang ditambahkan jika i>hatau i<hatau i>2. Setelah keputusan ini dibuat, maka w-2jumlah karakter yang dipilih ditambahkan. Setelah ini, yang lain |ditambahkan, dan kemudian salah satu i-1ataud jumlah ruang ditambahkan. Jika i>h-(h-d), maka adjumlah spasi ditambahkan. Jika tidak,i-1jumlah spasi ditambahkan. Akhirnya, ini semua diakhiri dengan a |atau a /, di mana a |ditambahkan jika i>h-(h-d), atau a /ditambahkan jika i<=h-(h-d). Dalam kasus 3x2x3prisma, daftar bmengembalikan:

        |-| /
        |_|/
    

Setelah 2 daftar telah dibuat, mereka akhirnya bergabung dengan baris baru literal ( \n) menggunakan '\n'.join(). Ini adalah prisma lengkap Anda, dan dalam hal ini, akan terlihat seperti ini:

       /-/|
      / / |
     / / /
    |-| /
    |_|/
R. Kap
sumber
1
Boolean Python mengevaluasi ke bilangan bulat, yang berarti sebagian besar terner Anda dapat dikompresi menjadi hal-hal seperti '-_'[f<2]. Akhirnya, R=range;S,V,L=' |/'bekerja untuk menetapkan variabel awal Anda karena string dengan senang hati akan membongkar diri mereka sendiri untuk Anda dalam situasi itu.
Value Ink
Sudahlah, saya lupa bahwa operator tidak ada di Python ... Tapi sisanya harus bekerja!
Value Ink
@ KevinLau-notKenny Wow, terima kasih atas tipsnya! :) Saya tidak tahu bahwa ekspresi ternary dapat diekspresikan dengan cara itu!
R. Kap
Anda dapat menggunakan trik itu untuk terner selama Anda tidak mengubah variabel di dalamnya. Misalnya, a=1 if b<9 else c=5tidak dapat diekspresikan [a=1,c=5][b<9]karena Anda akan akhirnya mengubah keduanya adan c. Ini adalah halaman tips golf PPCG Python: codegolf.stackexchange.com/questions/54/…
Value Ink
Anda masih memiliki satu ternary yang masih ada di sana '_'if f<2else' -'[f==h],. Ingat booleans mengevaluasi sebagai bilangan bulat, sehingga Anda bisa "rantai" ternary ini ke yang lain yang ingin Anda dapatkan [' -'[f==h],'_'][f<2]. Anda juga belum menggunakan tip saya S,V,L=' |/'.
Value Ink