Lucas Vs. Die Garagentor-Fernbedienung

15

Haftungsausschluss

Obwohl ich weiß, dass es sich um eine bestimmte verwandte Frage handelt , verwendet meine Frage zwei Garagentore, eine zufällige Komponente, und ich stütze mich dabei auch auf reale Ereignisse, als mein Sohn versehentlich eines dieser Garagentore heruntergelassen hat, als ich aus dem ging Garage letzte Woche ... Nichts wie ein Schlag auf den Kopf, um die kreativen Säfte zum Fließen zu bringen! ;)

Der Hintergrund

Lucas (mein 15 Monate alter Sohn) spielt gern mit der Garagenfernbedienung. Auf dieser Fernbedienung befinden sich zwei Tasten, eine für das linke Garagentor und eine für das rechte Garagentor. Beide Tasten funktionieren auf die gleiche Weise. Einmal drücken, um die Tür zu öffnen, erneut drücken, um anzuhalten, erneut drücken, um zu schließen, erneut drücken, um anzuhalten, und so weiter.

Lucas liebt diese Fernbedienung, er drückt zufällig einen oder beide Knöpfe oder gar keinen. Wenn beide gedrückt werden, wird kein Signal gesendet, aber durch Drücken einer Taste wird ein Signal gesendet.

Die Code-Golf-Herausforderung besteht also aus zwei Teilen:

Teil eins

Generieren Sie eine 60 Zeichen lange Zeichenfolge, die zufällige Lucas-Tastendrücke über eine Minute darstellt. "Zufällig" bedeutet in diesem Fall "mit gleicher Wahrscheinlichkeit für jede Eingabe bei jedem Tick". Die Zeichen sind wie folgt:

  • 0: Lucas hat entweder keine Taste gedrückt oder beide Tasten gedrückt. In beiden Fällen wurde kein Signal gesendet.
  • 1: Der Knopf für das linke Garagentor wurde von Lucas gedrückt
  • 2: Der Knopf für das rechte Garagentor wurde von Lucas gedrückt

Zweiter Teil

Simulieren Sie anhand der in Teil 1 generierten Zeichenfolge das Öffnen und Schließen der Garage für zwei Autos. Verwenden Sie dabei die Zahlen als Auslöser für das Öffnen, Stoppen und Schließen dieser Türen.

Meine Garagentore sind ziemlich schnell (siehe oben, warum). Sobald Sie die Taste gedrückt haben, dauert es vier Sekunden, bis sie vollständig geöffnet oder geschlossen ist.

Also, wenn geschlossen:

  • 0 Sek .: 0% offen (geschlossen); Wenn die Taste gedrückt wird, öffnet sich die Tür
  • 1 Sek .: 25% geöffnet
  • 2 Sek .: 50% offen
  • 3 Sek .: 75% offen
  • 4 Sek .: 100% geöffnet, Tür bleibt stehen

Und deshalb, wenn offen:

  • 0 Sek .: 100% offen; Wenn die Taste gedrückt wird, beginnt sich die Tür zu schließen
  • 1 Sek .: 75% offen
  • 2 Sek .: 50% offen
  • 3 Sek .: 25% offen
  • 4 Sek .: 0% offen (geschlossen), Tür bleibt stehen

Wenn eine bestimmte Tür in Bewegung ist, wird sie durch ein Signal an dieselbe Tür gestoppt. Das nächste Signal, das danach an dieselbe Tür gesendet wird, bewegt sich in die entgegengesetzte Richtung. Wird eine Tür angehalten, wenn sie zuvor in Bewegung war und ist jetzt vollständig geöffnet oder vollständig geschlossen, wenn das "Stopp" -Signal empfangen wird, wird die Tür als "angehalten" im vollständig geöffneten oder vollständig geschlossenen Zustand registriert, bereit zu Bewegen Sie sich in die entgegengesetzte Richtung, wenn ein neues Signal eingeht.

