Zbuduj prosty pokój w ASCII-art


15

Pokój może składać się z połączonych prostokątów, na przykład pokój w kształcie litery L. Taki pokój można opisać listą wymiarów opisujących rozmiar każdego prostokąta.

Załóżmy, że masz dwie listy danych wejściowych. Pierwszy zawiera szerokość prostokątów ułożonych pionowo jeden nad drugim. Drugi zawiera wysokość prostokątów.

Na przykład wejściem [4 6][3 2]będzie prostokąt 4 na 3 na szczycie prostokąta 6 na 2. Poniższy rysunek pokazuje ten kształt. Zauważ, że ściany są uważane za „cienkie”, dlatego odległości między ścianą są określane przez dane wejściowe.

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

Wyzwanie jest następujące: weź listę wymiarów jako dane wejściowe i wyślij kształt pokoju jako ASCII-art. Format musi być taki jak na przykładowych rysunkach:

  • Wszystkie ściany poziome pokazano za pomocą podkreślników
  • Wszystkie pionowe ściany są pokazane za pomocą pasków
  • Prostokąty nie mogą mieć ścian
  • Lewa ściana jest prosta
  • Aby uzyskać więcej informacji, spójrz na przypadki testowe

Założenia, które możesz poczynić:

  • Wszystkie wymiary są w zakresie [1 ... 20]
    • Wszystkie wymiary horyzontalne są liczbami parzystymi
  • Liczba prostokątów będzie w zakresie [1 ... 10]
  • Podano tylko prawidłowe dane wejściowe
  • Opcjonalny format wejściowy (możesz określić kolejność wymiarów wejściowych, proszę podać w odpowiedzi).

Przypadki testowe:

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

Możesz zdecydować o kolejności wymiarów wejściowych , czy to oznacza, że ​​możemy zamieniać wiersze i kolumny i odwracać je? W ten sposób: twój przykładowy format wejściowy: [2 14 6 8 4 18 2 10 4 2][1 2 3 1 2 1 1 1 2 1]-> (zamień i odwróć) -> mój format wejściowy:[1 2 1 1 1 2 1 3 2 1][2 4 10 2 18 4 8 6 14 2]
daavko

Tak, w porządku. :-)
Stewie Griffin

Dzięki. Okazało się, że prawdopodobnie nie muszę ich odwracać, wystarczy zamienić.
daavko,

Odpowiedzi:


1

Siatkówka, 169 150 113 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1.

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

Kod zawiera końcowe spacje na końcowym znaku nowej linii.

Format wejściowy:

Wysokość (oddzielone spacjami)
Szerokość (również oddzielone spacjami)

Na przykład:

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

Wypróbuj online!


4

JavaScript (ES6) 174

Jedynym krytycznym elementem jest poziomy rząd łączący 2 części o różnych szerokościach, z pionowym paskiem po prawej stronie, który może znajdować się na środku lub na prawym końcu.

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

TEST

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 bajtów

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

Dzięki @StewieGriffin @KevinLau za pomoc

Wyniki

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

Średniki! Rozdzielają twoje zadania i chronią cię przed niechcianymi wcięciami! ( a=1;b=2)
CalculatorFeline

„solutoin”> rozwiązanie
Matt

Indeksowanie ciągów! m=' _'zamiast m=[' ','_']zapisuje jak 5 bajtów.
Wartość tuszu

3

Ruby 191

Pierwszy raz w golfa, to także mój pierwszy dzień z Ruby, więc to chyba nie jest najbardziej elegancka rzecz na świecie, ale się uda?

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.