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]
 __
|  |___________
|              |
|       _______|
|      |
|      |
|      |_
|     ___|
|    |
|    |_____________
|   _______________|
|  |______
|     ____|
|    |
|   _|
|__|

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!


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>


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]])
 __ 
|  |___________
|              |
|       _______|
|      | 
|      | 
|      |_
|     ___|
|    |             
|    |_____________
|   _______________|
|  |_______
|     _____|
|    |
|   _|
|__|

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.