Vous vivez à l'intérieur d'un terminal de 80 caractères de large. Vous vous ennuyez, vous décidez donc de jouer aux dominos. Non, pas le genre ennuyeux qui ressemble au Scrabble, le genre amusant où vous passez une heure à les fixer pour les regarder tomber en une seconde.
Dans les terminaux, les dominos ressemblent à ceci:
| upright domino
\ left-tilted domino
/ right-tilted domino
__ fallen domino
Comme nous le savons tous, si un domino incliné touche un montant, le deuxième domino est également incliné. La seule exception à cela est que si deux dominos inclinés le touchent:
|\ --> \\ /| --> // /|\ --> /|\
Ajustez la constante gravitationnelle de votre terminal pour que cette transition prenne 100 ms.
Si un domino incliné est soutenu par un autre domino ou les murs du terminal, son voyage se termine.
Aucun des dominos inclinés dans
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
(80 caractères) se déplacera, car les deux dominos inclinés les plus à l'extérieur sont supportés par les murs du terminal et tous les autres sont supportés par d'autres dominos.
Cependant, si l'espace dans le sens de l'inclinaison est vide, le domino tombe:
| \\ --> |__\ // | --> /__|
Terminal. Constante gravitationnelle. Tu obtiens le point…
Enfin, il y a un léger vent de gauche, donc les dominos inclinés à droite tombent plus vite que les dominos inclinés à gauche:
|/ \| --> |__\|
Tâche
Écrivez un programme / une fonction qui montre une animation de jouer aux dominos dans un terminal.
Votre code doit effectuer les opérations suivantes:
Lire une chaîne d'entrée, représentant l'état initial des dominos.
Cette chaîne ne contiendra pas plus de 80 caractères et se composera uniquement des dominos décrits ci-dessus et des espaces vides.
Imprimez l'état et attendez 100 ms.
Transformez l'état comme expliqué ci-dessus.
Si l'état a changé, revenez à 2.
Règles supplémentaires
La longueur de la chaîne d'entrée n'affecte pas la largeur du terminal; même si la chaîne est inférieure à 80 caractères, les murs du terminal sont toujours séparés de 80 caractères.
Chaque fois que l'étape 2 est exécutée, l'état doit être imprimé au même emplacement, écrasant l'état précédent.
Étant donné que certaines langues sont incapables d'attendre exactement 100 ms, n'hésitez pas à attendre n'importe quelle quantité entre 50 et 1000 ms.
Les règles de code-golf standard s'appliquent.
Exemples
Pour l'état initial
||\/||
imprimer ce qui suit (l'un sur l'autre):
||\/|| |\\//| \\\/// __\\//__
Pour l'état initial
/||||\
imprimer ce qui suit
/||||\ //||\\ ///\\\
Pour l'état initial
/|||\
imprimer ce qui suit
/|||\ //|\\
Pour l'état initial
|/ \|/ \|/ \|/ \|
imprimer ce qui suit:
|__\|__\|__\|__\|
Pour l'état initial (80 caractères)
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
imprimer ce qui suit
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
/
ou/|
et vous verrez que la tuile ne tombe pas complètement comme il se doit.\033
par un octet ESC littéral, économisant 3 octets.Perl 5,
154146J'ai dû utiliser un caractère temporaire pour maintenir l'état entre 2 regex.
Pour faire face au risque que quelque chose comme / | | | \ finirait par / / / \ \ au lieu de / / | \ \.
Tester
la source
s, \\|/ ,__,g
au lieu des/ \\|\/ /__/g
.ES6 ,
220218195 195 octetsMinified
Plus lisible
la source
() = > {
et}()
peut simplement être supprimé de votre code. 2. Je ne pense pas que les boîtes d'alerte soient un format de sortie acceptable pour une animation. Vous pouvez soit intégrer votre JS en HTML, soit apporter la modification requise pour que cela fonctionne à partir de la ligne de commande. 3. Dans les deux cas, votre code doit attendre env. 100 ms entre l'impression d'un état et le suivant.console.log("^[c"+d)
place, où se^[
trouve le caractère ESC (un octet)..replace
en[R='replace']
, puis chaque suivant en[R]
, cela réduira un peu. Vous pouvez également enregistrer quelques octets en utilisantsetTimeout(f,100,d)
à la place de la configuration actuelle.C #, 335 octets
Pas un grand choix de langue.
J'ai abusé du délai autorisé entre 50 et 1000 pour sélectionner un nombre à deux chiffres.
Nouvelles lignes et indentation ajoutées pour plus de clarté:
la source
PHP, 175 octets
Non minifié:
Golf regex fondamentalement. Aplatit d'abord tous les dominos tombants qui ont de l'espace (et en raison de l'ordre de correspondance de gauche à droite, le «vent» souffle). Vient ensuite la partie laide (maudissez-vous des barres obliques!)
/|\
, puis sautez-le.(/)|
et remplacez par//
|(\)
et remplacez par\\
Cela fait tomber les dominos. Enfin, attendez 100 ms pour la prochaine étape.
L'utilisation
()
comme délimiteurs sur l'expression régulière signifie que les/
s n'ont pas besoin de s'échapper, ce qui aide très peu!la source
Coque POSIX + sed, 144
C'est en deux parties. Le travail principal de renversement des dominos est le
sed
remplacement de modèle standard , accumulant des lignes dans l'espace de cale. Nous nous transformons temporairement/|\
en/:\
pour le protéger, récupérant à la fin.Puisque
sed
il n'y a aucun moyen d'insérer des retards (j'ai cherché dans terminfo / termcap, mais je n'ai pas trouvé de moyen standard), j'encapsule chaque ligneprintf "...\r"; sleep .1
pour imprimer une ligne toutes les 100 ms. En fait, je le fais d'abord, lorsque nous n'avons qu'une seule ligne, car les caractères de la commande ne seront touchés par aucune des substitutions de basculement.Tous testés en utilisant
dash
et GNUcoreutils
, avecPOSIXLY_CORRECT
ensemble dans l'environnement.la source