สร้างห้องที่เรียบง่ายใน ASCII-art


15

ห้องพักอาจประกอบด้วยสี่เหลี่ยมที่เชื่อมต่อกันเช่นห้องรูปตัวแอล ห้องดังกล่าวสามารถอธิบายโดยรายการขนาดที่อธิบายขนาดของแต่ละสี่เหลี่ยมผืนผ้า

สมมติว่าคุณมีสองรายการอินพุต ส่วนแรกประกอบด้วยความกว้างของรูปสี่เหลี่ยมผืนผ้าที่เรียงซ้อนกันในแนวตั้ง ที่สองประกอบด้วยความสูงของสี่เหลี่ยม

ตัวอย่างเช่นอินพุต[4 6][3 2]จะเป็นรูปสี่เหลี่ยมผืนผ้าขนาด 4 x 3 ที่ด้านบนของรูปสี่เหลี่ยมผืนผ้าขนาด 6 x 2 รูปด้านล่างแสดงรูปร่างนี้ โปรดทราบว่าผนังนั้นถือว่า "บาง" ดังนั้นจึงเป็นช่องว่างระหว่างผนังที่ถูกกำหนดโดยอินพุต

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

ความท้าทายคือ: ใช้รายการมิติเป็นอินพุตและแสดงรูปร่างของห้องเป็น ASCII-art รูปแบบจะต้องเป็นในรูปตัวอย่าง:

  • ผนังแนวนอนทั้งหมดแสดงโดยใช้ขีดล่าง
  • ผนังแนวตั้งทั้งหมดจะแสดงโดยใช้บาร์
  • จะไม่มีกำแพงที่เชื่อมต่อกับรูปสี่เหลี่ยมผืนผ้า
  • ผนังด้านซ้ายตรง
  • สำหรับรายละเอียดเพิ่มเติมให้ดูที่กรณีทดสอบ

สมมติฐานที่คุณสามารถทำได้:

  • มิติทั้งหมดอยู่ในช่วง [1 ... 20]
    • ขนาดขอบฟ้าทั้งหมดเป็นเลขคู่
  • จำนวนของรูปสี่เหลี่ยมจะอยู่ในช่วง [1 ... 10]
  • ป้อนอินพุตที่ถูกต้องเท่านั้น
  • รูปแบบอินพุตเพิ่มเติม (คุณสามารถตัดสินใจลำดับของขนาดอินพุตโปรดระบุในคำตอบ)

กรณีทดสอบ:

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

คุณสามารถตัดสินใจลำดับของขนาดอินพุตหมายความว่าเราสามารถสลับแถวและคอลัมน์และย้อนกลับได้หรือไม่ เช่นนี้: รูปแบบการป้อนข้อมูลตัวอย่างของคุณ: [2 14 6 8 4 18 2 10 4 2][1 2 3 1 2 1 1 1 2 1]-> (สลับและย้อนกลับ) -> รูปแบบการป้อนข้อมูลของฉัน:[1 2 1 1 1 2 1 3 2 1][2 4 10 2 18 4 8 6 14 2]
daavko

ใช่ไม่เป็นไร :-)
Stewie Griffin

ขอบคุณ กลับกลายเป็นว่าฉันไม่จำเป็นต้องย้อนกลับพวกเขาเพียงแค่สลับ
daavko

คำตอบ:


1

เรติน่า, 169 150 113 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

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

รหัสประกอบด้วยช่องว่างต่อท้ายบนบรรทัดใหม่ต่อท้าย

รูปแบบอินพุต:

ความสูง (คั่นด้วยช่องว่าง)
ความกว้าง (คั่นด้วยช่องว่าง)

ตัวอย่างเช่น:

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

ลองออนไลน์!


4

JavaScript (ES6) 174

ส่วนที่สำคัญเพียงอย่างเดียวคือแถวแนวนอนรวม 2 ส่วนที่มีความกว้างต่างกันโดยมีแถบแนวตั้งทางด้านขวาที่สามารถอยู่ตรงกลางหรือด้านขวาสุด

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

ทดสอบ

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 ไบต์

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

ขอบคุณ @StewieGriffin @KevinLau สำหรับความช่วยเหลือ

ผล

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

อัฒภาค! พวกเขาแยกการมอบหมายของคุณและช่วยคุณจากการเยื้องที่ไม่พึงประสงค์! ( a=1;b=2)
CalculatorFeline

"solutoin"> solution
Matt

การจัดทำดัชนีสตริง! m=' _'แทนการm=[' ','_']บันทึกเช่น 5 ไบต์
มูลค่าหมึก

3

ทับทิม 191

ครั้งแรกที่เล่นกอล์ฟเป็นวันแรกของฉันกับ Ruby ดังนั้นมันอาจไม่ใช่สิ่งที่หรูหราที่สุดในโลก แต่มันจะทำอย่างไร

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.