Bangun kamar sederhana dalam seni ASCII

15

Sebuah ruangan dapat terdiri dari empat persegi panjang yang terhubung, misalnya sebuah ruangan berbentuk L. Ruangan seperti itu dapat dideskripsikan dengan daftar dimensi yang menggambarkan ukuran masing-masing persegi panjang.

Asumsikan Anda memiliki dua daftar input. Yang pertama berisi lebar persegi panjang yang ditumpuk secara vertikal satu sama lain. Yang kedua berisi ketinggian persegi panjang.

Sebagai contoh, input [4 6][3 2]akan menjadi persegi panjang 4-by-3 di atas persegi panjang 6-oleh-2. Gambar di bawah ini menunjukkan bentuk ini. Perhatikan bahwa dinding dianggap "tipis", jadi itu adalah ruang antara dinding yang ditentukan oleh input.

[4 6][3 2]
 ____
|    |
|    |
|    |_
|      |
|______|

Tantangannya adalah: Ambil daftar dimensi sebagai input, dan output bentuk ruangan sebagai seni ASCII. Formatnya harus seperti pada contoh sampel:

  • Semua dinding horizontal ditampilkan menggunakan garis bawah
  • Semua dinding vertikal ditampilkan menggunakan batang
  • Tidak akan ada dinding di mana persegi panjang terhubung
  • Dinding kiri lurus
  • Untuk lebih jelasnya, lihat kasus uji

Asumsi yang dapat Anda buat:

  • Semua dimensi berada dalam kisaran [1 ... 20]
    • Semua dimensi horizonal adalah bilangan genap
  • Jumlah persegi panjang akan berada dalam kisaran [1 ... 10]
  • Hanya input yang valid yang diberikan
  • Format input opsional (Anda dapat menentukan urutan dimensi input, harap tentukan dalam jawabannya).

Kasus uji:

[2][1]
 __
|__|

---

[4][2]
 ____
|    |
|____|

---

[2 6 2 4][2 2 1 3]
 __
|  |
|  |___
|      |
|   ___|
|  |_
|    |
|    |
|____|

---

[2 14 6 8 4 18 2 10 4 2][1 2 3 1 2 1 1 1 2 1]
 __
|  |___________
|              |
|       _______|
|      |
|      |
|      |_
|     ___|
|    |
|    |_____________
|   _______________|
|  |______
|     ____|
|    |
|   _|
|__|
Stewie Griffin
sumber
Anda dapat menentukan urutan dimensi input , apakah itu berarti kami dapat menukar baris dan kolom, dan membalikkannya? Seperti ini: contoh format input Anda: [2 14 6 8 4 18 2 10 4 2][1 2 3 1 2 1 1 1 2 1]-> (swap and reverse) -> format input saya:[1 2 1 1 1 2 1 3 2 1][2 4 10 2 18 4 8 6 14 2]
daavko
Ya, tidak apa-apa. :-)
Stewie Griffin
Terima kasih. Ternyata saya mungkin tidak perlu membalikkannya, cukup tukar.
daavko

Jawaban:

1

Retina, 169 150 113 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

