Lucas vs. O controle remoto da porta da garagem

15

aviso Legal

Embora eu saiba que existe essa pergunta relacionada específica , minha pergunta usa duas portas de garagem, um componente aleatório, e também estou baseando isso em eventos da vida real, vendo meu filho acidentalmente abaixar uma das referidas portas de garagem enquanto eu estava saindo da sala. garagem na semana passada ... Nada como um golpe na cabeça para fazer fluir os sucos criativos! ;)

O fundo

Lucas (meu filho de 15 meses) gosta de brincar com o controle remoto da garagem. Existem dois botões neste controle remoto, um para a porta esquerda da garagem e outro para a porta direita da garagem. Ambos os botões funcionam da mesma maneira; pressione uma vez para abrir a porta, pressione novamente para parar, pressione novamente para começar a fechar, pressione novamente para parar novamente e assim por diante.

Lucas adora esse controle remoto, ele pressiona aleatoriamente um dos botões, ou ambos, ou nenhum. Se os dois forem pressionados, nenhum sinal será enviado, mas pressionar um botão enviará um sinal.

Portanto, o desafio do código-golfe é dividido em duas partes:

Parte um

Gere uma cadeia de 60 caracteres que representa o pressionamento aleatório do botão Lucas por um minuto. "Aleatório" neste caso significa "com uma chance igual de cada entrada a cada marca". Os caracteres são os seguintes:

  • 0: Lucas não pressionou nenhum botão ou pressionou os dois botões. De qualquer maneira, nenhum sinal foi enviado.
  • 1: O botão da porta esquerda da garagem foi pressionado por Lucas
  • 2: O botão da porta direita da garagem foi pressionado por Lucas

Parte dois

Usando a corda gerada na Parte Um, simule a abertura e o fechamento da garagem para dois carros usando os números como gatilhos para abrir, parar e fechar essas portas.

Minhas portas da garagem são bem rápidas (consulte o Aviso acima sobre o motivo). Depois de pressionar o botão, leva quatro segundos para ser totalmente aberto ou fechado.

Então, se fechado:

  • 0 s: 0% aberto (fechado); quando o botão é pressionado, a porta começa a abrir
  • 1 s: 25% aberto
  • 2 s: 50% aberto
  • 3 s: 75% aberto
  • 4 s: 100% aberto, batentes de porta

E, portanto, se aberto:

  • 0 s: 100% aberto; quando o botão é pressionado, a porta começa a fechar
  • 1 s: 75% aberto
  • 2 s: 50% aberto
  • 3 s: 25% aberto
  • 4 s: 0% aberto (fechado), batentes de porta

Se uma porta específica estiver em movimento, um sinal para a mesma porta a interromperá. O próximo sinal enviado para a mesma porta depois enviará o movimento na direção oposta. Se uma porta for parada quando estiver em movimento e agora estiver totalmente aberta ou totalmente fechada quando o sinal de "parada" for recebido, a porta será registrada como "parada" no estado totalmente aberto ou totalmente fechado, pronta para mova na direção oposta quando receber um novo sinal.

Com esta simulação, as duas portas da garagem estarão inicialmente na posição fechada. Então, vejamos uma lista de comandos de 10 segundos e vejamos o que acontece se Lucas executá-los no controle remoto:

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)

Resultado

A primeira parte da saída requer a exibição da cadeia longa de 60 caracteres dos caracteres aleatórios "0", "1" e "2" gerados a partir da Parte Um. por exemplo. 212022112021202211202120221120212022112021202211202120221120

Abaixo dessa sequência, está o processamento desses "sinais", de acordo com as regras mencionadas acima, sobre como as portas da garagem se comportarão com cada caractere respectivo (segundo a segundo). Você deve terminar com 60 linhas como resultado abaixo da sequência de exibição inicial.

Cada uma dessas linhas processadas terá a forma de: N: (L:X% XXXXXXX, R:Y% YYYYYYY)where:

  • N é o enésimo caractere da respectiva sequência aleatória, que terá a forma de 0, 1 ou 2.
  • X% é a porcentagem de abertura da porta esquerda (não há preenchimento zero)
  • XXXXXXX é o status da porta esquerda. Se a porta não estiver em movimento (ou seja, não abrir ou fechar), o status "parado" será aplicado, o que significa que foi interrompido em movimento (apenas possível a 25%, 50% ou 75%) ou parado quando totalmente aberto (100% ) ou totalmente fechado (0%). Caso contrário, a porta estará "abrindo" ou "fechando".
  • Y% é a porcentagem de abertura da porta direita (não há preenchimento zero)
  • AAAAAA é o status da porta direita. Se a porta não estiver em movimento (ou seja, não abrir ou fechar), o status "parado" será aplicado, o que significa que foi interrompido em movimento (apenas possível a 25%, 50% ou 75%) ou parado quando totalmente aberto (100% ) ou totalmente fechado (0%). Caso contrário, a porta estará "abrindo" ou "fechando".

