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!
1
commande n'arrête- t-elle pas la porte gauche à 75% dans votre exemple?Réponses:
Pyth,
156149145 octetsUne traduction directe de ma réponse Python .
Essayez-le en ligne!
Explication:
la source
Javascript (ES6),
277275263253250247234 octetsNon golfé et commenté
Démo
la source
112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ]
(nouvelles lignes après virgule et crochets)v^=(c-i-1?0:v&8||24)
pour vous faire économiser deux octets.Python 2,
377370361357345335326316312306304 octetsLe 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.Je suis presque certain que cela peut être approfondi.
Non golfé, avec commentaires:
41415 octets enregistrés grâce à @TheBikingViking!6 octets enregistrés grâce à @ValueInk!
la source
range(60)
pour[0]*60
.'p'[1::3]
(remplacer les apostrophes par des crochets) au lieu de''.join(map(str,p))
.(4,0)[q<0]==c[i]and q
->((4,0)[q<0]==c[i])*q
n
cette chaîne.n
est utilisé sur la ligne finale pour extraireclosing
,stopped
,opening
à partir de cette chaîne.Ruby,
263261260254 octetsComment la réponse de JavaScript est-elle devenue si courte ??? Il a dépassé le mien pendant mon absence et gagne toujours actuellement ...
la source
C,
420433424374 octetsN'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 ...
Ancienne version 1:
Ancienne version 2:
la source
PHP,
254247246245235230 230226 octetsbattre ES à nouveau!
golfé à partir de ces 311 (la première version complète, avait déjà un peu de golf):
panne
la source
Java 8 lambda, 500 caractères
J'ai fait de mon mieux, voici ce que j'ai trouvé:
Non golfé dans une classe complète:
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.
la source
Haskell (lambdabot) - 409 octets
la source
imports
, par exemple pourrandoms
à 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.