Ce défi est inspiré de cette réponse sur Ask Ubuntu Stack Exchange.
Intro
Rappelez-vous l' économiseur d'écran Windows ME avec les tuyaux ? Il est temps de ramener la nostalgie!
Défi
Vous devez écrire un programme ou une fonction qui produira une représentation ASCII de l'économiseur d'écran. Dans l'économiseur d'écran, il devrait y avoir un seul tuyau qui se développera dans des directions semi-aléatoires.
Le début du tuyau sera placé au hasard sur l'une des bordures de l'écran et le morceau de tuyau doit être perpendiculaire à la bordure (les premiers tuyaux d'angle peuvent être horizontaux ou verticaux). À chaque tique, le tuyau se développera dans la direction à laquelle il fait face (horizontal / vertical) 80%
ou prendra un coin au 20%
hasard.
Représentation des tuyaux
Pour créer la pipe, 6 caractères Unicode seront utilisés
─ \u2500 horizontal pipe
│ \u2502 vertical pipe
┌ \u250C upper left corner pipe
┐ \u2510 upper right corner pipe
└ \u2514 lower left corner pipe
┘ \u2518 lower right corner pipe
Contribution
Le programme / la fonction prendra 3 valeurs d'entrée, qui peuvent être rassemblées via les paramètres de fonction ou demandées à l'utilisateur.
- Nombre de ticks
- Largeur de l'écran
- Hauteur de l'écran
Nombre de ticks
Pour chaque tick, un morceau de pipe sera ajouté à l'écran. Les tuyaux remplaceront les vieux morceaux de tuyaux s'ils apparaissent à la même position.
Par exemple, prenez un écran de taille 3x3
ticks == 3
─┐
┘
ticks == 4
─┐
└┘
ticks == 5
│┐
└┘
Chaque fois qu'un tuyau quitte l'écran, comme dans le dernier exemple à 5 ticks, un nouveau tuyau apparaîtra à une bordure aléatoire. Par exemple:
ticks == 6
│┐
└┘
─
Le nouveau tuyau devrait avoir 50% de chances d'être horizontal ou vertical.
Largeur / hauteur de l'écran
La largeur et la hauteur de l'écran peuvent être combinées en une seule valeur si cela est préférable dans la langue de votre choix. La largeur et la hauteur de l'écran auront toujours une valeur minimale de 1 et une valeur maximale de 255. Si la langue de votre choix prend en charge une console ou un écran de sortie qui est plus petit qu'une grille de 255x255 caractères, vous pouvez supposer que la largeur et la hauteur seront ne dépassez jamais les limites de votre console. (Exemple: fenêtre Windows 80x25 cmd)
Production
La sortie de votre programme / fonction doit être imprimée à l'écran ou renvoyée par une fonction. Pour chaque exécution de votre programme, un ensemble différent de canaux doit être généré.
Cas de test
Les cas de test suivants sont tous des exemples aléatoires de sorties valides
f(4, 3, 3)
│
─┘
│
f(5, 3, 3)
│
─┘┌
│
f(6, 3, 3)
─│
─┘┌
│
f(7, 3, 3)
──
─┘┌
│
De toute évidence, plus il y a de tiques, plus il devient difficile de prouver la validité de votre programme. Par conséquent, la publication d'un gif de votre sortie en cours d'exécution sera préférée. Si cela n'est pas possible, veuillez publier une version de votre code qui comprend l'impression de la sortie. De toute évidence, cela ne comptera pas dans votre score.
Règles
- Ceci est le code-golf , le plus petit nombre d'octets gagne
- Des échappatoires standard s'appliquent
- Si vous utilisez les caractères de canal unicode dans votre code source, vous pouvez les compter comme un seul octet
C'est un défi assez difficile qui peut éventuellement être résolu de nombreuses manières créatives, vous êtes encouragé à écrire une réponse dans une langue plus verbeuse même s'il existe déjà des réponses dans de courts esolangs. Cela créera un catalogue des réponses les plus courtes par langue. Upvotes bonus pour les gifs colorés fantaisie;)
Bon golf!
Avertissement: je suis conscient que les caractères Unicode ne sont pas ASCII, mais en l'absence d'un meilleur nom, je l'appelle simplement de l'art ASCII. Les suggestions sont les bienvenues :)
ascii-art
au lieu degraphical-output
- référenceRéponses:
JavaScript (ES6), 264
266 274 281Compter les caractères de dessin Unicode comme 1 octet chacun. (Comme spécifié par OP)
Moins golfé
Test animé
Remarque: en essayant de garder le temps d'animation sous 30 secondes, plus d'épaisseurs accélèrent le rythme de l'animation
la source
Rien ne dit autant de nostalgie ...
QBasic, 332 octets
QBasic est le bon langage pour la tâche car:
LOCATE
vous permet d'imprimer à n'importe quel endroit de l'écran, en remplaçant ce qui s'y trouvait auparavantDétails
Il s'agit de golf QBasic, écrit et testé sur QB64 avec la mise en forme automatique désactivée. Si vous tapez / coller dans l'QBasic IDE réel, il ajoutera un tas d'espaces et d' élargir
?
dansPRINT
, mais il devrait fonctionner exactement la même chose.Le programme entre trois valeurs séparées par des virgules: les graduations, la largeur et la hauteur. Il demande ensuite une graine de nombre aléatoire. (Si ce comportement n'est pas acceptable, remplacez la deuxième ligne
RANDOMIZE TIMER
par +6 octets.) Enfin, il dessine les canaux à l'écran.Les dimensions maximales pouvant être saisies sont 80 (largeur) par 25 (hauteur). Si vous donnez une hauteur de 25, la ligne du bas sera coupée lorsque QBasic dit «Appuyez sur n'importe quelle touche pour continuer».
Comment?
TL; DR: Beaucoup de mathématiques.
La ligne et la colonne actuelles sont
r
etc
; la direction actuelle estd
et la direction précédente estb
. Les valeurs de direction 0-3 sont en bas, à droite, en haut, à gauche. L'arithmétique traduit ces valeurs en valeurs de pas correctes pourr
etc
, ainsi que les coordonnées de bord correctes pour commencer.Les caractères de dessin de boîte
│┐└─┘┌
sont les points de code 179, 191, 192, 196, 217 et 218 dans QBasic. Celles-ci semblent assez aléatoires, mais il a toujours utilisé moins de caractères pour générer les nombres avec des mathématiques (assez compliquées, je ne suis pas sûr-même-je-comprends-le) que de faire un tas d'instructions conditionnelles.Le code de changement de direction génère un nombre aléatoire compris entre -0,125 et 1,125 et prend sa parole. Cela donne
-1
10% du temps,0
80% du temps et1
10% du temps. Nous ajoutons ensuite cela à la valeur actuelle ded
, mod 4. L'ajout de 0 conserve la direction actuelle; l'ajout de +/- 1 fait un tour.Quant au flux de contrôle,
WHILE t ... WEND
c'est la boucle principale; la section qui la précède, en commençant par le numéro de ligne1
(1b=INT(RND*4)
), redémarre le tuyau à un bord aléatoire. Chaque foisr
etc
sont à l'extérieur de la fenêtre, nousGOTO 1
.Montrez-moi le GIF!
Voici:
Cela a été généré par une version quelque peu non golfée avec animation, couleur et une graine aléatoire automatique:
la source
Python 2.7,
624616569548552 octetsLe premier paramètre est une graine, les mêmes graines généreront la même sortie, imprimant chaque étape avec un retard de 500 ms.
le replacer
Exemple d'exécution
affichera
version verbeuse
la source
if x*y<0 or
.0.5
peut être réduit à.5
.import *
pourrait êtreimport*
.''.join(k) for
a un espace blanc inutile. Vous devriez également pouvoir conserverdict
une variable et l'appeler chaque fois que vous l'utilisez. Je n'ai pas testé combien cela économise, mais en enregistrant ledict(zip(a,b))
dans un lambda qui fait le travail pour deux chaînes (a, b), il devrait en couper. +1.C (GCC / Linux),
402353352302300298296288 bytesCrédit à edc65 pour avoir enregistré la direction dans un seul numéro à 4 bits.
Lit une largeur / hauteur sur stdin avant de boucler l'économiseur d'écran pour toujours. Par exemple:
Ou pour un économiseur d'écran plein écran:
Pour plus de lisibilité, j'ai ajouté des nouvelles lignes. Nécessite une machine Linux avec un terminal respectant les codes ANSI. A des couleurs! Si vous supprimez la prise en charge des couleurs, cela coûte 17 octets de moins.
la source
Rubis,
413403396 octetsUne fonction qui prend un certain nombre de graduations et une largeur en entrée et renvoie l'écran final sous forme de chaîne. Pourrait sans doute être plus joué au golf.
Voir sur repl.it: https://repl.it/Db5h/4
Pour le voir en action, insérez ce qui suit après la ligne qui commence
b[n*w+n+m]=
:... puis affectez le lambda à une variable par exemple
pipes=->...
et appelez-le commepipes[100,20]
(pour 100 ticks et un écran 20x20).Non golfé et explication
la source