Representación de caja ASCII

11

Tarea

Su tarea es escribir un programa que genere cuadros ASCII en las ubicaciones especificadas por la entrada.

Entrada

Se le dará una lista de números. El formato aquí es un poco flexible, ya que puede usar cualquier deliminador que desee (p 1,2,3,4. Ej . 1 2 3 4, [1,2,3,4]). La lista está en grupos de 4 y especifica el xywhde cada cuadro. El ancho y la altura de cada cuadro serán al menos 2. xy widthserán de izquierda a derecha. yy heightson de arriba a abajo.

Salida

La representación se puede considerar como de derecha a izquierda, con el cuadro de la derecha dibujado primero, y cada cuadro después de eso está sobre él. Se permiten espacios finales, así como una nueva línea final.

Cómo manejar cajas superpuestas

El cuadro a la izquierda de la entrada es el cuadro superior, y nada se superpondrá. Cada cuadro después de que se representa solo en el espacio que no está contenido en un cuadro ya y no reemplazará el borde de un cuadro ya representado.

Estilo

El estilo de los cuadros es bastante estándar, se +usa para esquinas, se -usa para líneas horizontales y se |usa para líneas verticales.

Ejemplos:

( >>>denota entrada)

>>>0 0 11 4 7 2 8 4 3 5 8 3
+---------+
|         |
|         |---+
+---------+   |
       |      |
   +---+------+
   |      |
   +------+


>>>0 3 11 4 7 5 8 4 3 8 8 3 4 0 13 5
    +-----------+
    |           |
    |           |
+---------+     |
|         |-----+
|         |---+
+---------+   |
       |      |
   +---+------+
   |      |
   +------+


>>>0 0 2 2
++
++


>>>2 2 5 3 1 1 7 5 0 0 9 7
+-------+
|+-----+|
||+---+||
|||   |||
||+---+||
|+-----+|
+-------+

>>>0 0 3 3 2 0 3 3
+-+-+
| | |
+-+-+
J Atkin
fuente
¿No debería ser ese medio en 4 0 13 5lugar de 0 4 13 5?
Neil
El segundo rectángulo desde abajo en los primeros 2 casos tiene x = 7 (para ser consistente con los rectángulos x = 0)
Level River St el
1
Gracias por notarlo, rara vez escribo respuestas a mis preguntas, y todo esto es a mano ...
J Atkin
@JAtkin Lo siento, me perdí eso.
Conor O'Brien
Está bien, con frecuencia también extraño cosas cuando leo;)
J Atkin

Respuestas:

4

APL, 116 bytes

{⎕IO←0⋄K←' '⍴⍨⌽+⌿2 2⍴⌈⌿↑⍵⋄K⊣{x y W H←⍵-⌊.5×⍳4⋄K[Y←y+⍳H;X←x+⍳W]←' '⋄K[Y;A←x+0 W]←'|'⋄K[B←y+0 H;X]←'-'⋄K[B;A]←'+'}¨⌽⍵}

Esta es una función que toma una matriz de matrices y devuelve una matriz de caracteres.

Pruebas:

      t1← (0 0 11 4)(8 2 8 4)(3 5 8 3)
      t2← (0 3 11 4)(8 5 8 4)(3 8 8 3)(4 0 13 5)
      t3← (⊂0 0 2 2)
      t4← (2 2 5 3)(1 1 7 5)(0 0 9 7)
      {⎕IO←0⋄K←' '⍴⍨⌽+⌿2 2⍴⌈⌿↑⍵⋄K⊣{x y W H←⍵-⌊.5×⍳4⋄K[Y←y+⍳H;X←x+⍳W]←' '⋄K[Y;A←x+0 W]←'|'⋄K[B←y+0 H;X]←'-'⋄K[B;A]←'+'}¨⌽⍵} ¨ t1 t2 t3 t4
┌───────────────────┬─────────────────────┬────┬───────────┐
│+---------+        │    +-----------+    │++  │+-------+  │
│|         |        │    |           |    │++  │|+-----+|  │
│|         |----+   │    |           |    │    │||+---+||  │
│+---------+    |   │+---------+     |    │    │|||   |||  │
│        |      |   │|         |-----+    │    │||+---+||  │
│   +----+------+   │|         |----+     │    │|+-----+|  │
│   |      |        │+---------+    |     │    │+-------+  │
│   +------+        │        |      |     │    │           │
│                   │   +----+------+     │    │           │
│                   │   |      |          │    │           │
│                   │   +------+          │    │           │
│                   │                     │    │           │
│                   │                     │    │           │
└───────────────────┴─────────────────────┴────┴───────────┘

Explicación:

  • ⎕IO←0: establece el origen del índice en 0.
  • Cree una matriz del tamaño correcto:
    • ⌈⌿↑⍵: encuentra los valores más grandes para x, y, w y h
    • +⌿2 2⍴: x + w e y + h
    • K←' '⍴⍨⌽: crea una matriz de espacios x + w * y + h y la almacena en K.
  • Dibuja las cajas en él:
    • {... }¨⌽⍵: para cada una de las cajas, en orden inverso,
      • x y W H←⍵-⌊.5×⍳4: Asignar las coordenadas a x, y, W, y H, y restar 1 a la vez Wy H. (las coordenadas son exclusivas, los rangos de matriz APL son inclusivos).
      • K[Y←y+⍳H;X←x+⍳W]←' ': rellena el cuadro actual con espacios
      • K[Y;A←x+0 W]←'|': dibuja los lados verticales
      • K[B←y+0 H;X]←'-': dibuja los lados horizontales
      • K[B;A]←'+': establece los bordes en '+'
    • K⊣: luego, regreso K.
