Лукас Vs. Віддалені двері гаража


15

Відмова від відповідальності

Хоча я знаю, що існує цей конкретний пов'язаний питання , моє запитання використовує дві гаражні двері, компонент рандомізації, і я також грунтуюся на цьому на подіях реального життя, бачачи, як мій син випадково опустив одну із зазначених гаражних дверей, поки я виходив із гараж минулого тижня ... Нічого, як удар по голові, щоб творчі соки витікали! ;)

Фон

Лукас (мій 15-місячний син) любить грати з дистанційним гаражем. На цьому пульті є дві кнопки, одна - для лівої гаражної двері та одна - для правої гаражних дверей. Обидві кнопки працюють однаково; натисніть один раз, щоб двері почали відкриватися, знову натисніть, щоб зупинитися, знову натисніть, щоб почати закриватися, натисніть знову, щоб знову зупинитися, і так далі.

Лукас любить цей пульт, він випадково натисне одну з кнопок, або обидві, або взагалі жодну. Якщо обидва натиснуті, сигнал не надсилається, але натискання однієї кнопки передасть сигнал.

Отже, завдання з кодовим гольфом розділено на дві частини:

Частина перша

Створіть рядок довжиною 60 символів, який відображає випадкові натискання кнопки Лукаса протягом хвилини. "Випадковий" в цьому випадку означає "з рівним шансом на кожен вхід при кожному галочку". Символи такі:

  • 0: Лукас або натиснув жодну кнопку, або натиснув обидві кнопки. Так чи інакше, жодного сигналу не надіслано.
  • 1: Лукас натиснув кнопку лівої двері гаража
  • 2: Лукас натиснув кнопку правої двері гаража

Частина друга

Використовуючи рядок, створений у першій частині, моделюйте відкривання та закриття гаража двох автомобілів, використовуючи номери як тригери для відкривання, зупинки та закриття цих дверей.

Мої гаражні двері досить швидкі (див. Відмову вище про те, чому). Після натискання кнопки потрібно повністю відкрити або закрити чотири секунди.

Отже, якщо закрито:

  • 0 сек: 0% відкрито (закрито); при натисканні кнопки двері починають відкриватися
  • 1 сек: 25% відкрито
  • 2 сек: 50% відкрито
  • 3 сек: 75% відкрито
  • 4 сек: 100% відкриті, двері зупиняються

І тому, якщо відкрито:

  • 0 сек: 100% відкрито; при натисканні кнопки двері починають закриватися
  • 1 сек: 75% відкрито
  • 2 сек: 50% відкрито
  • 3 сек: 25% відкрито
  • 4 сек: 0% відкрито (закрито), двері зупиняються

Якщо певна двері перебуває в русі, сигнал до цієї ж двері зупинить її. Наступний сигнал, що надсилається до тієї самої двері після цього, посилатиме її в зворотному напрямку. Якщо двері зупиняються, коли вона була раніше в русі, а тепер повністю відкрита або повністю закрита, коли сигнал "стоп" отриманий, двері реєструються як "зупинені" у повністю відкритому або повністю закритому стані, готові до рухатися в зворотному напрямку, коли він отримує новий сигнал.

За допомогою цього моделювання обидві гаражні двері спочатку будуть у закритому положенні. Отже, давайте подивимось на 10 секундний список команд і подивимося, що станеться, якщо Лукас повинен був виконати їх на пульті:

2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)

Вихідні дані

Перша частина виводу вимагає відображення 60 символьних рядків випадкових символів "0", "1" та "2", згенерованих з першої частини. напр. 212022112021202211202120221120212022112021202211202120221120

Нижче цього рядка відбувається обробка цих "сигналів" згідно з вищезазначеними правилами того, як будуть поводитися гаражні двері з кожним відповідним символом (на секунду за секундою). У результаті ви повинні отримати 60 рядків під початковим рядком відображення.

Кожен з цих оброблених рядків буде у вигляді: N: (L:X% XXXXXXX, R:Y% YYYYYYY)де:

  • N - n-й символ із відповідної випадкової рядки, який буде мати форму 0, 1 або 2.
  • X% - відсоток відкритості лівої двері (немає нульової прокладки)
  • XXXXXXX - стан лівої двері. Якщо двері не перебувають у русі (тобто не відкриваються та не закриваються), стан "зупинено" набуває чинності, тобто вона зупиняється в русі (можливо лише на 25%, 50% або 75%) або зупиняється при повністю відчиненій (100% ) або повністю закритий (0%). Інакше двері будуть або «відчиненими», або «закритими».
  • Y% - відсоток відкритості правої двері (немає нульової прокладки)
  • РРРРРР - статус правильних дверей. Якщо двері не перебувають у русі (тобто не відкриваються та не закриваються), стан "зупинено" набуває чинності, тобто вона зупиняється в русі (можливо лише на 25%, 50% або 75%) або зупиняється при повністю відчиненій (100% ) або повністю закритий (0%). Інакше двері будуть або «відчиненими», або «закритими».

