Você pode ou não se lembrar do Xeyes, um programa de demonstração que acompanha (e, até onde eu sei, ainda acompanha) o sistema X window. Seu objetivo era desenhar um par de olhos que seguiam o cursor do mouse:
Seu desafio é recriar Xeyes com arte ASCII. Escreva um programa ou função que desenhe dois olhos artísticos ASCII (especificados abaixo) onde o usuário clica e depois move as pupilas para apontar na direção do cursor.
O GIF acima é uma gravação dessa implementação Ruby sem golf , que pode ser executada com qualquer versão recente do Ruby. Você também pode achar útil como referência para seqüências de controle do Xterm.
Especificações
Isso é código-golfe , então a solução com o menor número de bytes vence.
Este é um ascii-art desafio, assim que seu programa deve desenhar usando caracteres ASCII, especificamente, os personagens -
, .
, |
, '
, 0
, espaço, e de nova linha. 1 2
Este é um desafio interativo , portanto, seu programa deve aceitar entradas e extrair suas saídas em tempo real. 3
Antes de seu programa começar a aceitar entrada, ele deve inicializar uma tela em branco de pelo menos 20 linhas e 20 colunas. Não deve desenhar nada até o usuário clicar na tela.
Sempre que o usuário clicar em 4 na tela, o programa deverá limpar qualquer saída anterior e, em seguida, desenhar esses olhos ASCII na tela, centralizados no caractere mais próximo da localização do cursor do mouse. 5 6 (Abaixo, ✧
representa o cursor do mouse e não deve ser desenhado.)
.---. .---.
| | | |
| 0|✧|0 |
| | | |
'---' '---'
Observe como as pupilas "apontam" em direção ao cursor.
Sempre que o cursor do mouse se move sobre a tela, o programa deve redesenhar os alunos para que continuem apontando em direção ao cursor, 7 por exemplo:
✧
.---. .---.
| 0| | 0|
| | | |
| | | |
'---' '---'
Aluno apontando
Suponha que enumeremos as posições dos nove caracteres internos de cada olho da seguinte maneira:
.---.
|678|
|591|
|432|
'---'
O aluno será sorteado em um dos locais 1
- 9
. Para decidir qual, finja que os caracteres são quadrados e que a tela é uma grade cartesiana, com o centro do 9
caractere em (0, 0), o centro de 1
em (1, 0) e assim por diante. Quando o programa recebe entrada - um clique ou movimento - ele deve mapear o local de entrada para a coordenada da grade mais próxima 𝑀. Se 𝑀 for (0, 0), o aluno deve ser desenhado em (0, 0), ou seja, o local 9
acima. Caso contrário, ele deve ser desenhado conforme descrito abaixo.
Imagine um plano cartesiano sobreposta no grid e dividido em oitantes numerada 1 - 8 :
Se 𝑀 estiver dentro de 1 de outubro , então a pupila deve ser desenhada no local 1
acima, ou seja, em (1, 0). Se 𝑀 estiver em 2 de outubro, ele deve ser desenhado em 2
- e assim por diante. Para ilustrar, a imagem abaixo mostra parte da grade codificada por cores de acordo com o local em que a pupila deve ser desenhada quando o cursor do mouse estiver em um local específico. Quando, por exemplo, o cursor estiver em qualquer uma das coordenadas verdes (lembrando que as coordenadas da grade estão no centro dos quadrados, não nos cantos), o aluno deve ser desenhado 4
.
As pupilas dos dois olhos se movem independentemente, portanto, para cada olho, repita o processo com 𝑀 em relação ao centro desse olho.
Notas
Este não é um desafio de saída gráfica . A saída deve ser uma grade de caracteres. Obviamente, você pode usar rotinas gráficas para desenhar uma grade de caracteres.
O espaço em branco pode ser desenhado (ou melhor, não desenhado), no entanto, é conveniente. Um ponto vazio na grade é igual a um caractere de espaço e será considerado equivalente.
"Tempo real" é definido aqui como menos de 200ms entre a entrada e a saída correspondente que está sendo desenhada.
É a seu critério quais botões do mouse são observados para entrada e se uma pressão ou liberação constitui um "clique".
A tela deve ser limpa ou o equivalente visual deve ser alcançado. Com uma solução baseada em terminal, por exemplo, imprimir uma nova tela abaixo da tela anterior não é considerado equivalente.
Quando o usuário clica perto da borda da tela, de modo que alguns dos caracteres oculares sejam desenhados além da borda, o comportamento é indefinido. No entanto, o programa deve continuar sendo executado normalmente nos cliques subsequentes.
Quando o cursor do mouse sai da "tela", o comportamento é indefinido, mas o programa deve continuar sendo executado normalmente quando o cursor entra novamente na tela.
Um cursor de texto pode aparecer na tela, desde que não oculte a saída.
As brechas padrão são proibidas.
<pre>
ou font-family:monospace
).