Potresti ricordare Xeyes, un programma demo fornito (e, per quanto ne so, ancora) con il sistema X Window. Il suo scopo era quello di disegnare un paio di occhi che seguivano il cursore del mouse:
La tua sfida è ricreare Xeyes con l'arte ASCII. Scrivi un programma o una funzione che disegna due occhi artistici ASCII (specificati di seguito) ovunque l'utente faccia clic e quindi sposta le proprie pupille verso la direzione del cursore.
La GIF sopra è una registrazione di questa implementazione Ruby non giocata a golf , che può essere eseguita con qualsiasi versione recente di Ruby. Potresti anche trovarlo utile come riferimento per le sequenze di controllo Xterm.
specificazioni
Questo è code-golf , quindi vince la soluzione con il minor numero di byte.
Si tratta di un ascii-art sfida, in modo che il programma deve disegnare utilizzando caratteri ASCII-specificamente, i personaggi -
, .
, |
, '
, 0
, spazio, e ritorno a capo. 1 2
Questa è una sfida interattiva , quindi il tuo programma deve accettare input e disegnare i suoi output in tempo reale. 3
Prima che il programma inizi ad accettare l'input, dovrebbe inizializzare un'area vuota di almeno 20 righe e 20 colonne. Non dovrebbe disegnare nulla fino a quando l'utente non fa clic sulla tela.
Ogni volta che l'utente fa clic su 4 nell'area di disegno, il programma dovrebbe cancellare qualsiasi output precedente e quindi disegnare questi occhi ASCII sull'area di disegno, centrati sul carattere più vicino alla posizione del cursore del mouse. 5 6 (Sotto, ✧
rappresenta il cursore del mouse e non deve essere disegnato.)
.---. .---.
| | | |
| 0|✧|0 |
| | | |
'---' '---'
Nota come gli alunni "puntano" verso il cursore.
Ogni volta che il cursore del mouse si sposta sulla tela, il programma dovrebbe ridisegnare le pupille in modo da continuare punta verso il cursore, 7 ad esempio:
✧
.---. .---.
| 0| | 0|
| | | |
| | | |
'---' '---'
Pupilla che punta
Supponiamo di aver elencato le posizioni dei nove personaggi interni di ciascun occhio in questo modo:
.---.
|678|
|591|
|432|
'---'
L'allievo verrà disegnato in una delle posizioni 1
- 9
. Per decidere quale, fingere che i caratteri siano quadrati e che la tela sia una griglia cartesiana, con il centro del 9
personaggio in (0, 0), il centro di 1
in (1, 0) e così via. Quando il programma riceve input - un clic o un movimento - dovrebbe mappare la posizione di input alla coordinata della griglia più vicina 𝑀. Se 𝑀 è (0, 0), l'alunno deve essere disegnato su (0, 0), ovvero la posizione di cui 9
sopra. Altrimenti, dovrebbe essere disegnato come descritto di seguito.
Immagina un piano cartesiano sovrapposto alla griglia e diviso in ottanti numerati 1 - 8 :
Se 𝑀 si trova all'interno dell'ottante 1 , la pupilla deve essere disegnata nella posizione 1
sopra, cioè in (1, 0). Se 𝑀 è nell'ottante 2 , dovrebbe essere disegnato su 2
—e così via. Per illustrare, l'immagine seguente mostra parte della griglia codificata a colori in base a dove deve essere disegnata la pupilla quando il cursore del mouse si trova in una posizione particolare. Quando, ad esempio, il cursore si trova su una delle coordinate verdi (tenendo presente che le coordinate della griglia si trovano nei centri dei quadrati, non nei loro angoli), si deve disegnare la pupilla 4
.
Le pupille dei due occhi si muovono indipendentemente, quindi per ciascun occhio ripetere il processo con 𝑀 rispetto al centro di quell'occhio.
Gli appunti
Questa non è una sfida di output grafico . L'output deve essere una griglia di caratteri. Ovviamente puoi usare le routine grafiche per disegnare una griglia di caratteri.
Gli spazi bianchi possono essere disegnati (o, piuttosto, non disegnati) tuttavia è conveniente. Un punto vuoto nella griglia ha lo stesso aspetto di uno spazio e sarà considerato equivalente.
"Tempo reale" è definito qui come meno di 200 ms tra l'ingresso e l'uscita corrispondente che viene disegnata.
È a tua discrezione quali pulsanti del mouse vengono osservati per l'input e se una pressione o un rilascio costituisce un "clic".
La tela deve essere cancellata o l'equivalente visivo deve essere raggiunto. Con una soluzione basata su terminali, ad esempio, la stampa di una nuova tela sotto la tela precedente non è considerata equivalente.
Quando l'utente fa clic vicino al bordo della tela in modo tale che alcuni dei personaggi dell'occhio vengano disegnati oltre il bordo, il comportamento non è definito. Tuttavia, il programma deve continuare a funzionare normalmente dopo i clic successivi.
Quando il cursore del mouse lascia la "tela", il comportamento non è definito, ma il programma deve continuare a funzionare normalmente quando il cursore rientra nella tela.
Un cursore di testo può apparire sulla tela, purché non oscuri l'output.
Sono vietate le scappatoie standard.
<pre>
O font-family:monospace
).