Приклад наведено нижче, використовуючи 10 "сигналів" та 10 оброблених ліній

2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)

Це код-гольф, тому найкоротший код стане явним переможцем. Я зробив це трохи легко, використовуючи фрази на кшталт "відкриття", "зупинка" та "закриття", які є всіма семи літерами ... так що ви можете захотіти, щоб це вписати у вашу стратегію.

Удачі!


Ви повинні визначити чіткіший вихідний формат для
другої

@ LegionMammal978 Що ти думаєш, не вистачає на виході?
WallyWest

1
На даний момент я цього не знаю, але думаю, що це акуратне питання - я можу вирішити це.
DLosc

1
Чому 1у вашому прикладі остання команда не зупиняє ліву двері на 75%?
Арнольд

1
Чи повинні всі 0,1 і 2 з’являтися однаково в першій частині, чи не повинні однаково натискати, двічі натискати, натискати ліворуч та праворуч? (мається на увазі, 0 скоріше, тому що це два сценарії, які викликають те саме і результат ...)
Сократський Фенікс

Відповіді:


2

Pyth, 156 149 145 байт

jkJmO3U60K=G*]Z3=b*3]_1VJFHS2I&=T@KHq*2hT@XHGTH XbHT XKH0)) XKN*_@XbN|@KN@bNN!@KN%+N": (L:%s, R:%s)"m++*@Gd25"% "%3>"csoltpooespnipinengdg"h@KdS2

Прямий переклад моєї відповіді Python .

Спробуйте в Інтернеті!

Пояснення:

jk                              " print ''.join(map(str,                   "
JmO3U60                         "  J = [randint(0,2) for _ in range(60)])) "
K=G*]Z3                         " K = copy(G = [0] * 3)                    "
=b*3]_1                         " b = [-1] * 3                             "
VJ                              " for N in J:                              "
FHS2                            "  for H in range(1, 3):                   "
I&=T@KH                         "   if ((T = K[H]) and                     "
q*2hT@XHGTH                     "       (2 * (T + 1) == (G[H] += T)[H]):   "
 XbHT                           "    b[H] = T                              "
 XKH0))                         "    K[H] = 0                              "
 XKN*_@XbN|@KN@bNN              "  K[N] = (-(b[N] = K[N] or B[N])[N] *     "
!@KN                            "   (not K[N]))                            "
%+N": (L:%s, R:%s)"             "  print(str(N) + ': (L:%s, R:%s)' %       "
m++                             "   map(lambda d:                          "
*@Gd25                          "    G[d] * 25 +                           "
"% "                            "    '% ' +                                "
%3>"csoltpooespnipinengdg"h@Kd  "    'csoltpooespnipinengdg'[K[d]+1::3]]   "
S2                              "   ), range(1, 3))                        "

Оце Так! Дякую за цю відповідь, а також за пояснення коду ... Я насправді мав сенс до того часу, коли я досяг її кінця ...
WallyWest,

5

Javascript (ES6), 277 275 263 253 250 247 234 байт

_=>(d=[0,0],l=s='',[...Array(60)].map(_=>(s+=`
${c=Math.random()*3|0}:(`,l+=c,d=d.map((v,i)=>(v=v&8?v&16?v-27?v+1:20:v-9?v-1:0:v,v^=c+~i?0:v&8||24,s+='LR'[i]+`:${(v&7)*25}% `+(v&8?v&16?'opening':'closing':'stopped')+',)'[i],v)))),l+s)

Негольфірованний і коментує

