Lucas Vs. La télécommande de porte de garage

15

Avertissement

Bien que je sache qu'il existe une question connexe particulière , ma question utilise deux portes de garage, un composant de randomisation, et je base également cela sur des événements de la vie réelle, en voyant mon fils abaisser accidentellement l'une desdites portes de garage pendant que je sortais du garage la semaine dernière ... Rien de tel qu'un coup à la tête pour faire couler les jus créatifs! ;)

L'arrière-plan

Lucas (mon fils de 15 mois) aime jouer avec la télécommande du garage. Il y a deux boutons sur cette télécommande, un pour la porte de garage gauche et un pour la porte de garage droite. Les deux boutons fonctionnent de la même manière; appuyez une fois pour que la porte commence à s'ouvrir, appuyez à nouveau pour arrêter, appuyez à nouveau pour commencer à fermer, appuyez à nouveau pour arrêter à nouveau, etc.

Lucas aime cette télécommande, il va appuyer au hasard sur l'un des boutons, ou les deux, ou aucun du tout. Si les deux sont enfoncés, aucun signal n'est envoyé, mais une pression sur un bouton enverra un signal.

Ainsi, le défi du code-golf est divisé en deux parties:

Partie un

Générez une chaîne de 60 caractères représentant les pressions aléatoires de Lucas sur une minute. "Aléatoire" dans ce cas signifie "avec une chance égale de chaque entrée à chaque tick". Les personnages sont les suivants:

  • 0: Lucas n'a appuyé sur aucun bouton ou a appuyé sur les deux boutons. Quoi qu'il en soit, aucun signal n'a été envoyé.
  • 1: Lucas a appuyé sur le bouton de la porte de garage gauche
  • 2: Lucas a appuyé sur le bouton de la porte de garage droite

Deuxième partie

À l'aide de la chaîne générée dans la première partie, simulez l'ouverture et la fermeture du garage pour deux voitures en utilisant les chiffres comme déclencheurs pour l'ouverture, l'arrêt et la fermeture de ces portes.

Mes portes de garage sont assez rapides (voir la clause de non-responsabilité ci-dessus pour savoir pourquoi). Une fois que vous appuyez sur le bouton, il faut quatre secondes pour être complètement ouvert ou fermé.

Donc, si fermé:

  • 0 sec: 0% ouvert (fermé); lorsque le bouton est enfoncé, la porte commence à s'ouvrir
  • 1 sec: 25% ouvert
  • 2 sec: 50% ouvert
  • 3 sec: 75% ouvert
  • 4 sec: 100% ouvert, la porte s'arrête

Et donc, si ouvert:

  • 0 sec: 100% ouvert; lorsque le bouton est enfoncé, la porte commence à se fermer
  • 1 sec: 75% ouvert
  • 2 sec: 50% ouvert
  • 3 sec: 25% ouvert
  • 4 sec: 0% ouvert (fermé), la porte s'arrête

Si une porte particulière est en mouvement, un signal à cette même porte l'arrêtera. Le prochain signal envoyé à cette même porte après cela l'enverra se déplaçant dans la direction opposée. Si une porte est arrêtée alors qu'elle était précédemment en mouvement et est maintenant complètement ouverte ou complètement fermée lorsque le signal "stop" est reçu, la porte sera enregistrée comme "arrêtée" à l'état complètement ouvert ou complètement fermé, prête à se déplacer dans la direction opposée lorsqu'il reçoit un nouveau signal.

Avec cette simulation, les deux portes de garage seront initialement en position fermée. Alors, regardons une liste de 10 secondes de commandes et voyons ce qui se passe si Lucas devait les exécuter sur la télécommande:

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)

Production

La première partie de la sortie nécessite l'affichage de la longue chaîne de 60 caractères de caractères aléatoires "0", "1" et "2" générés à partir de la première partie. par exemple. 212022112021202211202120221120212022112021202211202120221120

En dessous de cette chaîne, se trouve le traitement de ces "signaux" selon les règles mentionnées ci-dessus sur le comportement des portes de garage avec chaque caractère respectif (sur une base seconde par seconde). Vous devriez vous retrouver avec 60 lignes sous la chaîne d'affichage initiale.

Chacune de ces lignes traitées se présentera sous la forme de: N: (L:X% XXXXXXX, R:Y% YYYYYYY)où:

  • N est le nième caractère de la chaîne aléatoire respective, qui sera sous la forme d'un 0, 1 ou 2.
  • X% est le pourcentage d'ouverture de la porte gauche (il n'y a pas de remplissage nul)
  • XXXXXXX est l'état de la porte gauche. Si la porte n'est pas en mouvement (c'est-à-dire qu'elle ne s'ouvre ni ne se ferme), l'état "arrêté" est appliqué, ce qui signifie qu'elle a été arrêtée en mouvement (uniquement possible à 25%, 50% ou 75%) ou arrêtée lorsqu'elle est complètement ouverte (100% ) ou complètement fermé (0%). Sinon, la porte sera "ouverte" ou "fermée".
  • Y% est le pourcentage d'ouverture de la porte droite (il n'y a pas de remplissage nul)
  • YYYYYYY est l'état de la porte droite. Si la porte n'est pas en mouvement (c'est-à-dire qu'elle ne s'ouvre ni ne se ferme), l'état "arrêté" est appliqué, ce qui signifie qu'elle a été arrêtée en mouvement (uniquement possible à 25%, 50% ou 75%) ou arrêtée lorsqu'elle est complètement ouverte (100% ) ou complètement fermé (0%). Sinon, la porte sera "ouverte" ou "fermée".

Exemple illustré ci-dessous utilisant 10 "signaux" et 10 lignes traitées

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)

