Ajusta tu silla

18

Desafío

¡Acabas de comprar una silla nueva! El problema es que no tienes idea de cómo controlarlo, por lo que deberás escribir un programa que lo haga por ti.

Ejemplo de una silla ajustable.

Solo puedes sentarte en la silla sin ajustar durante tanto tiempo. Por lo tanto, su código deberá ser lo más breve posible.

Ejemplos

5,3,2,2,1

O
|
|
| _
| |
|_|_
  |
  |
  O

3,5,2,3,5

O
|  _
|  |
|__|__
   |
   |
 __|__
 OOOOO

2,13,1,1,13

O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO

¿Soy el único que piensa que esto parece un avión?

Partes de la silla

La silla tiene varios componentes:

O
|
|  <- Backrest
|  _  <- Armrest
|  |
|__|__ <- Seat
   |  
   |   <- Leg
  _|_
  OOO  <- Wheels

Entrada

Estarás sacando una silla dadas varias variables.

La entrada estará en el siguiente orden, todas las entradas serán números enteros positivos (siempre mayores que 0) y siempre se proporcionarán.

  1. Altura del respaldo
  2. Ancho del asiento siempre impar
  3. Altura del reposabrazos Siempre menor que la altura del respaldo
  4. Altura de la pierna
  5. Recuento de ruedas Siempre menor o igual que el ancho del asiento y Siempre impar

Descripciones detalladas de partes

Las partes de la silla son:


Respaldo: Esta cantidad |es la altura del respaldo

O
|
|

Asiento: la cantidad _es el ancho del asiento , inserte un |en el medio para el reposabrazos.

__|__

Reposabrazos: la cantidad |es la altura del reposabrazos . Esto debe insertarse en el medio del asiento.

_
|
|

Pierna: la cantidad |está determinada por la altura de la pierna

|
|

Ruedas: las ruedas están centradas debajo de las patas. Si son más de uno, todos menos la rueda central deben estar _en la línea sobre ellos.

_ _
OOO

Salida

La salida puede tener una nueva línea final. Cada línea puede tener espacios finales. El espacio en blanco inicial no está permitido

Downgoat
fuente
El tercer caso de prueba parece estar equivocado. El ancho del asiento es mucho más de 2.
Pomo de la puerta
@Doorknob 冰 whoops, eso fue un problema con el orden de entrada, lo solucioné.
Downgoat
El "avión" me recuerda muchos de estos tanques de Super Mario Bros 3 .
El'endia Starman

Respuestas:

2

LabVIEW, 146 primitivas de LabVIEW

Esto se hizo mucho más grande de lo que imaginaba ...

Esta vez no habrá un GIF, por un lado, debido al tamaño, por otro lado, porque no hay forma de que alguien pueda seguir todos los datos que fluyen.

Funciona, a menos que obtenga LabVIEW y sugiera un proveedor de archivos, no habrá forma de verificarlo.

Eumel
fuente
9

JavaScript (ES6), 197 bytes

(b,s,a,l,w)=>eval('o="";for(i=0;i<b+l+2;i++)o+=(i?i>b?x[r](s/2-w/2+1)+(i>b+l?"O"[r](w):(p=(i<b+l?x:"_")[r](w/2))+"|"+p):"|"+(p=(i-b?x=" ":"_")[r="repeat"](s/2))+(i>b-a?"|":i<b-a?x:"-")+p:"O")+`\n`')

Explicación

Bueno, esto se volvió bastante complicado bastante rápido. Solo comentaré lo que hace cada línea a un alto nivel. Esperemos que con este formato no sea demasiado difícil seguir a todos los operadores ternarios.