_ => (
  // Initialize array:
  //   - d = door states as integers
  //     - bits 0 to 2: door opening state (from 0b000 = 0% to 0b100 = 100%)
  //     - bit #3: door in motion (0: no, 1: yes)
  //     - bit #4: door direction (0: closing, 1: opening)
  d = [0, 0],

  // Initialize strings:
  //   - l = list of commands
  //   - s = door states in plain text
  l = s = '',

  // Iterate on an array of 60 entries.
  [...Array(60)].map(_ => (
    // c = new random command (0, 1 or 2)
    // Append new line and new command to s.
    s += `\n${c = Math.random() * 3 | 0}:(`,

    // Append new command to l.
    l += c,

    // For each door ...
    d = d.map((v, i) => (
      // If the door is in motion, update its opening state.
      // Clear the 'in motion' bit if a bound is reached (either closed or fully open).
      v = v & 8 ? v & 16 ? v - 27 ? v + 1 : 20 : v - 9 ? v - 1 : 0 : v,

      // If the current command is intended for this door, update its direction and
      // 'in motion' bit. Direction is changed on the 'stopped => moving' transition.
      v ^= c + ~i ? 0 : v & 8 || 24,

      // Translate the door state in plain text and append it to s
      s +=
        'LR'[i] +
        `:${(v & 7) * 25}% ` +
        (v & 8 ? v & 16 ? 'opening' : 'closing' : 'stopped') +
        ',)'[i],

      // Value to be taken into account by map()
      v
    ))
  )),

  // Final result to be returned
  l + s
)

Демо

let f = 
_=>(d=[0,0],l=s='',[...Array(60)].map(_=>(s+=`
${c=Math.random()*3|0}:(`,l+=c,d=d.map((v,i)=>(v=v&8?v&16?v-27?v+1:20:v-9?v-1:0:v,v^=c+~i?0:v&8||24,s+='LR'[i]+`:${(v&7)*25}% `+(v&8?v&16?'opening':'closing':'stopped')+',)'[i],v)))),l+s)

console.log(f())


Нічого собі, я вражений одним лайнером і кидаю його в console.log при цьому! Молодці!
WallyWest

1
Цікаво, що не працює у Firefox, лише 4 рядки у виході, як це 112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ](нові рядки після коми та дужок)
edc65

@ edc65 - Насправді мій поганий. Я неправильно прочитав інструкції про вихідний формат. Це виправлено.
Арнольд

@Arnauld Ви також можете видалити дужки, v^=(c-i-1?0:v&8||24)щоб зберегти два байти.
WallyWest

PS @Arnauld, дякую за участь!
WallyWest

4

Пітон 2, 377 370 361 357 345 335 326 316 312 306 304 байт

Другий рівень відступу - це необроблена вкладка ( \t), яка дуже погано грає з Markdown, тому її замінили два пробіли.

from random import*
p=[randint(0,2)for d in[[0]*3]*60]
print`p`[1::3]
v=[-1]*3
c=[0]*3
f=lambda y:str(c[y]*25)+'% '+'csoltpooespnipinengdg'[d[y]+1::3]
for x in p:
 for i in 1,2:
  q=d[i];c[i]+=q
  if(2*-~q==c[i])*q:v[i]=q;d[i]=0
 z=d[x]
 if z:v[x]=z
 d[x]=-v[x]*(z==0);print'%d: (L:%s, R:%s)'%(x,f(1),f(2))

Я майже впевнений, що це можна пограти в гольф далі.

Безголовка, з коментарями:

import random

# Generate the random string - represented as a list of ints
presses = [random.randint(0, 2) for _ in range(60)]
print ''.join(map(str, presses))

# Constants for door states used for easier reading
CLOSING = -1
STOPPED = 0
OPENING = 1

# Variables representing the state of the garage doors
# There's a third element in these so that x[0] resolves to a dummy slot
# (this way, we can avoid a conditional down the road)
prev_states = [CLOSING, CLOSING, 0]
door_states = [STOPPED, STOPPED, 0]
door_pcts = [0, 0, 0]  # delta 1 = 25%

for press in presses:
  # Close/open the door 1 more
  for i in 1, 2:
    if door_states[i] != STOPPED:
      delta_pct, stop_pct = (-1, 0) if door_states[i] == CLOSING else (1, 4)
      door_pcts[i] += delta_pct
      if door_pcts[i] == stop_pct:
        prev_states[i] = door_states[i]
        door_states[i] = STOPPED

  # Handle pressing a button
  # If the press is 0 (no press), the 0th element resolves to a dummy
  # door, thus saving us an expensive conditional

  if door_states[press] == STOPPED:
    door_states[press] = -prev_states[press]
  else:
    prev_states[press] = door_states[press]
    door_states[press] = STOPPED

  # Print the status update
  print '%d: (L:%d%% %s, R:%d%% %s)' % (
    press,
    door_pcts[0]*25,
    ['closing', 'stopped', 'opening'][door_states[0]+1],
    door_pcts[1]*25,
    ['closing', 'stopped', 'opening'][door_states[1]+1],
  )