C'est le code-golf, donc le code le plus court sera le gagnant clair. J'ai rendu cela un peu facile en utilisant des phrases comme "ouverture", "arrêté" et "fermeture", qui sont toutes les sept lettres ... donc vous voudrez peut-être intégrer cela dans votre stratégie.

Bonne chance!

WallyWest
la source
Vous devez définir un format de sortie plus clair pour la partie 2.
LegionMammal978
@ LegionMammal978 Que pensez-vous qu'il manque dans la sortie?
WallyWest
1
Je ne le fais pas pour le moment, mais je pense que c'est une bonne question - je peux y répondre.
DLosc
1
Pourquoi la dernière 1commande n'arrête- t-elle pas la porte gauche à 75% dans votre exemple?
Arnauld
1
0,1 et 2 doivent-ils tous apparaître également dans la première partie, ou pas de presse, double pression, gauche et droite doivent-ils tous apparaître également? (ce qui signifie que 0 est plus probable car il représente deux scénarios qui provoquent la même chose et le résultat ...)
Socratic Phoenix

Réponses:

2

Pyth, 156 149 145 octets

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

Une traduction directe de ma réponse Python .

Essayez-le en ligne!

Explication:

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))                        "
Cuivre
la source
Hou la la! Merci pour cette réponse, ainsi que l'explication du code ... J'étais en train de le comprendre au moment où
j'arrivais à
5

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

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

Non golfé et commenté

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

Démo

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
la source
Wow, je suis impressionné par la doublure et le jeter dans console.log à ça! Bien joué!
WallyWest
1
Curieusement, ne fonctionne pas dans Firefox, seulement 4 lignes en sortie, comme ceci 112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ](nouvelles lignes après virgule et crochets)
edc65
@ edc65 - Ma mauvaise, en fait. J'ai mal lu les instructions sur le format de sortie. C'est corrigé.
Arnauld
@Arnauld Vous pouvez également supprimer les parenthèses de v^=(c-i-1?0:v&8||24)pour vous faire économiser deux octets.
WallyWest
PS @Arnauld, merci d'avoir participé!
WallyWest
4

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

Le deuxième niveau de retrait est un onglet brut ( \t), qui joue très mal avec Markdown, il a donc été remplacé par deux espaces.

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

Je suis presque certain que cela peut être approfondi.

Non golfé, avec commentaires:

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 octets enregistrés grâce à @TheBikingViking!

6 octets enregistrés grâce à @ValueInk!

Cuivre
la source
1
Vous pouvez changer range(60)pour [0]*60.
TheBikingViking
1
@TheBikingViking Merci! J'édite ça maintenant.
Copper
2
Vous pouvez faire 'p'[1::3](remplacer les apostrophes par des crochets) au lieu de ''.join(map(str,p)).
TheBikingViking
2
(4,0)[q<0]==c[i]and q->((4,0)[q<0]==c[i])*q
TheBikingViking
2
@ValueInk Cette ligne abuse d'un bogue dans les compréhensions de liste de Python 2 pour définir ncette chaîne. nest utilisé sur la ligne finale pour extraire closing, stopped, openingà partir de cette chaîne.
Cuivre
2

Ruby, 263 261 260 254 octets

Comment la réponse de JavaScript est-elle devenue si courte ??? Il a dépassé le mien pendant mon absence et gagne toujours actuellement ...

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]}"}}
Encre de valeur
la source
2

C, 420 433 424 374 octets

#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'amorce pas le générateur aléatoire mais utilise random pour une meilleure distribution. Il doit y avoir un meilleur moyen de jouer au golf dans cette logique ...

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)

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

Ancienne 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
la source
2
Pouvez-vous convertir cela en code?
haykam
2

PHP, 254 247 246 245 235 230 230 226 octets

battre ES à nouveau!

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é à partir de ces 311 (la première version complète, avait déjà un peu de 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]];}

panne

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
la source
@Arnauld: vous avez! :)
Titus
1

Java 8 lambda, 500 caractères

J'ai fait de mon mieux, voici ce que j'ai trouvé:

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

Non golfé dans une classe complète:

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

Assez simple. Les variables stepLeft / stepRight tournent de 0 à 3. Faire quelques calculs simples changeLeft / changeRight maintiennent les changements relatifs respectifs par étape, qui seront ajoutés à leftDoor / rightDoor. Beaucoup d'instructions if pour attraper quand la porte doit s'arrêter d'elle-même.

N'hésitez pas à m'aider à raccourcir cela, je pense qu'il y a beaucoup à faire.

Frozn
la source
1

Haskell (lambdabot) - 409 octets

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
la source
Veuillez ajouter tout le nécessaire imports, par exemple pour randomsà votre code (et le nombre d'octets). S'il y a un interpréteur qui importe par défaut, référez-vous-y dans le nom de la langue.
nimi