Лукас против Дверь гаражных ворот

15

отказ

Хотя я знаю, что есть этот конкретный связанный вопрос , в моем вопросе используются две гаражные двери, случайный компонент, и я также основываю это на реальных событиях, когда мой сын случайно опустил одну из указанных гаражных дверей, когда я выходил из дома. гараж на прошлой неделе ... Ничего подобного удару по голове, чтобы творческие соки текли! ;)

Фон

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

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

Итак, задача Code-Golf разделена на две части:

Первая часть

Создайте строку длиной 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% - это процент открытости правой двери (там нет заполнения нулями)
  • YYYYYYY - это статус правой двери. Если дверь не находится в движении (то есть не открывается или не закрывается), применяется статус «остановлено», то есть она была остановлена ​​в движении (возможно только при 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)

Это код-гольф, поэтому самый короткий код станет явным победителем. Я сделал это немного проще, используя такие фразы, как «открытие», «остановка» и «закрытие», которые состоят из семи букв ... так что вы можете включить это в свою стратегию.

Удачи!

Уолли Уэст
источник
Вы должны определить более четкий формат вывода для части 2.
LegionMammal978
@ LegionMammal978 Что вы чувствуете, что отсутствует в выводе?
WallyWest
1
Я не знаю сейчас, но я думаю, что это хороший вопрос - я могу решить его.
DLosc
1
Почему 1в вашем примере последняя команда не останавливает левую дверь на 75%?
Арно
1
Должны ли все 0,1, 2 и 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))                        "
медь
источник
Вот это да! Спасибо за этот ответ, а также за объяснение кода ... Я действительно
понял
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())

Arnauld
источник
Ничего себе, я впечатлен одним вкладышем и бросаю его в 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

Python 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))

Я почти уверен, что это может быть дальше.

Ungolfed, с комментариями:

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;}}
cleblanc
источник
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)
Titus
источник
@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. Многие заявления о том, чтобы поймать, когда дверь должна остановиться самостоятельно.

Не стесняйтесь помочь мне сократить это, я думаю, есть много дел.

Frozn
источник
1

Haskell (lambdabot) - 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вашего кода (и количество байтов). Если есть переводчик, который импортирует по умолчанию, обратитесь к нему в названии языка.
Ними,