Чи відкриті електричні двері гаража?


24

Моя електрична гаражна дверцята працює так:

  • Існує лише одна кнопка для управління дверима
  • Якщо двері повністю закриті, і я натискаю кнопку, двері починають відкриватися. Повністю відкрити потрібно 10 секунд
  • Якщо двері повністю відчинені, і я натисну кнопку, двері починають закриватися. Для повного закриття потрібно 10 секунд
  • Якщо дверцята проходить через відкриття чи закривання, і я натискаю кнопку, то двері зупиняються і залишаються частково відкритими.
  • Щоразу, коли двері перестають рухатися, або від автоматичного завершення відкритої чи закритої дії, або від ручного переривання натисканням кнопки наскрізь через дію, механізм повернеться назад і запам’ятає його напрямок для наступної дії.
  • Якщо кнопку натиснути, коли дверцята зупинена, але частково відчинена, то кількість часу, щоб вона завершила свою дію, буде часткою 10 секунд пропорційно кількості, яку потрібно рухати для завершення дії.

Припустимо, що двері повністю закриті на початку.

Буде подано список введення цілих чисел. Ці цілі числа - це кількість секунд, які я чекаю між послідовними натисканнями кнопки управління.

Виведіть дві речі:

  • відсоток, що вказує на стан дверей, коли всі натискання кнопок завершено і двері досягли стабільного стану. Виведення %символу необов’язково.
  • однозначна вказівка ​​в якому напрямку буде рухатися двері при наступному натисканні кнопки. Це може бути up/ down, U/ D, +/ -, 1/ 0або що завгодно.

Ви можете припустити, що двері потрібно тривати нескінченно менше 10 секунд, щоб виконати відкриту або закриту дію.

Приклади входів:

<empty list>  # button was pushed just once
20            # button was pushed twice with 20 seconds between
10
5
20 20
10 10
5 5
1 2 3
8 9 10 11
11 10 9 8 7

Очікувані виходи, що відповідають вищевказаним входам

100% D
0% U
0% U
50% D
100% D
100% D
0% U
100% D
0% U
20% U

Працював приклад останнього тесту

  • Двері починаються закритими. Кнопка натиснута
  • Зачекайте 11 секунд. Двері закінчуються повністю відкритими. Кнопка натиснута.
  • Зачекайте 10 секунд. Двері закінчуються повністю закритими. Кнопка натиснута.
  • Зачекайте 9 секунд. Кнопка натиснута. Двері зупиняються на 90% відкритих.
  • Зачекайте 8 секунд. Кнопка натиснута. Двері починають закриватися.
  • Зачекайте 7 секунд. Кнопка натиснута. Двері зупиняються на 20% відкритих. Наступний напрямок буде вгору.

У вас двері гаража зупиняються на напіввідчиненому, якщо ви натискаєте кнопку, закриваючи? Шахта ні, тільки для відкриття.
Балінт

@ Bálint в обох випадках для моєї.
Цифрова травма

@Maltysen дозволяє дотримуватися відсотків зараз.
Цифрова травма

Чи добре, якщо виводиться число з плаваючою комою, якщо вхід також складається з номерів (ив) з плаваючою точкою?
Р. Кап

@ R.Kap так, це добре.
Цифрова травма

Відповіді:


6

Луа, 258 248 242 байт

u,s,p=1>0,0>1,0;io.read():gsub("%d+",function(a)if(not s)then p=u and p+a or p-a;if(p>=10 or p<=0)then s,p=1>0,p>0 and 10 or 0;end;u,s=not u,not s else s=0>1;end end)if(not s)then p=u and 10 or 0;u=not u;end;print(10*p.."% "..(u and"U"or"D"))

Безумовно

u,s,p=true,false,0;                          -- Up direction, Stopped, Position
io.read():gsub("%d+",function(t)             -- For each number in input
    if(not s)then                            -- If door wasn't stopped
        p=u and p+t or p-t;                  -- Position = Moving up ? +t : -t
        if(p>=10 or p<=0)then                -- If door fully opened or closed
            s,p=true,p>0 and 10 or 0;        -- Then door stopped at 0 or 10
        end 
        u,s=not u,not s;                     -- Toggle direction and toggle stopped
    else 
        s=false;                             -- If stopped, nothing happened, un-stop.
    end 
end)
-------------------- Done pressing the button --------------------
if(not s)then                                -- If left off moving
    p=u and 10 or 0;                         -- Finish movement
    u=not u;                                 -- Toggle direction
end 
print(10*p.."% "..(u and"U"or"D"))           -- Output answer

Я не бачу, як ваші тестові справи можуть бути правильними ...