Bei dieser Simulation befinden sich beide Garagentore zunächst in der geschlossenen Position. Schauen wir uns also eine 10-Sekunden-Liste mit Befehlen an und sehen, was passiert, wenn Lucas sie auf der Fernbedienung ausführt:

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)

Ausgabe

Der erste Teil der Ausgabe erfordert die Anzeige der 60 Zeichen langen Folge von zufälligen "0" -, "1" - und "2" -Zeichen, die aus Teil 1 generiert wurden. z.B. 212022112021202211202120221120212022112021202211202120221120

Unterhalb dieser Zeichenfolge befindet sich die Verarbeitung dieser "Signale" gemäß den oben genannten Regeln für das Verhalten der Garagentore mit den jeweiligen Zeichen (sekundenweise). Sie sollten am Ende 60 Zeilen unterhalb der anfänglichen Anzeigezeichenfolge haben.

Jede dieser verarbeiteten Zeilen hat folgende Form N: (L:X% XXXXXXX, R:Y% YYYYYYY):

  • N ist das n-te Zeichen aus der jeweiligen Zufallszeichenfolge, die die Form einer 0, 1 oder 2 hat.
  • X% ist der Prozentsatz der Offenheit der linken Tür (es gibt keine Nullpolsterung)
  • XXXXXXX ist der Status der linken Tür. Wenn die Tür nicht in Bewegung ist (dh nicht öffnet oder schließt), wird der Status "gestoppt" erzwungen. Dies bedeutet, dass sie in Bewegung gestoppt wurde (nur bei 25%, 50% oder 75% möglich) oder angehalten wurde, wenn sie vollständig geöffnet ist (100%). ) oder vollständig geschlossen (0%). Andernfalls wird die Tür entweder "geöffnet" oder "geschlossen".
  • Y% ist der Prozentsatz der Offenheit der rechten Tür (es gibt keine Nullpolsterung)
  • JJJJJJ ist der Status der rechten Tür. Wenn die Tür nicht in Bewegung ist (dh nicht öffnet oder schließt), wird der Status "gestoppt" erzwungen. Dies bedeutet, dass sie in Bewegung gestoppt wurde (nur bei 25%, 50% oder 75% möglich) oder angehalten wurde, wenn sie vollständig geöffnet ist (100%). ) oder vollständig geschlossen (0%). Andernfalls wird die Tür entweder "geöffnet" oder "geschlossen".

Das unten gezeigte Beispiel verwendet 10 "Signale" und 10 verarbeitete Leitungen

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)

Dies ist Code-Golf, so dass der kürzeste Code der klare Gewinner ist. Ich habe das ein wenig vereinfacht, indem ich Sätze wie "Öffnen", "Stoppen" und "Schließen" verwendet habe, die alle aus sieben Buchstaben bestehen. Vielleicht möchten Sie das in Ihre Strategie einarbeiten.

Viel Glück!

WallyWest
quelle
Sie sollten ein klareres Ausgabeformat für Teil 2 definieren.
LegionMammal978
@ LegionMammal978 Was fehlt Ihrer Meinung nach in der Ausgabe?
WallyWest
1
Ich weiß es im Moment nicht, aber ich denke, es ist eine nette Frage - ich werde es vielleicht angehen.
DLosc
1
Warum 1stoppt der letzte Befehl in Ihrem Beispiel die linke Tür nicht bei 75%?
Arnauld
1
Sollen 0,1 und 2 im ersten Teil alle gleich erscheinen, oder sollen No-Press, Double-Press, Left-Press und Right-Press alle gleich erscheinen? (Das heißt, 0 ist wahrscheinlicher, weil es zwei Szenarien darstellt, die dasselbe und Ergebnis verursachen ...)
Socratic Phoenix

Antworten:

2

Pyth, 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

Eine direkte Übersetzung meiner Python-Antwort .

Probieren Sie es online!

