Bauen Sie einen einfachen Raum in ASCII-Kunst


15

Ein Raum kann aus verbundenen Rechtecken bestehen, beispielsweise einem L-förmigen Raum. Ein solcher Raum kann durch eine Liste von Dimensionen beschrieben werden, die die Größe jedes Rechtecks ​​beschreiben.

Angenommen, Sie haben zwei Eingabelisten. Die erste enthält die Breite der Rechtecke, die vertikal übereinander gestapelt sind. Die zweite enthält die Höhe der Rechtecke.

Als Beispiel ist die Eingabe [4 6][3 2]ein 4 x 3-Rechteck über einem 6 x 2-Rechteck. Die folgende Abbildung zeigt diese Form. Beachten Sie, dass die Wände als "dünn" eingestuft werden. Daher werden die Abstände zwischen den Wänden durch die Eingabe bestimmt.

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

Die Herausforderung besteht darin, eine Liste von Dimensionen als Eingabe zu verwenden und die Form des Raums als ASCII-Kunst auszugeben. Das Format muss wie in den Beispielabbildungen sein:

  • Alle horizontalen Wände werden mit Unterstrichen dargestellt
  • Alle vertikalen Wände werden mit Balken dargestellt
  • Es dürfen keine Wände vorhanden sein, an denen die Rechtecke verbunden sind
  • Die linke Wand ist gerade
  • Weitere Details finden Sie in den Testfällen

Annahmen, die Sie treffen können:

  • Alle Maße liegen im Bereich [1 ... 20]
    • Alle horizontalen Dimensionen sind gerade Zahlen
  • Die Anzahl der Rechtecke liegt im Bereich [1 ... 10]
  • Es werden nur gültige Eingaben gemacht
  • Optionales Eingabeformat (Sie können die Reihenfolge der Eingabeabmessungen festlegen, bitte in der Antwort angeben).

Testfälle:

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

Sie können die Reihenfolge der Eingabedimensionen festlegen . Bedeutet dies, dass wir Zeilen und Spalten austauschen und umkehren können? Wie [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]
folgt

Ja, das ist in Ordnung. :-)
Stewie Griffin

Vielen Dank. Es stellte sich heraus, dass ich sie wahrscheinlich nicht umkehren muss, sondern nur tauschen muss.
Daavko

Antworten:


1

Retina, 169 150 113 Bytes

Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.

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

Der Code enthält ein abschließendes Leerzeichen in einer abschließenden Newline.

Eingabeformat:

Höhe (durch Leerzeichen getrennt)
Breite (auch durch Leerzeichen getrennt)

Beispielsweise:

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

Probieren Sie es online!


4

JavaScript (ES6) 174

Der einzige kritische Teil ist die horizontale Reihe, die 2 Teile unterschiedlicher Breite verbindet, wobei sich der vertikale Balken auf der rechten Seite in der Mitte oder am rechten Ende befinden kann.

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

PRÜFUNG

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 Bytes

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

Vielen Dank an @StewieGriffin @KevinLau für ihre Hilfe

Ergebnisse

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

Semikolons! Sie trennen Ihre Aufgaben und bewahren Sie vor unerwünschten Einrückungen! ( a=1;b=2)
CalculatorFeline

"solutoin"> solution
Matt

String-Indizierung! m=' _'statt m=[' ','_']spart wie 5 Bytes.
Value Ink

3

Rubin 191

Das erste Mal Golf spielen, es ist auch mein erster Tag mit Ruby, also ist es wahrscheinlich nicht das eleganteste Ding der Welt, aber wird es gehen?

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.