ASCII-art'ta sade bir oda inşa edin


15

Bir oda, örneğin L şeklinde bir oda gibi bağlı dikdörtgenlerden oluşabilir. Böyle bir oda, her dikdörtgenin boyutunu tanımlayan bir boyutlar listesi ile tanımlanabilir.

İki giriş listeniz olduğunu varsayın. Birincisi, dikey olarak üst üste yığılmış dikdörtgenlerin genişliğini içerir. İkincisi, dikdörtgenlerin yüksekliğini içerir.

Örnek olarak, girdi [4 6][3 2]6'ya 2 dikdörtgenin üzerinde 4'e 3 dikdörtgen olacaktır. Aşağıdaki şekil bu şekli göstermektedir. Duvarların "ince" olarak kabul edildiğine dikkat edin, bu nedenle duvar arasındaki giriş tarafından belirlenen boşluklardır.

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

Zorluk şudur: Giriş olarak boyutların bir listesini alın ve odanın şeklini ASCII-art olarak çıktılayın. Biçim, örnek resimlerdeki gibi olmalıdır:

  • Tüm yatay duvarlar alt çizgiler kullanılarak gösterilir
  • Tüm dikey duvarlar çubuklar kullanılarak gösterilir
  • Dikdörtgenlerin bağlı olduğu duvarlar olmayacaktır.
  • Sol duvar düz
  • Daha fazla ayrıntı için test senaryolarına göz atın

Yapabileceğiniz varsayımlar:

  • Tüm boyutlar aralıktadır [1 ... 20]
    • Tüm yatay boyutlar çift sayılardır
  • Dikdörtgen sayısı aralık dahilinde olacaktır [1 ... 10]
  • Yalnızca geçerli girdi verilir
  • İsteğe bağlı giriş biçimi (giriş boyutlarının sırasına karar verebilirsiniz, lütfen cevapta belirtin).

Test senaryoları:

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

Giriş boyutlarının sırasına karar verebilirsiniz , bu, satırları ve sütunları değiştirebileceğimiz ve tersine çevirebileceğimiz anlamına mı geliyor? Bunun gibi: örnek giriş biçiminiz: [2 14 6 8 4 18 2 10 4 2][1 2 3 1 2 1 1 1 2 1]-> (takas ve ters) -> giriş [1 2 1 1 1 2 1 3 2 1][2 4 10 2 18 4 8 6 14 2]
biçimim

Evet, sorun değil. :-)
Stewie Griffin

Teşekkürler. Görünüşe göre muhtemelen onları tersine çevirmem gerekmiyor, sadece takas.
daavko

Yanıtlar:


1

Retina, 169 , 150 113 bayt

Bayt sayımı ISO 8859-1 kodlamasını varsayar.

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

Kod, sondaki yeni satırda bir boşluk içeriyor.

Giriş biçimi:

Yükseklik (boşluklarla ayrılmış)
Genişlik (boşluklarla da ayrılır)

Örneğin:

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

Çevrimiçi deneyin!


4

JavaScript (ES6) 174

Tek kritik kısım, farklı genişliklerde 2 parçayı birleştiren yatay sıradır, sağ tarafta ortada veya sağda olabilen dikey çubuk vardır.

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

ÖLÇEK

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

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

@StewieGriffin @ KevinLau'ya yardımları için teşekkürler

Sonuçlar

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

Noktalı virgül! Ödevlerinizi ayırır ve sizi istenmeyen girintiden kurtarırlar! ( a=1;b=2)
CalculatorFeline

"solutoin"> çözümü
Matt

Dize indeksleme! m=' _'yerine m=[' ','_']5 byte gibi kaydeder.
Value Ink

3

Ruby 191

İlk kez golf oynadığımda, Ruby ile ilk günüm, bu yüzden muhtemelen dünyadaki en zarif şey değil, ama yapacak mı?

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.