Настройте свой стул


18

Вызов

Вы только что купили новый стул! Проблема в том, что вы не знаете, как им управлять, поэтому вам нужно написать программу, которая сделает это за вас.

Пример регулируемого кресла

Вы можете только так долго сидеть в неотрегулированном кресле. Поэтому ваш код должен быть максимально коротким.

Примеры

5,3,2,2,1

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

3,5,2,3,5

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

2,13,1,1,13

O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO

Я единственный, кто считает, что это похоже на самолет?

Части стула

Стул имеет различные компоненты:

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

вход

Вы будете выводить стул с учетом различных переменных.

Входные данные будут в следующем порядке, все входные данные будут положительными целыми числами (всегда больше 0) и всегда будут предоставлены.

  1. Высота спинки
  2. Ширина сиденья всегда нечетная
  3. Высота подлокотника Всегда меньше высоты спинки
  4. Высота ног
  5. Количество колес Всегда меньше или равно ширине сиденья и Всегда нечетно

Подробные описания частей

Части стула являются:


Спинка: Это количество |является Спинка Высота

O
|
|

Сиденье: Сумма _является Ширина сиденья , вставьте |в середине для подлокотника.

__|__

Подлокотник: Сумма в |этом подлокотнике высота . Это должно быть вставлено в середину сиденья.

_
|
|

Нога: количество |определяется ростом ноги

|
|

Колеса: колеса центрированы ниже ног. Если их больше одного, все, кроме центрального колеса, должны иметь _линию над ними.

_ _
OOO

Выход

Вывод может иметь завершающий перевод строки. В каждой строке могут быть пробелы. Лидирующие пробелы не допускаются


Третий тестовый пример, похоже, не так. Ширина сиденья намного больше, чем 2.
Дверная ручка

@ Doorknob 冰 ой, это была проблема с порядком ввода, я исправил это.
Даунгоут

«Самолет» напоминает мне много таких танков от Super Mario Bros 3 .
El'endia Starman

Ответы:


2

LabVIEW, 146 примитивов LabVIEW

Это стало намного больше, чем я себе представлял ...

На этот раз GIF не будет, с одной стороны, из-за размера, с другой стороны, потому что никто не сможет проследить за всем потоком данных.

Это работает, если только вы не получите LabVIEW и не предложите хостера файлов, хотя проверить не удастся.


9

JavaScript (ES6), 197 байт

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

объяснение

Ну, это стало довольно запутанным довольно быстро. Я просто прокомментирую, что делает каждая строка на высоком уровне. Надеемся, что с таким форматированием не так уж сложно следовать всем троичным операторам.

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

Тестовое задание


3

Python 2, 157 байт

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

Пример:

3,7,1,2,5

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

3

JavaScript (ES6), 182

Анонимная функция. Используя строки шаблона, есть 3 новых строки, которые являются значимыми и включены в число байтов.

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

Нет петель, используя повтор для той же цели.

Меньше гольфа

(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

Тестовый фрагмент

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>


1
+1 для большего количества ваших байтов, находящихся в параметрах функции, чем тело функции.
user81655 18.12.15

1

SpecBAS - 185 168 байт

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

Теперь, когда SpecBAS ?можно использовать вместо PRINTи не нужно LETперед назначением переменной, он начинает немного лучше играть в гольф.

Также помогает то, что вы можете указывать y, x положения печати, чтобы избежать необходимости большого промежутка. Это печатает назад, место, руки и ноги тогда колеса.

РЕДАКТИРОВАТЬ:

чтобы напечатать заднюю часть, замените FOR...NEXTцикл на трубу + возврат, умноженный на высоту ( ("|"#13)*b)

введите описание изображения здесь


1

Perl, 181 байт

включает +1 за -n. Положить в файл иecho 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

С комментариями:

#!/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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.