\ d +
$ *
{+ r`1 (1 * ¶ [^ |] * (1+))
$ 1¶ | $ 2 |
} `(¶. *) 1+
$ 1
1
_
(\ | _ +) \ | (? = ¶ \ 1 _ (_ +))
$ 1 | $ 2
T`w` `(\ | _ +) _? (? = _ * \ |. * ¶ \ 1)
^ ¶
 

Kode ini berisi spasi tambahan pada baris baru tambahan.

Masukkan format:

Tinggi (dipisahkan oleh spasi)
Lebar (juga dipisahkan oleh spasi)

Sebagai contoh:

1 2 3 1 2 1 1 1 2 1
2 14 6 8 4 18 2 10 4 2

Cobalah online!

daavko
sumber
4

JavaScript (ES6) 174

Satu-satunya bagian penting adalah baris horizontal yang menyatukan 2 bagian dengan lebar berbeda, dengan bilah vertikal di sisi kanan yang bisa di tengah atau di ujung kanan.

(p,h,q=-1,R=(n,s=' ')=>s.repeat(n))=>[...p,0].map((x,i)=>(x>q?p=x:(p=q,q=x),(~q?`
|`+R(q+(x<p)-!x)+R(x>q,'|'):' ')+R(p+~q+!x,'_')+R(x<p,'|')+R(h[i]-1,`
|${R(q=x)}|`))).join``

UJI

f=(p,h,q=-1,R=(n,s=' ')=>s.repeat(n))=>[...p,0].map((x,i)=>(x>q?p=x:(p=q,q=x),(~q?`
|`+R(q+(x<p)-!x)+R(x>q,'|'):' ')+R(p+~q+!x,'_')+R(x<p,'|')+R(h[i]-1,`
|${R(q=x)}|`))).join``

// Less golfed

F=(p,h, q=-1, 
   R=(n,s=' ')=>s.repeat(n)
  )=>
  [...p, 0].map((x,i)=> (
    x>q? p=x : (p=q,q=x),
    (q>=0?`\n|`+R(q+(x<p)-!x)+R(x>q,'|'):' ')
    + R(p+~q+!x,'_') + R(x<p,'|')
    + R(h[i]-1,`\n|${R(q=x)}|`)
  )).join``

console.log=x=>O.textContent+=x+'\n'

;[  
  [[2],[1]],
  [[4],[2]],
  [[2, 6, 2, 4],[2, 2, 1, 3]],
  [[2, 14, 6, 8, 4, 18, 2, 10, 4, 2],[1, 2, 3, 1, 2, 1, 1, 1, 2, 1]]
].forEach(t=>{
  var w=t[0],h=t[1]
  console.log('['+w+'] ['+h+']\n'+f(w,h)+'\n')
})
<pre id=O></pre>

edc65
sumber
4

Python 3, 230 223 222 217 217 byte

def f(a):b=a[0]+[0];m=' _';print('\n'.join([' '+'_'*b[0]+' ']+['|'+' '*min(b[l],b[l+1])+m[b[l+1]<1]*(b[l]>b[l+1])+m[k]*(b[l]-b[l+1]-1)+'|'+m[k]*(b[l+1]-b[l]-1)for l,i in enumerate(zip(*a))for k in[0]*(i[1]-1)+[1]]))

Terima kasih kepada @StewieGriffin @KevinLau untuk bantuan mereka

Hasil

>>> f([[2, 14, 6, 8, 4, 18, 2, 10, 4, 2],[1, 2, 3, 1, 2, 1, 1, 1, 2, 1]])
 __ 
|  |___________
|              |
|       _______|
|      | 
|      | 
|      |_
|     ___|
|    |             
|    |_____________
|   _______________|
|  |_______
|     _____|
|    |
|   _|
|__|
Erwan
sumber
Titik koma! Mereka memisahkan tugas Anda dan menyelamatkan Anda dari lekukan yang tidak diinginkan! ( a=1;b=2)
CalculatorFeline
"solutoin"> solusi
Matt
Pengindeksan string! m=' _'bukannya m=[' ','_']menghemat seperti 5 byte.
Nilai Tinta
3

Ruby 191

Pertama kali bermain golf, juga ini adalah hari pertamaku dengan Ruby, jadi mungkin itu bukan hal yang paling elegan di dunia, tetapi itu akan berhasil?

def f(x)
a=x[0]+[0]
puts" #{'_'*a[0]} "
for i in 0..x[1].length-1
n,m=a[i,2].sort
puts"|#{' '*a[i]}|\n"*(x[1][i]-1)+'|'+' '*n+(a[i+1]<1?'_':m>a[i]?'|':' ')+'_'*(m-n-1)+(n<a[i]?'|':'')
end
end
Nilai Tinta
sumber