20 20 -- Initial push, after 20, garage is at 100, push to start it down, after 20, garage is at 0, push to start it up, garage finishes up.
10 10 -- Same as above
1 2 3 -- 0 U Moving, wait 1, 1 D Stopped, wait 2, 0 U stopped, wait 3, 100 D stopped

OP Виправлено


Я щойно закінчив свій запис, і я згоден з вашими результатами.
Ніл


3

JavaScript (ES6), 109 106 байт

a=>a.map(e=>(s^=1)?(r-=e*(d=-d))>9?(s=0,r=10):r<1?(r=s=0):r:r,r=s=0,d=1)&&(s?r:5*++d)*10+(d-s?"% D":"% U")

@DigitalTrauma Повинно була помилка оптимізації. Я повторно це зрозумів і мені якось вдалося зберегти ще 3 байти цього разу!
Ніл

3

Рубін, 152 байти

->v{u,s,a=!!1,!0,0;v.map{|w|!s ?(a=u ? a+w : a-w;a>=10 ?(s,a=!!1,10):a<=0 ?(s,a=!!1,0):0;u,s=!u,!s):s=!0};!s ?(a=(u=!u)?0:10):0;p"#{10*a}% #{u ??U:?D}"}

Тестові приклади:

f=->v{u,s,a=!!1,!0,0;v.map{|w|!s ?(a=u ? a+w : a-w;a>=10 ?(s,a=!!1,10):a<=0 ?(s,a=!!1,0):0;u,s=!u,!s):s=!0};!s ?(a=(u=!u)?0:10):0;p"#{10*a}% #{u ??U:?D}"}

f[[]]            # => "100% D"
f[[20]]          # => "0% U"
f[[10]]          # => "0% U"
f[[5]]           # => "50% D"
f[[20,20]]       # => "100% D"
f[[10,10]]       # => "100% D"
f[[5,5]]         # => "0% U"
f[[1,2,3]]       # => "100% D"
f[[8,9,10,11]]   # => "0% U"
f[[11,10,9,8,7]] # => "20% U"

Як прикольна сторона, ви можете зняти вимогу щодо додаткових дужок ціною одного байта, змінивши ->v{на ->*v{(я думаю). Крім того, чи потрібні вам пробіли до того, :як і після? А ви впевнені, що :a<=0не розбираєтесь (:a) <= 0?
Фонд позову Моніки

Гарна порада! Було б потрібно зважити з доступом до вару. Що стосується :a<=0, я отримав би, ArgumentError: comparison of Symbol with 0 failedякщо це не спрацювало. Я думаю, оскільки він проаналізував ?і знає, що він є у потрійному операторі, він просто працює. Правила справді дивні. Я розмістив пробіли чи дужки в місцях, необхідних для уникнення помилок синтаксису, таких як SyntaxError: unexpected tLABELі NoMethodError: undefined method u? ''.
br3nt

Не соромтесь редагувати, якщо ви бачите якісь поліпшення. Я сподівався, що мені вдасться позбутися a=u ? a+w : a-wі змінити його a=a+w*dтам, де dє 1або -1залежно від напрямку, але я цього ще не розробив.
br3nt

Як я розумію, редагування, щоб покращити код, як правило, не рекомендується; натомість слід коментувати. Щодо вашої ідеї щодо вдосконалення, я не знаю; здається, це могло б спрацювати, але я не знаю точно.
Фонд позову Моніки

2

Python 3.5, 193 187 185 181 175 173 172 байт:

def G(*p):
 O=100;y=0;l=10;z,v='UG'
 for g in[*p,O]:
  if v=='G':Q=O*g//10;y=min(max(0,[Q,y-Q][z=='D']),O);l=min(10,g);z='UD'[z=='U']
  v='GS'[(O>y>0)*(v!='S')]
 print(y,z)

Візьме введення у вигляді цифр, розділених комами, наприклад, 1,2,3,4,5або парних 1.2,3.4,7.8,9.2. Виводить, чи йде двері на наступному кроці вгору або вниз відповідно, Uабо Dвідповідно. Чи буде гольф більше з часом.

Спробуйте в Інтернеті! (Ideone) (Тут вхід приймається у вигляді списку, що складається з цифр, розділених комами, наприклад [1,2,3,4,5].)


1

PHP, 128 120 байт

$d=$argv[]=10;
foreach($argv as$a)
  if($r){$p=min(max($p+$a*$d,0),100);$r=$p<1||99<$p;$d=-$d;}else$r=1;
echo"$p% ".DU[$d>0];

Код тут загорнуто, щоб він вмістився у кодовому полі. Покладіть все в один рядок, поставте PHP відкритим маркером перед ним і збережіть у файл. Або запустити його з командного рядка, використовуючи php -d error_reporting=0 -r '...the code...' [arguments].

Невикористаний вихідний код, тестовий набір та приклади використання можна знайти на github .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.