Vous pouvez vous souvenir ou non de Xeyes, un programme de démonstration fourni avec (et, autant que je sache, toujours livré avec) le système de fenêtre X. Son but était de dessiner une paire d'yeux qui suivaient le curseur de votre souris:
Votre défi est de recréer Xeyes avec de l'art ASCII. Ecrivez un programme ou une fonction qui dessine deux yeux de dessin ASCII (spécifiés ci-dessous) lorsque l'utilisateur clique dessus, puis déplace leurs élèves vers la direction du curseur.
Le fichier GIF ci-dessus est un enregistrement de cette implémentation de Ruby sans jeu , qui peut être exécutée avec n’importe quelle version récente de Ruby. Vous pouvez également le trouver utile comme référence pour les séquences de contrôle Xterm.
Caractéristiques
C'est du code-golf , donc la solution avec le moins d'octets gagne.
Ceci est un ascii-art défi, de sorte que votre programme doit dessiner en utilisant ASCII des caractères spécifiquement, les personnages -
, .
, |
, '
, 0
, l' espace, et retour à la ligne. 1 2
Il s’agit d’un défi interactif , votre programme doit donc accepter les entrées et en tirer les sorties en temps réel. 3
Avant que votre programme ne commence à accepter les entrées, il doit initialiser un canevas vierge d'au moins 20 lignes et 20 colonnes. Il ne faut rien dessiner tant que l'utilisateur n'a pas cliqué sur la toile.
Chaque fois que l'utilisateur clique sur 4 sur le canevas, le programme doit effacer toute sortie précédente, puis dessiner ces yeux ASCII sur le canevas, centrés sur le caractère le plus proche de l'emplacement du curseur de la souris. 5 6 (Ci-dessous, ✧
représente le curseur de la souris et ne doit pas être tracé.)
.---. .---.
| | | |
| 0|✧|0 |
| | | |
'---' '---'
Notez comment les élèves "pointent" vers le curseur.
Chaque fois que le curseur de la souris se déplace sur le canevas, le programme doit redessiner les pupilles pour qu’elles continuent de pointer vers le curseur, 7 par exemple:
✧
.---. .---.
| 0| | 0|
| | | |
| | | |
'---' '---'
Élève pointant
Supposons que nous énumérions les positions des neuf caractères internes de chaque œil comme ceci:
.---.
|678|
|591|
|432|
'---'
L'élève sera tiré à l'un des emplacements 1
- 9
. Pour décider lequel, supposez que les caractères sont carrés et que le canevas est une grille cartésienne, avec le centre du 9
caractère à (0, 0), le centre de 1
à (1, 0), etc. Lorsque le programme reçoit une entrée (un clic ou un mouvement), il doit mapper l'emplacement de l'entrée sur la coordonnée de grille la plus proche. Si 𝑀 est égal à (0, 0), l'élève doit être tracé à (0, 0), c'est-à-dire l'emplacement de ce qui 9
précède. Sinon, dessinez comme décrit ci-dessous.
Imaginons un plan cartésien superposé sur la grille et divisée en octants numérotée une - huit :
Si 𝑀 se situe dans l’octant 1 , la pupille doit être dessinée à l’emplacement 1
ci-dessus, c’est-à-dire à (1, 0). Si 𝑀 est en octant 2, il devrait être tracé à 2
- et ainsi de suite. Pour illustrer, l'image ci-dessous montre une partie de la grille codée par couleur en fonction du lieu où la pupille doit être dessinée lorsque le curseur de la souris se trouve à un emplacement particulier. Lorsque, par exemple, le curseur se trouve sur l’une des coordonnées vertes (en gardant à l’esprit que les coordonnées de la grille se situent au centre des carrés, et non à leurs angles), l’élève doit être tracé à 4
.
Les pupilles des deux yeux se déplacent indépendamment. Pour chaque œil, répétez le processus avec par rapport au centre de cet œil.
Remarques
Ce n'est pas un défi de sortie graphique . La sortie doit être une grille de caractères. Vous pouvez bien sûr utiliser des routines graphiques pour dessiner une grille de caractères.
Les espaces peuvent être dessinés (ou plutôt non dessinés) mais cela convient. Une place vide dans la grille ressemble à un caractère d'espacement et sera considérée comme équivalente.
"Temps réel" est défini ici comme moins de 200 ms entre l'entrée et la sortie correspondante en cours d'affichage.
Il est à votre discrétion de savoir quel (s) bouton (s) de souris sont observés pour la saisie et si appuyer ou relâcher constitue un "clic".
La toile doit être nettoyée ou l’équivalent visuel doit être atteint. Avec une solution basée sur un terminal, par exemple, imprimer une nouvelle toile en dessous de la toile précédente n'est pas considéré comme équivalent.
Lorsque l'utilisateur clique près du bord de la toile de sorte que certains des caractères oculaires soient dessinés au-delà de son bord, le comportement n'est pas défini. Toutefois, le programme doit continuer à s'exécuter normalement lors de clics ultérieurs.
Lorsque le curseur de la souris quitte le "canevas", le comportement n'est pas défini, mais le programme doit continuer à s'exécuter normalement lorsque le curseur entre à nouveau dans le canevas.
Un curseur de texte peut apparaître sur la toile tant qu'il n'obscurcit pas la sortie.
Les failles standard sont interdites.
la source
<pre>
oufont-family:monospace
).Réponses:
HTML + CSS + JavaScript (ES6), 93 + 19 +
278276 = 388 octetsla source
X||Y
peuvent être jouésX|Y
pour économiser 2 octets.|
finit par prévaloir sur l'expression ternaire.|
et||
sur un peu au même niveau, et au - dessus?:
.. Les deuxX||Y?w*r(cos(a)):0
etX||Y?h*r(sin(a)):0
sont actuellement sous formeboolean_condition?A:B
. Alors , quand vous changezX||Y
deX|Y
cela fera un sage bits ou puis interpréter comme une condition booléenne à nouveau. ((X||Y)?A:B
vs(X|Y)?A:B
, pasX|(Y?A:B)
). De plus, je ne vois aucune différence lorsque j'utilise "Copier un extrait de code pour répondre" et que je change||
en|
. Tout fonctionne toujours exactement de la même manière, pour autant que jeExcel VBA, 630 octets
Sous-routine déclarée de la feuille de calcul s’appuyant sur un clic de souris, qui ne prend aucune entrée et produit une paire d’œil qui suivent le curseur. Cela dépend de la fonction d'assistance incluse et de la déclaration de type, qui doivent être placées dans un module normal.
Cette version est calibrée pour fonctionner au zoom par défaut de 100%. Pause si vous essayez de faire défiler.
Fonction d'assistance et déclaration de type
Ungolfed and Commented
Cette version est calibrée pour fonctionner à un niveau de zoom de 400%.
Fonction d'assistance et déclaration de type
Sortie
Gif
Image de plus haute résolution
la source
'
caractère le plus à droite de la sortie sera différent de celui qui se trouve sur le'
caractère le plus à gauche . 2. La position des yeux n'est pas fixe. Un clic de souris devrait entraîner leur déplacement à la position cliquée. Je suis flexible sur la méthode de saisie (j'accepterais, par exemple, un curseur de souris virtuel contrôlé par les touches fléchées), mais il existe deux événements d'entrée distincts avec un comportement distinct: le mouvement et le clic de la souris.Worksheet_SelectionChange
événement et passera la plage d’appel (Target
ouT
dans ce cas) - ce qui redessine les yeux et un*
appel. cellulaireQBasic ( QB64 ),
361305 octetsUn clic gauche place les yeux. Si le placement des yeux entraîne une partie des yeux hors des limites, le programme "se fige" jusqu'à ce qu'un placement valide soit effectué.
La principale difficulté consiste à placer les élèves. La plupart du temps, les coordonnées de la pupille ne sont que le centre de l'œil plus (signe (Δx), signe (Δy)), sauf que dans les octants 1 et 5, la coordonnée y est égale au centre y, et en octants 3 et 7, la coordonnée x est égale au centre x. Les limites d'octant peuvent être calculées en utilisant la pente
m
de la ligne allant du centre de l'œil aux coordonnées de la souris. En divisant par zéro lors du calcul de la pente, l’infini en virgule flottante (+/-) est préférable à une erreur.Ungolfed
la source
?0
place de?"0"
? Cela suggère que vous pouvez utiliser une expression numérique ainsi que des chaînes."| |"
. Donc, cela ne sauverait probablement rien."0"
est seulement 2 octets de plus.6502 code machine ( souris C64 + 1351 ), 630 octets
En action:
Pas de démonstration en ligne , désolée, car il existe AFAIK aucun émulateur js C64 prenant en charge une souris. Si vous voulez l'essayer vous-même, prenez VICE , téléchargez le fichier exécutable binaire et démarrez-le dans l'émulateur C64:
Pour saisir / dé-saisir l’entrée de la souris dans l’émulateur en cours, utilisez
ctrl+m
sous Unix / Linux etctrl+q
Windows.Oui, cela devait être fait;) Après tout, il existe une souris Commodore originale pour le C64, mais bien sûr, le système d’exploitation intégré ne le supporte pas. J’avais donc besoin d’un pilote de souris, qui prenait déjà 230 octets ( y compris un sprite matériel en forme de curseur de souris et un code de vérification des limites pour la zone d’écran, mais sans traduire les coordonnées du pointeur en coordonnées d’écran de texte).
Si cela vous intéresse, vous pouvez lire le code en tant que source d'assemblage ici :)
la source
Propre ,
1014904892884840814782772769 octets-6 octets si les yeux n'ont pas besoin de se caler sur une grille
Ce n'était pas facile. Les interfaces dans les langages fonctionnels le sont rarement.
Assurez-vous que vous utilisez iTasks Clean, que la
Courier
police est installée etStdLib
qu'AVANT tous les sous-dossiers deObjectIO
dans le chemin de recherche du module.Compiler avec (exemple, peut différer):
clm -IL StdLib -IL ObjectIO -IL "ObjectIO/OS <YOUR_OS_HERE>" -IL Dynamics -IL Generics -IL Platform -nci <MODULE_NAME_HERE>
Si vous n'avez jamais exécuté Clean auparavant, attendez-vous à ce que la compilation du projet dure plus de 5 minutes.
Ungolfed:
Comme vous pouvez le constater à partir de la version non-lue, la majeure partie du code ne fait que configurer la combinaison de "police mono-espacée" avec "répondre à la souris". Et même si
Courier
cela ne facilite pas la tâche, cela dessine les.
s et'
s. Changer pour quelque chose commeConsolas
ça rend les choses plus claires.la source
(abs m)<9&&(abs n)<w='9'
de(abs m)<9&(abs n)<w='9'
? Aussi, je suggère d'ajouter un écran à gif au lieu d'une capture d'écran.Ruby, 335 + 13 = 348 octets
+13 octets pour le
-rio/console
drapeau à activerIO#getch
.Contient les caractères ESC (
0x1b
) littéraux , illustrés␛
ci-dessous. xxd dump suit.Attention: Cela ne nettoie pas après la sortie. Voir la note sous xxd dump ci-dessous.
Ungolfed
C'est un golf assez naïf de mon implémentation originale de Ruby .
xxd dump
Ce programme active le suivi de la souris avec la séquence de contrôle xterm
\e[?1003h
mais ne l'éteint pas à la sortie. Pour l'éteindre, utilisez la séquence de contrôle\e[?1003l
, par exemple:Comme le programme mange toutes les entrées, il est difficile de sortir. Si vous voulez pouvoir quitter en appuyant sur Ctrl + C, ajoutez la ligne suivante ci
(s<<STDIN.getch
- dessous :Sans plus tarder:
la source