Ajuste sua cadeira

18

Desafio

Você acabou de comprar uma cadeira nova! O problema é que você não tem idéia de como controlá-lo, portanto precisará escrever um programa para fazer isso por você.

Exemplo de uma cadeira ajustável

Você só pode sentar na cadeira não ajustada por tanto tempo. Portanto, seu código precisará ser o mais curto possível.

Exemplos

5,3,2,2,1

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

3,5,2,3,5

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

2,13,1,1,13

O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO

Eu sou o único que pensa que isso parece um avião?

Peças de cadeira

A cadeira possui vários componentes:

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

Entrada

Você produzirá uma cadeira com várias variáveis.

A entrada será na seguinte ordem, todas as entradas serão números inteiros positivos (sempre maiores que 0) e sempre serão fornecidas.

  1. Altura do encosto
  2. Largura do assento sempre ímpar
  3. Altura do apoio de braço Sempre menor que a altura do encosto
  4. Altura da perna
  5. Contagem de rodas Sempre menor ou igual à largura do assento e Sempre ímpar

Descrições detalhadas das peças

As partes da cadeira são:


Encosto: Esta quantidade |é a altura do encosto

O
|
|

Assento: A quantidade de _é a largura do assento , insira um |no meio para o apoio de braço.

__|__

Apoio de braço: A quantidade de |é a altura do apoio de braço . Isso deve ser inserido no meio do assento.

_
|
|

Perna: A quantidade de |é determinada pela altura da perna

|
|

Rodas: as rodas estão centralizadas abaixo das pernas. Se eles são mais de um, todos, exceto a roda central, devem ter _a linha acima deles.

_ _
OOO

Resultado

A saída pode ter uma nova linha à direita. Cada linha pode ter espaços à direita. Espaço em branco à esquerda não é permitido

Downgoat
fonte
O terceiro caso de teste parece estar errado. A largura do assento é muito maior que 2.
Maçaneta da porta
@ Doorknob 冰 opa, isso foi um problema com a ordem de entrada, eu a corrigi.
Downgoat
O "avião" me lembra muitos desses tanques de Super Mario Bros 3 .
El'endia Starman

Respostas:

2

LabVIEW, 146 Primitivas do LabVIEW

Isso ficou muito maior do que eu imaginava ...

Desta vez, não haverá um GIF, por um lado, por causa do tamanho, por outro, porque não há como alguém acompanhar todos os dados que fluem.

Funciona, a menos que você obtenha o LabVIEW e sugira um host de arquivos, não haverá como verificar.

Eumel
fonte
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`')

Explicação

Bem, isso ficou bastante complicado rapidamente. Vou apenas comentar o que cada linha faz em um nível alto. Felizmente, com essa formatação, não é muito difícil seguir todos os operadores ternários.

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

Teste

user81655
fonte
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

Exemplo:

3,7,1,2,5

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

JavaScript (ES6), 182

Uma função anônima. Usando seqüências de caracteres de modelo, há 3 novas linhas significativas e incluídas na contagem 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')

Sem loops, usando a repetição para o mesmo objetivo.

Menos golfe

(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

Snippet de teste

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
fonte
1
+1 para mais de seus bytes estar nos parâmetros da função do que no corpo da função.
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

Agora que o SpecBAS permite ?ser usado em vez de PRINTe não precisa LETantes da atribuição de variáveis, ele começa a ser um pouco melhor no golfe.

Também ajuda a especificar as posições de impressão y, x para evitar a necessidade de muito espaçamento. Imprime costas, assento, braços e pernas e depois rodas.

EDITAR:

para imprimir o verso, substitua um FOR...NEXTloop por pipe + retorno multiplicado pela altura ( ("|"#13)*b)

insira a descrição da imagem aqui

Brian
fonte
1

Perl, 181 bytes

inclui +1 para -n. Coloque um arquivo eecho 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

Com comentários:

#!/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
fonte