marinus
fuente
1
APL es un lenguaje de aspecto extraño para un extraño ...
J Atkin
3

ES6, 228 223 217 208 201 198 bytes

Acepta una matriz de matrices de coordenadas y devuelve una cadena.

a=>a.reverse().map(([x,y,w,h])=>[...Array(y+h)].map((_,i)=>(s=r[i]||'',r[i]=i<y?s:(s+' '.repeat(x)).slice(0,x)+(c=>c[0]+c[1].repeat(w-2)+c[0])(y-i&&y+h-1-i?'| ':'+-')+s.slice(x+w))),r=[])&&r.join`\n`

Donde \nrepresenta un carácter de nueva línea.

Editar: guardado 5 bytes al invertir mis condiciones. Ahorró otros 6 bytes al cambiar de una matriz de matrices de caracteres a una matriz de cadenas. Se guardaron otros 9 bytes al introducir una variable temporal. Se guardaron otros 7 bytes al introducir una función auxiliar. ¡Ahorré otros 3 bytes al deshacer un guardado anterior!

Neil
fuente
3

Rubí, 153 143

->n{a=(0..m=3*n.max).map{$b=' '*m}
(*n,x,y,w,h=n 
v=w-2
h.times{|i|a[y+i][x,w]=i%~-h<1??++?-*v+?+:?|+' '*v+?|}
)while n[0]
a.delete($b);puts a}

Sin golf en el programa de prueba

f=->n{                                #worst case width when x=w=large number, is max input*2+1
  a=(1..m=3*n.max).map{$b=' '*m}      #find m=max value in input, make an a array of 3*m strings of 3*m spaces 
  (
    *n,x,y,w,h=n                      #extract x,y,w,h from the end of n, save the rest back to n     
    v=w-2                             #internal space in rectangle is w-2  
    h.times{|i|                       #for each row
      a[y+i][x,w]=                    #substitute the relevant characters of the relevant lines of a 
      i%~-h<1?                        #i%~-h = i%(h-1). This is zero (<1) for first and last lines of the rectangle
      ?+ + ?-*v + ?+ :?| + ' '*v +?|  # +--...--+ or |  ...  | as required
    }
  )while n[0]                         #loop until data exhausted (n[0] becomes falsy as it does not exist)
a.delete($b);puts a}                  #delete blank rows ($b is a global variable) and display
Level River St
fuente
3

SmileBASIC, 128 125 bytes

DEF B A
WHILE LEN(A)H=POP(A)W=POP(A)-2Y=POP(A)X=POP(A)FOR I=0TO H-1LOCATE X,Y+I?"+|"[M];"- "[M]*W;"+|"[M]M=I<H-2NEXT
WEND
END

Capturas de pantalla (recortadas)

captura de pantalla captura de pantalla captura de pantalla captura de pantalla captura de pantalla

Explicación

DEF B A 'make a function and add 12 bytes :(
 WHILE LEN(A) 'repeat until array is empty
  H=POP(A):W=POP(A)-2 'get width/height
  Y=POP(A):X=POP(A) 'get x/y
  FOR I=0 TO H-1 'draw one row at a time
   LOCATE X,Y+I 'position the cursor
   PRINT "+|"[M]; 'draw left edge
   PRINT "- "[M]*W; 'draw middle
   PRINT "+|"[M] 'draw right edge
   M=I<H-2
  NEXT
 WEND
END

Malmacena si está en la primera / última fila del cuadro ( 0= +--+, 1= | |). En el primer paso a través del ciclo, Mes 0, y en todos los demás hasta el último, es 1.

12Me21
fuente
Esto es bastante agradable :)
J Atkin
El meta consenso es que no se le permite tomar información de variables predefinidas .
FlipTack
1

Pyth, 162 145 bytes

J\+K*h.MZm+@d1@d3Q]*h.MZm+@d0@d2QdD:GHb XKHX@KHGb;V_QDlTR@NTVl3Vl2:+l0b+l1H?|qHtl3qH0\-?|qbtl2qb0\|d)):l0l1J:+l0tl2l1J:l0+l1tl3J:+l0tl2+l1tl3J;jK

Puedes probarlo aquí

Salida del conjunto de pruebas:

+---------+     
|         |     
|         |----+
+---------+    |
        |      |
   +----+-+----+
   |      |     
   +------+     

++
++

+-------+
|+-----+|
||+---+||
|||   |||
||+---+||
|+-----+|
+-------+

+-+-+
| | |
+-+-+

¡Solución horrible! Solo esperando que alguien lo venza

Tenchi2xh
fuente
2
Su primer ejemplo pone un + adicional en donde las cajas comparten una ventaja.
Linus