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]
 __
|  |___________
|              |
|       _______|
|      |
|      |
|      |_
|     ___|
|    |
|    |_____________
|   _______________|
|  |______
|     ____|
|    |
|   _|
|__|
Stewie Griffin
źródło
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!

daavko
źródło
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>

edc65
źródło
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]])
 __ 
|  |___________
|              |
|       _______|
|      | 
|      | 
|      |_
|     ___|
|    |             
|    |_____________
|   _______________|
|  |_______
|     _____|
|    |
|   _|
|__|
Erwan
źródło
Ś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
Wartość tuszu
źródło