Xây dựng một căn phòng đơn giản trong nghệ thuật ASCII


15

Một căn phòng có thể được tạo thành từ các hình chữ nhật được kết nối, ví dụ như một phòng hình chữ L. Một căn phòng như vậy có thể được mô tả bằng một danh sách các kích thước mô tả kích thước của mỗi hình chữ nhật.

Giả sử bạn có hai danh sách đầu vào. Cái đầu tiên chứa chiều rộng của hình chữ nhật xếp chồng lên nhau theo chiều dọc. Thứ hai chứa chiều cao của hình chữ nhật.

Ví dụ, đầu vào [4 6][3 2]sẽ là hình chữ nhật 4 x 3 trên đầu hình chữ nhật 6 x 2. Hình dưới đây cho thấy hình dạng này. Lưu ý rằng các bức tường được coi là "mỏng", do đó, khoảng cách giữa các bức tường được xác định bởi đầu vào.

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

Thách thức là: Lấy một danh sách các kích thước làm đầu vào và xuất hình dạng của căn phòng dưới dạng nghệ thuật ASCII. Định dạng phải như trong các số liệu mẫu:

  • Tất cả các bức tường ngang được hiển thị bằng cách sử dụng dấu gạch dưới
  • Tất cả các bức tường thẳng đứng được hiển thị bằng cách sử dụng các thanh
  • Không có bức tường nơi hình chữ nhật được kết nối
  • Tường bên trái thẳng
  • Để biết thêm chi tiết, hãy xem các trường hợp thử nghiệm

Giả định bạn có thể thực hiện:

  • Tất cả các kích thước nằm trong phạm vi [1 ... 20]
    • Tất cả các kích thước đường chân trời là số chẵn
  • Số lượng hình chữ nhật sẽ nằm trong phạm vi [1 ... 10]
  • Chỉ có đầu vào hợp lệ được đưa ra
  • Định dạng đầu vào tùy chọn (bạn có thể quyết định thứ tự các kích thước đầu vào, vui lòng chỉ định trong câu trả lời).

Các trường hợp thử nghiệm:

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

Bạn có thể quyết định thứ tự của kích thước đầu vào , điều đó có nghĩa là chúng ta có thể trao đổi các hàng và cột và đảo ngược chúng? Như thế này: định dạng đầu vào ví dụ của bạn: [2 14 6 8 4 18 2 10 4 2][1 2 3 1 2 1 1 1 2 1]-> (hoán đổi và đảo ngược) -> định dạng đầu vào của tôi:[1 2 1 1 1 2 1 3 2 1][2 4 10 2 18 4 8 6 14 2]
daavko

Vâng, điều đó ổn. :-)
Stewie Griffin

Cảm ơn. Hóa ra tôi có lẽ không cần phải đảo ngược chúng, chỉ cần trao đổi.
daavko

Câu trả lời:


1

Võng mạc, 169 150 113 byte

Số lượng byte giả định mã hóa ISO 8859-1.

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

Mã này chứa một khoảng trắng ở cuối dòng mới.

Định dạng đầu vào:

Chiều cao (cách nhau bởi khoảng trắng)
Chiều rộng (cũng được phân cách bằng dấu cách)

Ví dụ:

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

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


4

JavaScript (ES6) 174

Phần quan trọng duy nhất là hàng ngang nối 2 phần có chiều rộng khác nhau, với thanh dọc ở bên phải có thể ở giữa hoặc ở cuối bên phải.

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

KIỂM TRA

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

Cảm ơn @StewieGriffin @KevinLau vì sự giúp đỡ của họ

Các kết quả

>>> f([[2, 14, 6, 8, 4, 18, 2, 10, 4, 2],[1, 2, 3, 1, 2, 1, 1, 1, 2, 1]])
 __ 
|  |___________
|              |
|       _______|
|      | 
|      | 
|      |_
|     ___|
|    |             
|    |_____________
|   _______________|
|  |_______
|     _____|
|    |
|   _|
|__|

Dấu chấm phẩy! Họ tách bài tập của bạn và cứu bạn khỏi thụt đầu dòng không mong muốn! ( a=1;b=2)
Máy

Giải pháp "solutoin">
Matt

Lập chỉ mục chuỗi! m=' _'thay vì m=[' ','_']tiết kiệm như 5 byte.
Giá trị mực

3

Ruby 191

Lần đầu tiên chơi golf, đó cũng là ngày đầu tiên của tôi với Ruby, vì vậy đây có lẽ không phải là điều thanh lịch nhất trên thế giới, nhưng nó sẽ làm gì?

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