Збережено 4 14 15 байт завдяки @TheBikingViking!

Збережено 6 байт завдяки @ValueInk!


1
Ви можете змінити range(60)на [0]*60.
TheBikingViking

1
@TheBikingViking Дякую! Я зараз це редагую.
Мідь

2
Можна 'p'[1::3]замість апострофа робити заміни ''.join(map(str,p)).
TheBikingViking

2
(4,0)[q<0]==c[i]and q->((4,0)[q<0]==c[i])*q
TheBikingViking

2
@ValueInk Цей рядок зловживає помилкою в розумінні списку Python 2, щоб встановити nцей рядок. nвикористовується в останньому рядку , щоб витягти closing, stopped, openingз цього рядка.
Мідь

2

Рубі, 263 261 260 254 байт

Як відповідь JavaScript стала такою короткою ??? Це обігнало мою, поки я не був, і все ще перемагає в даний час ...

s=(1..60).map{rand 3}
puts s*''
D=1,2
d=[25]*3;a=[0]*3;m=[p]*3
s.map{|i|D.map{|j|m[j]&&a[j]+=d[j];(0..100)===a[j]+d[j]||i!=j&&(d[j]*=-1;m[j]=p)}
(m[i]^=1)||d[i]*=-1
puts"#{i}: (L%s, R%s)"%D.map{|j|":#{a[j]}% #{%w"stopped opening closing"[m[j]?d[j]:0]}"}}

2

C, 420 433 424 374 байт

#define F(X,x) X=x==1?X+1:x==2?X-1:X;X=X<0?0:X>4?4:X;x=X==0?0:X==4?3:x
#define G(x) x=x==1?3:x==2?0:x==3?2:x+1
#define H(X,x) X*25,x==0||x==3?"stopped":x==1?"opening":"closing"
c,i,l,r,L,R,x[60];main(){while(i<60)printf("%d",x[i++]=random()%3);while(c<60){if(x[c]==1)G(l);else if(x[c]==2)G(r);printf("\n%d: (L:%d%% %s, R:%d%% %s)",x[c++],H(L,l),H(R,r));F(L,l);F(R,r);}}

Не засіває випадковий генератор, але використовує випадковий для кращого розподілу. Має бути кращий спосіб пограти в цю логіку, хоча ...

110121100121212100112200222111200020111100022122202112202211002
1: (L:0% opening, R:0% stopped)
1: (L:25% stopped, R:0% stopped)
0: (L:25% stopped, R:0% stopped)
1: (L:25% closing, R:0% stopped)
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
1: (L:25% stopped, R:50% opening)
0: (L:25% stopped, R:75% opening)
0: (L:25% stopped, R:100% stopped)
1: (L:25% closing, R:100% stopped)
2: (L:0% stopped, R:100% closing)
1: (L:0% opening, R:75% closing)
2: (L:25% opening, R:50% stopped)
1: (L:50% stopped, R:50% stopped)
2: (L:50% stopped, R:50% opening)
1: (L:50% closing, R:75% opening)
0: (L:25% closing, R:100% stopped)
0: (L:0% stopped, R:100% stopped)
1: (L:0% opening, R:100% stopped)
1: (L:25% stopped, R:100% stopped)
2: (L:25% stopped, R:100% closing)
2: (L:25% stopped, R:75% stopped)
0: (L:25% stopped, R:75% stopped)
0: (L:25% stopped, R:75% stopped)
2: (L:25% stopped, R:75% opening)
2: (L:25% stopped, R:100% closing)
2: (L:25% stopped, R:75% stopped)
1: (L:25% closing, R:75% stopped)
1: (L:0% opening, R:75% stopped)
1: (L:25% stopped, R:75% stopped)
2: (L:25% stopped, R:75% opening)
0: (L:25% stopped, R:100% stopped)
0: (L:25% stopped, R:100% stopped)
0: (L:25% stopped, R:100% stopped)
2: (L:25% stopped, R:100% closing)
0: (L:25% stopped, R:75% closing)
1: (L:25% closing, R:50% closing)
1: (L:0% opening, R:25% closing)
1: (L:25% stopped, R:0% stopped)
1: (L:25% closing, R:0% stopped)
0: (L:0% stopped, R:0% stopped)
0: (L:0% stopped, R:0% stopped)
0: (L:0% stopped, R:0% stopped)
2: (L:0% stopped, R:0% opening)
2: (L:0% stopped, R:25% stopped)
1: (L:0% opening, R:25% stopped)
2: (L:25% opening, R:25% closing)
2: (L:50% opening, R:0% opening)
2: (L:75% opening, R:25% stopped)
0: (L:100% stopped, R:25% stopped)
2: (L:100% stopped, R:25% closing)
1: (L:100% closing, R:0% stopped)
1: (L:75% stopped, R:0% stopped)
2: (L:75% stopped, R:0% opening)
2: (L:75% stopped, R:25% stopped)
0: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% closing)
2: (L:75% stopped, R:0% opening)
1: (L:75% opening, R:25% opening)
1: (L:100% closing, R:50% opening)

