Lucas vs. Il telecomando della porta del garage


15

disconoscimento

Mentre so che c'è questa particolare domanda correlata , la mia domanda usa due porte da garage, un componente randomizzato, e lo sto anche basando su eventi della vita reale, vedendo mio figlio aver accidentalmente abbassato una di quelle porte da garage mentre uscivo dal garage la scorsa settimana ... Niente come un colpo alla testa per far fluire i succhi creativi! ;)

Lo sfondo

A Lucas (mio figlio di 15 mesi) piace giocare con il telecomando del garage. Ci sono due pulsanti su questo telecomando, uno per la porta del garage sinistro e uno per la porta del garage destro. Entrambi i pulsanti funzionano allo stesso modo; premere una volta per far aprire la porta, premere di nuovo per fermare, premere di nuovo per iniziare a chiudere, premere di nuovo per fermarsi di nuovo, e così via.

Lucas adora questo telecomando, premerà casualmente uno dei pulsanti, o entrambi, o nessuno. Se vengono premuti entrambi, non viene inviato alcun segnale, ma la pressione di un pulsante invierà un segnale.

Quindi, la sfida del code-golf è divisa in due parti:

Prima parte

Genera una stringa lunga 60 caratteri che rappresenta la pressione casuale dei pulsanti di Lucas per un minuto. "Casuale" in questo caso significa "con le stesse possibilità di ciascun ingresso per ogni segno di spunta". I personaggi sono i seguenti:

  • 0: Lucas non ha premuto alcun pulsante o ha premuto entrambi i pulsanti. Ad ogni modo, nessun segnale è stato inviato.
  • 1: Il pulsante per la porta sinistra del garage è stato premuto da Lucas
  • 2: Il pulsante per la porta del garage destro è stato premuto da Lucas

Seconda parte

Utilizzando la stringa generata nella prima parte, simulare l'apertura e la chiusura del garage per due auto utilizzando i numeri come trigger per l'apertura, l'arresto e la chiusura di queste porte.

Le porte del mio garage sono piuttosto veloci (vedi il Disclaimer sopra sul perché). Dopo aver premuto il pulsante, sono necessari quattro secondi per essere completamente aperti o chiusi.

Quindi, se chiuso:

  • 0 sec: 0% aperto (chiuso); quando si preme il pulsante, la porta inizia ad aprirsi
  • 1 secondo: 25% aperto
  • 2 sec: 50% aperto
  • 3 sec: 75% aperto
  • 4 sec: 100% aperto, porta ferma

E quindi, se aperto:

  • 0 sec: 100% aperto; quando si preme il pulsante, la porta inizia a chiudersi
  • 1 secondo: aperto al 75%
  • 2 sec: 50% aperto
  • 3 sec: 25% aperto
  • 4 sec: 0% aperto (chiuso), porta ferma

Se una determinata porta è in movimento, un segnale a quella stessa porta la fermerà. Il segnale successivo inviato a quella stessa porta, successivamente, lo farà muovere nella direzione opposta. Se una porta viene fermata quando è stata precedentemente in movimento e ora è completamente aperta o completamente chiusa quando viene ricevuto il segnale "stop", la porta verrà registrata come "fermata" nello stato completamente aperto o completamente chiuso, pronta per muoversi nella direzione opposta quando riceve un nuovo segnale.

Con questa simulazione, entrambe le porte del garage saranno inizialmente in posizione chiusa. Quindi, diamo un'occhiata a un elenco di 10 secondi di comandi e vediamo cosa succede se Lucas dovesse eseguirli sul telecomando:

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)

Produzione

La prima parte dell'output richiede la visualizzazione della stringa lunga di 60 caratteri di caratteri casuali "0", "1" e "2" generati dalla prima parte. per esempio. 212022112021202211202120221120212022112021202211202120221120

Sotto questa stringa, si trova l'elaborazione di questi "segnali" secondo le regole sopra menzionate su come le porte del garage si comporteranno con ciascun rispettivo carattere (secondo per secondo). Dovresti finire con 60 righe come risultato sotto la stringa di visualizzazione iniziale.

Ognuna di queste linee elaborate avrà la forma di: N: (L:X% XXXXXXX, R:Y% YYYYYYY)dove:

  • N è l'ennesimo carattere della rispettiva stringa casuale, che avrà la forma di 0, 1 o 2.
  • X% è la percentuale di apertura della porta sinistra (non c'è imbottitura zero)
  • XXXXXXX è lo stato della porta sinistra. Se la porta non è in movimento (cioè non si apre o si chiude) viene applicato lo stato "arrestato", il che significa che è stato arrestato in movimento (possibile solo al 25%, 50% o 75%) o arrestato quando è completamente aperto (100% ) o completamente chiuso (0%). Altrimenti, la porta sarà "apertura" o "chiusura".
  • Y% è la percentuale di apertura della porta destra (non vi è alcuna imbottitura zero)
  • AAAAAA è lo stato della porta giusta. Se la porta non è in movimento (cioè non si apre o si chiude) viene applicato lo stato "arrestato", il che significa che è stato arrestato in movimento (possibile solo al 25%, 50% o 75%) o arrestato quando è completamente aperto (100% ) o completamente chiuso (0%). Altrimenti, la porta sarà "apertura" o "chiusura".

Esempio mostrato sotto usando 10 "segnali" e 10 linee elaborate

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)