(b,s,a,l,w)=>
  eval(
    o="";
    for(i=0;i<b+l+2;i++)                        // for each line
      o+=(i?                                    // add to output

        // Leg lines
        i>b?
          x[r](s/2-w/2+1)                       // spaces before wheels
          +(
            i>b+l?
              "O"[r](w)                         // wheels
            :
              (p=(i<b+l?x:"_")[r](w/2))         // spaces or wheel cover before leg
              +"|"                              // leg
              +p                                // spaces or wheel cover after leg
          )

        // Backrest lines
        :
          "|"                                   // backrest
          +(p=(i-b?x=" ":"_")[r="repeat"](s/2)) // spaces or seat before armrest
          +(i>b-a?"|":i<b-a?x:"-")              // armrest
          +p                                    // spaces or seat after armrest

      // Headrest line
      :"O")
      +\`\n\`
  )

Prueba

usuario81655
fuente
3

Python 2, 157 bytes

b,s,a,l,w=input()
y,z,n,A='|_\n '
s/=2;W=w/2;x=A*s;X=n+A*(s-W+1);Y=n+y
print'O'+Y*(b-a-1)+Y+x+z+(Y+x+y)*(a-1)+n+(y+z*s)*2+(n+A+x+y)*(l-1)+X+z*W+y+z*W+X+'O'*w

Ejemplo:

3,7,1,2,5

O
|
|   _
|___|___
    |
  __|__
  OOOOO
TFeld
fuente
3

JavaScript (ES6), 182

Una función anónima. Usando cadenas de plantilla, hay 3 nuevas líneas que son significativas e incluidas en el recuento de bytes.

(b,s,a,l,w,R=(x=s/2,c=' ')=>c.repeat(x),f=`
`+R(s/2+1-w/2),h=R(s/2,'_'),g=R(w/2,'_'),v='|')=>'O'+R(b+~a,u=`
`+v)+u+R()+'_'+R(a-1,u+R()+v)+u+h+v+h+R(l-1,`
 `+R()+v)+f+g+v+g+f+R(w,'O')

Sin bucles, usando repetir para el mismo propósito.

Menos golf

(b, s, a, l, w, // parameters
 // local variables as parameters with default values
 R = (x=s/2,c=' ')=>c.repeat(x), // shortcut for repeat 
 f = `\n`+R(s/2+1-w/2), // filler before the wheels (used twice)
 h = R(s/2,'_'), // half seat (used twice)
 g = R(w/2,'_'), // last wheel support (used twice)
 v = '|', // vertical bar (used many times)
 u = `\n`+v // newline + bar (define below in the golfed version)
)=>
  'O'+R(b+~a, u)+  // backrest 
  u+R()+'_'+       // backrest + armrest top
  R(a-1, u+R()+v)+ // backrest + armrest
  u+h+v+h+         // seat
  R(l-1, `\n`+R()+v)+ // leg
  f+g+v+g+         // wheels support
  f+R(w, 'O')      // wheels

Fragmento de prueba

f=(b,s,a,l,w,R=(x=s/2,c=' ')=>c.repeat(x),f=`
`+R(s/2+1-w/2),h=R(s/2,'_'),g=R(w/2,'_'),v='|')=>'O'+R(b+~a,u=`
`+v)+u+R()+'_'+R(a-1,u+R()+v)+u+h+v+h+R(l-1,`
 `+R()+v)+f+g+v+g+f+R(w,'O')
  
console.log=x=>O.innerHTML=x+'\n'

function test()
{
  p=I.value.match(/\d+/g).map(x=>+x)
  console.log(p+'\n'+f(...p)+'\n')
}
Input <input type="text" id="I" value="5,5,3,2,3" />
<button onclick="test()">Go</button>
<pre id="O"></pre>

edc65
fuente
1
+1 para que más bytes estén en los parámetros de la función que el cuerpo de la función
user81655
1

SpecBAS - 185 168 bytes

1 INPUT b's'a'l'w: sx=(s/2)+1,wx=sx-(w/2)
2  ?"o"'("|"#13)*b
3  ?AT b,1;"_"*s;AT b+l,wx;"_"*w;AT b-a,sx;"-"
4 FOR i=b+1-a TO b+l: ?AT i,sx;"|": NEXT i
5  ?AT b+l+1,wx;"0"*w

Ahora que SpecBAS permite ?ser utilizado en lugar de PRINTy no necesita LETantes de la asignación de variables, comienza a ser un poco mejor en el golf.

También ayuda a que pueda especificar las posiciones de impresión y, x para evitar tener que trabajar mucho espacio. Esto imprime el respaldo, el asiento, los brazos y las piernas, luego las ruedas.

EDITAR:

para imprimir la parte posterior, reemplace un FOR...NEXTbucle con tubería + retorno multiplicado por la altura ( ("|"#13)*b)

ingrese la descripción de la imagen aquí

Brian
fuente
1

Perl, 181 bytes

incluye +1 para -n. Poner en un archivo yecho 5,3,2,2,1 | perl -n file.pl

($b,$s,$a,$l,$w)=/\d+/g;$,=$/;print'O',('|')x($b-$a-1),($D='|'.$"x($s/=2)).'_',("$D|")x--$a,($q='|'.'_'x$s).$q,($"x$s.' |')x--$l,($x=$"x(1+$s-($W=$w/2))).'_'x$W.'|'.'_'x$W,$x.O x$w

Con comentarios:

#!/usr/bin/perl -n              # -n: iterate stdin, put in $_

($b,$s,$a,$l,$w)=/\d+/g;        # get the parameters

$,=$/;                          # set $OUTPUT_FIELD_SEPARATOR to \n;
                                # this is printed between each of print's args

print                           # shorter than `-p` and @_=(...); $"=$/; $_="@_";
    'O',                        # the headrest

    ('|')x($b-$a-1),            # space between headrest and armrest.
                                # (...) x $n: produces $n lists.

    ($D='|' . $"x($s/=2))       # backrest and padding ($"=' ') up to armrest
    . '_',                      # armrest.

    ("$D|")x--$a,               # backrest, padding, armrest

    ($q='|' . '_'x$s) . $q,     # backrest bottom and 1/2 seat, armrest bottom and 1/2 seat

    ($" x $s . ' |' ) x --$l,   # padding before leg and leg, repeated leg-1 times

    ( $x =                     
      $" x (1+$s - ($W=$w/2) )  # padding before wheel top
    )
    . '_'x$W . '|'              # left side of wheel top, wheel top,
    . '_'x$W,                   # right side of wheel top

    $x . O x$w                  # padding before wheels, wheels
Kenney
fuente