Exemplo mostrado abaixo usando 10 "sinais" e 10 linhas processadas

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)

Isso é código-golfe, então o código mais curto será o vencedor. Facilitei um pouco isso usando frases como "abertura", "parada" e "fechamento", que são todas as sete letras ... portanto, você pode incluir isso em sua estratégia.

Boa sorte!

WallyWest
fonte
Você deve definir um formato de saída mais clara para a Parte 2.
LegionMammal978
@ LegionMammal978 O que você acha que está faltando na saída?
precisa saber é o seguinte
1
No momento não, mas acho que é uma pergunta interessante - posso resolvê-la.
DLosc 29/08/16
1
Por que o último 1comando não está parando a porta esquerda em 75% no seu exemplo?
Arnauld
1
0,1 e 2 devem aparecer igualmente na primeira parte, ou não pressionar, pressionar duas vezes, pressionar esquerda e pressionar direita devem aparecer igualmente? (ou seja, 0 é mais provável porque representa dois cenários que causam o mesmo e resultar ...)
socrático Phoenix

Respostas:

2

Pitão, 156 149 145 bytes

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

Uma tradução direta da minha resposta em Python .

Experimente online!

Explicação:

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))                        "
Cobre
fonte
Uau! Obrigado por esta resposta, bem como a explicação do código ... Eu estava realmente fazendo sentido de que no momento em que cheguei ao fim de tudo ...
Wally West
5

Javascript (ES6), 277 275 263 253 250 247 234 bytes

_=>(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)

Ungolfed e comentou

_ => (
  // 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
)

Demo

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
fonte
Uau, estou impressionado com o liner e o joguei no console.log! Bem feito!
Wally West
1
Curiosamente não funciona no Firefox, apenas 4 linhas de produção, como este 112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ](novas linhas após a vírgula e entre parênteses)
edc65
@ edc65 - Meu mau, na verdade. Eu li mal as instruções sobre o formato de saída. Isso está consertado.
Arnauld
@Arnauld Você também pode remover os parênteses v^=(c-i-1?0:v&8||24)para economizar dois bytes.
WallyWest 30/08/16
PS @Arnauld, obrigado por participar!
precisa saber é o seguinte
4

Python 2, 377 370 361 357 345 335 326 316 312 306 304 bytes

O segundo nível de recuo é uma guia bruta ( \t), que joga muito mal com o Markdown, então foi substituída por dois espaços.

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

Estou quase certo de que isso pode ser jogado ainda mais.

Ungolfed, com comentários:

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],
  )

Guardado 4 14 15 bytes graças a @TheBikingViking!

Guardado 6 bytes graças a @ValueInk!

Cobre
fonte
1
Você pode mudar range(60)para [0]*60.
TheBikingViking 29/08/16
1
@TheBikingViking Thanks! Estou editando isso agora.
Copper
2
Você pode fazer 'p'[1::3](substituir apóstrofos por retângulos) em vez de ''.join(map(str,p)).
TheBikingViking 29/08/16
2
(4,0)[q<0]==c[i]and q->((4,0)[q<0]==c[i])*q
TheBikingViking
2
@ValueInk Essa linha abusa de um bug nas compreensões da lista do Python 2 para definir nessa string. né usado na linha final para extrair closing, stopped, openinga partir desse string.
Copper
2

Ruby, 263 261 260 254 bytes

Como a resposta do JavaScript ficou tão curta ??? Ele ultrapassou o meu enquanto eu estava fora e ainda está ganhando atualmente ...

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]}"}}
Value Ink
fonte
2

C, 420 433 424 374 bytes

#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);}}

Não propaga o gerador aleatório, mas usa aleatório para uma melhor distribuição. Porém, deve haver uma maneira melhor de jogar golfe nessa lógica ...

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)

Versão anterior 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;}}

Versão anterior 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
fonte
2
Você pode converter isso em código?
haykam 01/09/16
2

PHP, 254 247 246 245 235 230 226 bytes

batendo ES novamente!

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;

desses 311 (a primeira versão completa, já tinha algum golfe):

<?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]];}

demolir

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
fonte
@Arnauld: peguei você! :)
Titus
1

Java 8 lambda, 500 caracteres

Eu fiz o meu melhor, aqui está o que eu vim com:

()->{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;}

Ungolfed em uma classe completa:

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;
    }
}

Bem direto. As variáveis ​​stepLeft / stepRight circulam de 0 a 3. Ao realizar algumas matemáticas simples, changeLeft / changeRight mantenha as respectivas alterações relativas por etapa, que serão adicionadas a leftDoor / rightDoor. Muitas declarações para pegar quando a porta tem que parar por conta própria.

Sinta-se à vontade para me ajudar a reduzir isso, acho que há muito o que fazer.

Frozn
fonte
1

Haskell (lambdabot) - 409 bytes

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
BlackCap
fonte
Por favor, adicione todo o necessário imports, por exemplo, para o randomsseu código (e contagem de bytes). Se houver um intérprete importado por padrão, consulte-o no nome do idioma.
nimi