Erläuterung:

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))                        "
Kupfer
quelle
Beeindruckend! Vielen Dank für diese Antwort sowie für die Erklärung des Codes. Als ich am Ende
angelangt
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 und kommentiert

_ => (
  // 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
quelle
Wow, ich bin beeindruckt von dem einen Liner und werfe ihn dabei in console.log! Gut gemacht!
WallyWest
1
Seltsamerweise nicht in Firefox, nur 4 Zeilen in der Ausgabe, wie 112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ]folgt (Zeilenumbrüche nach Komma und Klammern)
edc65
@ edc65 - Mein schlechtes eigentlich. Ich habe die Anweisungen zum Ausgabeformat falsch gelesen. Dies ist behoben.
Arnauld
@Arnauld Sie können auch die Klammern von entfernen v^=(c-i-1?0:v&8||24), um zwei Bytes zu sparen.
WallyWest
PS @ Arnauld, vielen Dank für die Teilnahme!
WallyWest
4

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

Die zweite Einrückungsstufe ist eine rohe Registerkarte ( \t), die mit Markdown sehr schlecht funktioniert. Sie wurde also durch zwei Leerzeichen ersetzt.

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

Ich bin mir fast sicher, dass dies weiter golfen werden kann.

Ungolfed, mit Kommentaren:

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

Gespeichert 4 14 15 Bytes dank @TheBikingViking!

6 Bytes gespart dank @ValueInk!

Kupfer
quelle
1
Sie können ändern , range(60)zu [0]*60.
TheBikingViking
1
@TheBikingViking Danke! Ich bearbeite das jetzt.
Kupfer
2
Sie können 'p'[1::3]anstelle von auch Apostrophe durch Backticks ersetzen ''.join(map(str,p)).
TheBikingViking
2
(4,0)[q<0]==c[i]and q->((4,0)[q<0]==c[i])*q
TheBikingViking
2
@ValueInk Diese Zeile missbraucht einen Fehler im Listenverständnis von Python 2, num diesen String festzulegen . nzu extrahieren , ist auf der letzten Zeile verwendet closing, stopped, openingaus diesem String.
Kupfer
2

Ruby, 263 261 260 254 Bytes

Wie wurde die Antwort von JavaScript so kurz ??? Es hat meins in meiner Abwesenheit überholt und gewinnt derzeit noch ...

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]}"}}
Wert Tinte
quelle
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);}}

Sät nicht den Zufallsgenerator, sondern verwendet den Zufallsgenerator zur besseren Verteilung. Es muss einen besseren Weg geben, um diese Logik zu spielen ...

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)

Ältere Version 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;}}

Ältere Version 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
quelle
2
Können Sie das in Code umwandeln?
Haykam
2

PHP, 254 247 246 245 235 230 226 Bytes

ES erneut schlagen!

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;

Golf von diesen 311 (die erste vollständige Version, hatte bereits einige 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]];}

Nervenzusammenbruch

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
quelle
@ Arnauld: Hast du! :)
Titus
1

Java 8 Lambda, 500 Zeichen

Ich habe mein Bestes gegeben, hier ist, was mir eingefallen ist:

()->{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 in eine komplette Klasse:

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

Ziemlich einfach. Die Variablen stepLeft / stepRight kreisen von 0-3 ab. Mit ein paar einfachen Berechnungen wird changeLeft / changeRight die jeweiligen relativen Änderungen pro Schritt festhalten, die leftDoor / rightDoor hinzugefügt werden. Viele if-Anweisungen, um zu fangen, wann die Tür von selbst anhalten muss.

Fühlen Sie sich frei, mir zu helfen, dies zu verkürzen, ich denke, es gibt viel zu tun.

Frozn
quelle
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
quelle
Bitte ergänzen Sie Ihren Code (und die Anzahl der Bytes) um alle erforderlichen Angaben imports, z. B. für randoms. Wenn es einen Interpreter gibt, der standardmäßig importiert, beziehen Sie sich auf den Namen der Sprache.
nimi