Questo è code-golf, quindi il codice più corto sarà il chiaro vincitore. L'ho reso un po 'semplice usando frasi come "apertura", "arresto" e "chiusura", che sono tutte e sette le lettere ... quindi potresti voler inserire questo nella tua strategia.

Buona fortuna!


Dovresti definire un formato di output più chiaro per la Parte 2.
LegionMammal978,

@ LegionMammal978 Cosa ritieni manchi dall'output?
WallyWest,

1
Al momento no, ma penso che sia una domanda chiara, potrei affrontarla.
DLosc,

1
Perché l'ultimo 1comando non ha fermato la porta sinistra al 75% nel tuo esempio?
Arnauld,

1
0,1 e 2 dovrebbero apparire tutti uguali nella prima parte, oppure non premere, premere due volte, premere a sinistra e premere a destra tutti allo stesso modo? (significa che 0 è più probabile perché rappresenta due scenari che causano lo stesso e il risultato ...)
Socratic Phoenix

Risposte:


2

Pyth, 156 149 145 byte

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

Una traduzione diretta della mia risposta Python .

Provalo online!

Spiegazione:

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

Wow! Grazie per questa risposta, così come per la spiegazione del codice ... In realtà lo stavo già
capendo

5

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

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

Ungolf e commentato

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

dimostrazione

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


Wow, sono impressionato dall'unica linea e la lancio in console.log! Molto bene!
WallyWest,

1
Curiosamente non funziona in Firefox, solo 4 righe nell'output, in questo modo 112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ](newline dopo virgola e parentesi)
edc65,

@ edc65 - Il mio male, in realtà. Ho letto male le istruzioni sul formato di output. Questo è stato risolto.
Arnauld,

@Arnauld È inoltre possibile rimuovere le parentesi v^=(c-i-1?0:v&8||24)per salvare due byte.
WallyWest,

PS @Arnauld, grazie per aver partecipato!
WallyWest,

4

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

Il secondo trattino è una scheda non elaborata ( \t), che gioca davvero male con Markdown, quindi è stata sostituita da due spazi.

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

Sono quasi certo che questo possa essere ulteriormente migliorato.

Ungolfed, con commenti:

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

Risparmiato 4 14 15 byte grazie a @TheBikingViking!

6 byte salvati grazie a @ValueInk!


1
Puoi cambiare range(60)in [0]*60.
TheBikingViking

1
@TheBikingViking Grazie! Lo sto modificando ora.
Rame

2
Puoi farlo 'p'[1::3](sostituisci gli apostrofi con i backtick) invece di ''.join(map(str,p)).
TheBikingViking

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

2
@ValueInk Quella riga abusa di un bug nella comprensione dell'elenco di Python 2 da impostare nsu quella stringa. nviene utilizzato sulla linea finale di estrarre closing, stopped, openingda quella stringa.
Rame

2

Rubino, 263 261 260 254 byte

In che modo la risposta di JavaScript è diventata così breve ??? Ha superato il mio mentre ero via e al momento sta ancora vincendo ...

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 byte

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

Non semina il generatore casuale, ma usa casuale per una migliore distribuzione. Ci deve essere un modo migliore per giocare a golf con questa logica ...

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)

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

Versione precedente 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
Puoi convertirlo in codice?
Hayak

2

PHP, 254 247 246 245 235 230 226 byte

battere di nuovo 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;

da questi 311 (la prima versione completa, aveva già un po 'di golf):

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

abbattersi

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: ti ho preso! :)
Tito,

1

Java 8 lambda, 500 caratteri

Ho fatto del mio meglio, ecco cosa mi è venuto in mente:

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

Ungolf in una 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;
    }
}

Abbastanza diretto. Le variabili stepLeft / stepRight fanno un cerchio da 0-3. Eseguendo alcune semplici operazioni matematiche changeLeft / changeRight tieni premute le rispettive modifiche relative per step, che verranno aggiunte a leftDoor / rightDoor. Molte se dichiarazioni per la cattura quando la porta deve fermarsi da sola.

Sentiti libero di aiutarmi ad abbreviare questo, penso che ci sia molto da fare.


1

Haskell (lambdabot) - 409 byte

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

Aggiungi tutto il necessario imports, ad esempio per il randomstuo codice (e il conteggio dei byte). Se esiste un interprete che importa per impostazione predefinita, fare riferimento ad esso nel nome della lingua.
nimi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.