Налаштуйте свій стілець


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, щоб більше ваших байтів було в параметрах функції, ніж тіло функції.
користувач81655

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.