Durchscheinende Kästchen zeichnen


15

Hinweis: Die String-Grafik könnte hier wegen der SE-Schriften-Verrücktheit schrecklich aussehen: P :(

Zeichnen Sie mit einer Liste von vier Tupeln, die die Ecken von Rechtecken darstellen, durchscheinende Rechtecke in dieser Reihenfolge übereinander.

Für diese Herausforderung ist es erforderlich, dass die kleinste Koordinate in der linken oberen Ecke und die x-Achse nach rechts und die y-Achse nach unten zunimmt.

Ein Vierertupel (x0, y0, x1, y1)oder (x0, x1, y0, y1)repräsentiert die (x, y)Koordinatenpaare der oberen linken und unteren rechten Ecke eines Rechtecks ​​(Sie können eines der beiden Formate für Rechtecke auswählen, aber es muss konsistent sein).

Was meine ich mit "durchscheinendem Rechteck"? Nun, für diese Herausforderung werden Sie das Leerzeichen und die meisten Box- Zeichen verwenden. Insbesondere alle, die zum Zeichnen von Rechtecken verwendet werden, einschließlich "fetter" Zeichen. Wenn ein durchscheinendes Rechteck gezeichnet wird, verschwinden zuerst alle dünnen Linien im besetzten Raum und alle fetten Linien werden dünn, und dann wird das Rechteck selbst in fetten Linien überzeichnet.

Wenn Sie beispielsweise oben links und unten rechts ein Rechteck zeichnen, sieht es möglicherweise so aus:

┏━━━━┓
┃    ┃
┃    ┃
┃ ┏━━╇━━┓
┃ ┃  │  ┃
┗━╉──┘  ┃
  ┃     ┃
  ┃     ┃
  ┗━━━━━┛

Um es klar auszudrücken, werden Linien für alle Linien innerhalb des Rechtecks ​​aufgehellt (fett -> dünn -> keine) (z. B. sind nach unten weisende Linien für die Oberkante, aber nicht für die Unterkante betroffen).

Testfälle

Für jeden Testfall wird eine bestimmte Anzahl von Eingabezeilen gefolgt von Unicode-Art angegeben.

0 0 5 5
5 5 10 10
3 3 7 7
2 2 8 8

┏━━━━┓     
┃    ┃     
┃ ┏━━╇━━┓  
┃ ┃┌─┴─┐┃  
┃ ┃│   │┃  
┗━╉┤   ├╊━┓
  ┃│   │┃ ┃
  ┃└─┬─┘┃ ┃
  ┗━━╈━━┛ ┃
     ┃    ┃
     ┗━━━━┛

14 5 15 9
13 2 15 16
6 4 15 11


             ┏━┓
             ┃ ┃
      ┏━━━━━━╇━┫
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┗━━━━━━╈━┫
             ┃ ┃
             ┃ ┃
             ┃ ┃
             ┃ ┃
             ┗━┛

6 8 10 11
15 12 16 16
14 10 16 16
9 1 15 15

         ┏━━━━━┓ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
      ┏━━╉┐    ┃ 
      ┃  ┃│    ┃ 
      ┃  ┃│   ┌╊┓
      ┗━━╉┘   │┃┃
         ┃    │┠┨
         ┃    │┃┃
         ┃    │┃┃
         ┗━━━━╈┩┃
              ┗┷┛

Generieren Sie weitere Testfälle!

Regeln

  • Die Eingabe kann in jedem vernünftigen Format für eine Liste mit vier Tupeln erfolgen. Die Eingabe kann entlang jeder Achse (dh die obere linke Ecke kann eine beliebige von einer indizierten oder Null-indexiert werden (0, 0), (0, 1), (1, 0), (1, 1).
  • Die Ausgabe muss wie beschrieben in Unicode erfolgen. Die Ausgabe enthält möglicherweise keine führenden Zeilenumbrüche und höchstens einen nachgestellten Zeilenumbruch (nach der letzten Zeile). Nachgestellte Leerzeichen werden bei dieser Abfrage ignoriert.

Code-Punkte

Die fetten und hellen horizontalen und vertikalen Rohre sind im Bereich [U+2500, U+2503]. Die verschiedenen Eckrohre sind im Sortiment [U+250C, U+251C). Die dreiarmigen Pfeifen sind im Sortiment [U+251C, U+253C). Die vierarmigen Pfeifen sind im Sortiment [U+253C, U+254C). Die restlichen Pipes, die in meinem Programm zu finden sind, werden nie wirklich verwendet.


Ist das wirklich Kunst? Abgesehen von Leerzeichen werden keine ASCII-Zeichen verwendet.
Caird Coinheringaahing

@cairdcoinheringaahing Von der ASCII-Art- InfoTypically this uses only 95 printable (from a total of 128) characters defined by the ASCII Standard from 1963.
totalhuman


Können wir von hier aus das Zeichen s / w 220 - 223 verwenden? für die fetten Zeilen dochome.programbl.com/dochome/sites/default/files/image169.png
Mukul Kumar

1
@MukulKumar Nein, Sie müssen genau diese Zeichen verwenden. Sie dürfen jeden nicht duplizierten Teilstring einer Permutation des gesamten Zeichensatzes als Eingabe verwenden, damit Sie keine Bytes / Zeichen verschwenden müssen, in denen die Zeichen fest
codiert sind

Antworten:


3

Python 3 , 289 286 Bytes

l,u=eval(input())
*_,w,h=map(max,zip(*l))
r=[*map(list,[' '*-~w]*-~h)]
R=range
for x,y,X,Y in l:
 for i in R(x,X+1):
  for j in R(y,Y+1):Q=i<X,y<j,x<i,j<Y;r[j][i]=u[sum(3**o*max(Q[o]*[j in(y,Y),i in(x,X)][o%2]*2,u.index(r[j][i])//3**o%3-Q[o])for o in R(4))]
for l in r:print(''.join(l))

Probieren Sie es online!

Nimmt die Eingabe als eine Liste von 4-Tupeln: (x0, y0, x1, y1)zusammen mit den Pipedrawing-Zeichen wie folgt vor:" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

Unterstützt Kästchen mit einer Breite oder Höhe von Null (verwendet alle Zeichen für Kästchen).

Basierend auf meiner Antwort auf diese Frage , aber modifiziert, um vorhandene Felder beim Zeichnen zu ändern.

"Ungolfed":

u=" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

#Create array of spaces:
l=eval(input())
w,h=list(map(max,zip(*l)))[2:]
r=[[' ']*w for _ in' '*h]

for x,y,X,Y in l:
 n,m=X-1,Y-1
 for i in range(x,X):
  for j in range(y,Y):
   A,B=j in(y,m),i in(x,n)
   P=(i<n*A,y<j*B,x<i*A,j<m*B)   # Pipe sides of the new box
   Q=(i<n,y<j,x<i,j<m)           # Pipe sides that are inside the new box, and should be thinned.
   # Get new pipe (sides of new box, on top of thinned pipes of existing boxes. (u.index... is existing pipe))
   l=sum(3**o*max(P[o]*2,(u.index(r[j][i])//3**o%3)-Q[o])for o in range(4))
   #Add to 'canvas'
   r[j][i]=u[l]

print('\n'.join(''.join(l)for l in r))

Sie können uals Eingabe nehmen.
HyperNeutrino

@HyperNeutrino danke :)
TFeld

Sie können ein Byte speichern , indem Sie Ihre unnötige Variable mit und ersetzt _,_,w,h=mit *_,w,h=.
Jonathan Frech

Außerdem benötigt Ihre Tupelzuordnung zu Qkeine Klammern und Q=(i<X,y<j,x<i,j<Y);kann durch Q=i<X,y<j,x<i,j<Y;zwei gespeicherte Bytes ersetzt werden.
Jonathan Frech

@ JonathanFrech Danke :)
TFeld

2

JavaScript (ES6), 298 261 Byte

(a,u,m=n=>[...Array(1+Math.max(...a.map(t=>t[n])))])=>m(3).map((_,j)=>m(2).map((_,i)=>u[a.reduce((c,[x,y,v,w])=>i<x|j<y|i>v|j>w?c:(g=n=>c-=c/n%3|0&&n,h=n=>c+=n*(2-(c/n%3|0)),[i>x&&9,i<v].map(j>y&j<w?g:h),[j>y&&3,j<w&&27].map(i>x&i<v?g:h),c),0)]).join``).join`\n`

Wobei \ndas wörtliche Zeilenumbruchzeichen darstellt. Basierend auf meiner Antwort auf Unicode-Rechtecke . Erläuterung: Zum Einzeichnen wird ein Array von Leerzeichenfolgen erstellt. Jedes Leerzeichen wird dann verarbeitet, indem alle Felder in der Eingabe in einer Schleife durchlaufen werden. Zeichen, die außerhalb der Box liegen, werden dann ignoriert, die am Rand oder innen liegenden Zeichen jedoch weiterverarbeitet. Für jedes der vier Liniensegmente, die ein Zeichen bilden (jedes durch eine Potenz von 3 dargestellt), gibt es dann drei Möglichkeiten; a) Das Segment liegt direkt außerhalb der Box und sollte ignoriert werden (erreicht durch Übergabe eines Parameters von 0 anstelle der Potenz von 3) b) Das Segment liegt am Rand der Box und sollte fett sein (erreicht durch Aufrufen der hFunktion) c) das segment liegt in der box und sollte aufgehellt werdengFunktion). Das Zeichen wird dann in die Unicode-Zeichenfolge indiziert. Sobald alle Felder verarbeitet wurden, wird das Array in Zeilenumbrüchen verbunden.

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.