Старіша версія 1:

c,i,l,r,L,R,x[60];main(){while(i<60)printf("%d",x[i++]=random()%3);while(c<60){if(x[c]==1)l=l==1?3:l==2?0:l==3?2:l+1;else if(x[c]==2)r=r==1?3:r==2?0:r==3?2:r+1;printf("\n%d: (L:%d%% %s, R:%d%% %s)",x[c++],L*25,l==0||l==3?"stopped":l==1?"opening":"closing",R*25,r==0||r==3?"stopped":r==1?"opening":"closing");L=l==1?L+1:l==2?L-1:L;R=r==1?R+1:r==2?R-1:R;L=L<0?0:L>4?4:L;R=R<0?0:R>4?4:R;l=L==0?0:L==4?3:l;r=R==0?0:R==4?3:r;}}

Старіша версія 2:

c,i,l,r,L,R,x[60];g(){while(i<60)printf("%d",x[i++]=random()%3);}main(){g();while(c<60){if(x[c]==1)l=l==1?3:l==2?0:l==3?2:l+1;else if(x[c]==2)r=r==1?3:r==2?0:r==3?2:r+1;printf("%d: (L:%d%% %s, R:%d%% %s)\n",x[c++],L*25,l==0||l==3?"stopped":l==1?"opening":"closing",R*25,r==0||r==3?"stopped":r==1?"opening":"closing");L=l==1?L+1:l==2?L-1:L;R=r==1?R+1:r==2?R-1:R;L=L<0?0:L>4?4:L;R=R<0?0:R>4?4:R;l=L==0?0:L==4?3:l;r=R==0?0:R==4?3:r;}}

2
Чи можете ви перетворити це в код?
хайкам

2

PHP, 254 247 246 245 235 230 226 байт

побивши ES знову!

