Dostosuj swoje krzesło

18

Wyzwanie

Właśnie kupiłeś zupełnie nowe krzesło! Problem w tym, że nie masz pojęcia, jak to kontrolować, więc musisz napisać program, który zrobi to za Ciebie.

Przykład regulowanego krzesła

Tak długo możesz siedzieć tylko w niedostosowanym krześle. Twój kod musi więc być jak najkrótszy.

Przykłady

5,3,2,2,1

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

3,5,2,3,5

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

2,13,1,1,13

O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO

Czy jestem jedynym, który myśli, że to wygląda jak samolot?

Części do krzeseł

Krzesło ma różne elementy:

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

Wejście

Będziesz wydawał krzesło o różnych zmiennych.

Dane wejściowe będą w następującej kolejności, wszystkie dane wejściowe będą dodatnimi liczbami całkowitymi (zawsze większymi niż 0) i zawsze zostaną podane.

  1. Wysokość oparcia
  2. Szerokość siedziska zawsze nieparzysta
  3. Wysokość podłokietnika Zawsze mniejsza niż wysokość oparcia
  4. Wysokość nóg
  5. Liczba kół Zawsze mniejsza lub równa szerokości siedziska i Zawsze nieparzysta

Szczegółowe opisy części

Częściami krzesła są:


Oparcie: ta wysokość |to wysokość oparcia

O
|
|

Siedzisko: jego wysokość _to szerokość siedziska , wstaw |środkową część podłokietnika.

__|__

Podłokietnik: jego wysokość |to Wysokość Podłokietnika . Należy to wstawić na środku siedzenia.

_
|
|

Noga: wysokość |zależy od wysokości nogi

|
|

Koła: koła są wyśrodkowane poniżej nóg. Jeśli jest ich więcej niż jeden, wszystkie koła oprócz środkowego powinny znajdować się _w linii nad nimi.

_ _
OOO

Wynik

Wynik może mieć końcowy znak nowej linii. Każda linia może mieć końcowe spacje. Wiodące białe znaki nie są dozwolone

Downgoat
źródło
Trzeci przypadek testowy wydaje się nieprawidłowy. Szerokość siedziska jest znacznie większa niż 2.
Klamka
@Doorknob 冰 ups, to był problem z kolejnością wprowadzania, naprawiłem to.
Downgoat
„Samolot” przypomina mi wiele tych czołgów z Super Mario Bros 3 .
El'endia Starman,

Odpowiedzi:

2

LabVIEW, 146 LabVIEW Prymitywy

To stało się o wiele większe niż sobie wyobrażałem ...

Tym razem nie będzie GIF-a, z jednej strony ze względu na rozmiar, z drugiej strony, ponieważ nikt nie może śledzić przepływu wszystkich danych.

Działa, chyba że otrzymasz LabVIEW i zasugerujesz serwer plików, ale nie będzie sposobu, aby to sprawdzić.

Eumel
źródło
9

JavaScript (ES6), 197 bajtów

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

Wyjaśnienie

Cóż, dość szybko się to skomplikowało. Po prostu skomentuję to, co robi każda linia na wysokim poziomie. Mam nadzieję, że dzięki temu formatowaniu nie będzie zbyt trudno śledzić wszystkich operatorów trójskładnikowych.

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

Test

użytkownik 81655
źródło
3

Python 2, 157 bajtów

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

Przykład:

3,7,1,2,5

O
|
|   _
|___|___
    |
  __|__
  OOOOO
TFeld
źródło
3

JavaScript (ES6), 182

Anonimowa funkcja. Używając ciągów szablonów, istnieją 3 nowe wiersze, które są znaczące i uwzględniane w liczbie bajtów.

(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')

Bez pętli, używając powtórzenia w tym samym celu.

Mniej golfa

(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

Test Snippet

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
źródło
1
+1 za więcej bajtów w parametrach funkcji niż w treści funkcji.
user81655,
1

SpecBAS - 185 168 bajtów

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

Teraz, gdy SpecBAS pozwala ?na używanie zamiast PRINTi nie potrzebuje LETprzed zmiennym przypisaniem, zaczyna być nieco lepszy w golfie.

Pomaga także w określeniu pozycji drukowania y, x, aby uniknąć konieczności wykonywania dużych odstępów. To drukuje oparcie, siedzenie, ręce i nogi, a następnie koła.

EDYTOWAĆ:

aby wydrukować tył, zamień FOR...NEXTpętlę na potok + powrót pomnożony przez wysokość ( ("|"#13)*b)

wprowadź opis zdjęcia tutaj

Brian
źródło
1

Perl, 181 bajtów

zawiera +1 dla -n. Umieść plik iecho 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

Z komentarzami:

#!/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
źródło