for($t=60;$t--;)$s.=rand()%3;echo$s;for(;++$t<60;print"
$c: ($o[1], $o[2])")for($i=3;--$i;$o[$i]='.LR'[$i].':'.$d[$i]*25 .'% '.[opening,stopped,closing][abs($z-1)])if(((1&$z=&$r[$i])&&!(3&$d[$i]+=2-$z))|$i&$c=$s[$t])$z=++$z%4;

гольф вниз з цих 311 (перша повна версія, вже була гольф):

<?for($i=60;$i--;)$s.=rand(0,2);echo$s;$d=$r=[0,0];$n=[L,R];$p=[stopped,opening,stopped,closing];for($t=-1;++$t<60;print"
$c: (".join(', ',$x).")")for($m=$c=$s[$t],$i=-1;$i++<1;){if($r[$i]&1)if(!($d[$i]+=2-$r[$i])||4==$d[$i])$m|=$i+1;if($m&$i+1)$r[$i]=(1+$r[$i])%4;$x[$i]="$n[$i]:".($d[$i]*25)."% ".$p[$r[$i]];}

зламатися

for($t=60;$t--;)$s.=rand()%3;   // part 1               also initializes $t to -1
echo$s;
for(
    ;
    ++$t<60;
    print"\n$c: ($o[1], $o[2])" // print output
)
    for($i=3;--$i;  // loop $i from 2 to 1 (door number)
        // generate output
        $o[$i]='.LR'[$i].':'.$d[$i]*25 .'% '
        .[opening,stopped,closing][abs($z-1)]           // map 0123 to 1012
    )
        if(((1&$z=&$r[$i])  // if door in motion        ... and reference the array item
            &&!(3&              // 2. if end position   "&&" needed for short circuit
            $d[$i]+=2-$z        // 1. move door         2-$z maps 1,3 to 1,-1 = delta
            )
        )|$i&$c=$s[$t])     // 3. or if button $i pressed   "|" needed for no short circuit
            $z=++$z%4;          // rotate direction     ++$z%4 maps 0,1,2,3 to 1,2,3,0
        // generate output (loop post condition)
    // print output (loop post condition)

@Arnauld: отримав! :)
Тит

1

Java 8 лямбда, 500 символів

Я зробив все можливе, ось що я придумав:

()->{String r="";int i=0,l=0,m=0,n=1,o=1,p=0,q=0;for(;i++<60;)r+=(int)(Math.random()*3);for(char s:r.toCharArray()){l+=p;m+=q;if(l>99&p>0){l=100;p=25*(((n=++n%4)-1)%2);}if(l<1&p<0){l=0;p=25*(((n=++n%4)-1)%2);}if(m>99&q>0){m=100;q=25*(((o=++o%4)-1)%2);}if(m<1&q<0){m=0;q=25*(((o=++o%4)-1)%2);}if(s<49);else if(s>49)q=25*(((o=++o%4)-1)%2);else p=25*(((n=++n%4)-1)%2);r+="\n"+s+": (L:"+l+"% "+(p<0?"closing":p>0?"opening":"stopped")+", R:"+m+"% "+(q<0?"closing":q>0?"opening":"stopped")+")";}return r;}

Безгольф в повний клас:

public class Q91479 {

    public static String movedDoorsCombined() {
        String result = "";
        int i = 0, leftDoor = 0, rightDoor = 0, stepLeft = 1, stepRight = 1, changeLeft = 0, changeRight = 0;

        for (; i++ < 60;) {
            result += (int) (Math.random() * 3);
        }

        for (char step : result.toCharArray()) {
            // update stats
            leftDoor += changeLeft;
            rightDoor += changeRight;

            if (leftDoor > 99 & changeLeft > 0) {
                leftDoor = 100;
                changeLeft = 25 * (((stepLeft = ++stepLeft % 4) - 1) % 2);
            }
            if (leftDoor < 1 & changeLeft < 0) {
                leftDoor = 0;
                changeLeft = 25 * (((stepLeft = ++stepLeft % 4) - 1) % 2);
            }
            if (rightDoor > 99 & changeRight > 0) {
                rightDoor = 100;
                changeRight = 25 * (((stepRight = ++stepRight % 4) - 1) % 2);
            }
            if (rightDoor < 1 & changeRight < 0) {
                rightDoor = 0;
                changeRight = 25 * (((stepRight = ++stepRight % 4) - 1) % 2);
            }

            if (step < 49) {
                // 0
            }
            else if (step > 49) {
                // right
                changeRight = 25 * (((stepRight = ++stepRight % 4) - 1) % 2);
            }
            else {
                // left
                changeLeft = 25 * (((stepLeft = ++stepLeft % 4) - 1) % 2);
            }
            result += "\n" + step + ": (L:" + leftDoor + "% "
                        + (changeLeft < 0 ? "closing" : changeLeft > 0 ? "opening" : "stopped")
                        + ", R:" + rightDoor + "% "
                        + (changeRight < 0 ? "closing" : changeRight > 0 ? "opening" : "stopped")
                        + ")";
        }
        return result;
    }
}

Досить прямо вперед. Змінні stepLeft / stepRight обходять від 0-3. Виконуючи просту математику changeLeft / changeRight, проводите відповідні зміни за крок, які будуть додані до leftDoor / rightDoor. Багато хто, якщо заяви про ловлю, коли двері повинні зупинитися самостійно.

Не соромтеся допомогти мені скоротити це, я думаю, що потрібно зробити багато.


1

Haskell (лямбдабот) - 409 байт

p=(cycle[0,1,0,-1],0)
t(d:q,s)=(if d/=0&&(s+d<1||3<s+d)then q else d:q,s+d)
k i(a,b)=[o i,": (L:",j a,", ","R:",j b,")"]>>=id
j(d:_,s)=o(round$(fromIntegral s/4)*100)++"% "++words"closing stopped opening"!!(d+1)
s=scanl$ \(a,b)i->i(t a,t b)
main=do b<-(fmap(round.(*(2::Float))).take 60<$>randoms)<$>getStdGen;putStrLn.unlines$(o=<<b):(zipWith k b.w.s(p,p)$([id,f$f w,second$f w]!!)<$>b)
o=show;f=first;w=tail

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