Sie können sich vielleicht an Xeyes erinnern, ein Demo-Programm, das mit dem X-Window-System geliefert wurde (und meines Wissens immer noch mitgeliefert wird). Sein Zweck war es, ein Paar Augen zu zeichnen, die Ihrem Mauszeiger folgten:
Ihre Herausforderung ist es, Xeyes mit ASCII-Kunst neu zu erstellen. Schreiben Sie ein Programm oder eine Funktion, die zwei (unten angegebene) ASCII-Kunstaugen zeichnet, wo immer der Benutzer klickt, und bewegen Sie dann die Pupillen, um in Richtung des Cursors zu zeigen.
Das obige GIF ist eine Aufzeichnung dieser Ruby-Implementierung ohne Golf , die mit jeder neueren Version von Ruby ausgeführt werden kann. Sie können es auch als Referenz für Xterm-Steuersequenzen verwenden.
Spezifikationen
Das ist Code-Golf , also gewinnt die Lösung mit den wenigsten Bytes.
Dies ist eine ascii-art Herausforderung, so dass Ihr Programm ziehen muß ASCII - Zeichen mit spezifisch, die Zeichen -
, .
, |
, '
, 0
, Raum und Newline. 1 2
Dies ist eine interaktive Herausforderung, daher muss Ihr Programm Eingaben akzeptieren und die Ausgabe in Echtzeit zeichnen. 3
Bevor Ihr Programm Eingaben akzeptiert, sollte es eine leere Zeichenfläche von mindestens 20 Zeilen und 20 Spalten initialisieren. Es sollte nichts gezeichnet werden, bis der Benutzer auf die Zeichenfläche klickt.
Jedes Mal , wenn der Benutzer klickt auf 4 auf der Leinwand, sollte das Programm löscht alle vorherige Ausgabe und dann diese ASCII Augen auf der Leinwand zeichnen, zentrierte auf dem Charakter am nächsten an der Position des Mauszeigers. 5 6 (Stellt ✧
den Mauszeiger dar und sollte nicht gezeichnet werden.)
.---. .---.
| | | |
| 0|✧|0 |
| | | |
'---' '---'
Beachten Sie, wie die Pupillen auf den Cursor "zeigen".
Jedes Mal, wenn sich der Mauszeiger auf der Zeichenfläche bewegt, sollte das Programm die Pupillen neu zeichnen, so dass sie weiterhin auf den Cursor zeigen, 7 zB:
✧
.---. .---.
| 0| | 0|
| | | |
| | | |
'---' '---'
Schüler zeigen
Angenommen, wir haben die Positionen der inneren neun Zeichen jedes Auges folgendermaßen aufgelistet:
.---.
|678|
|591|
|432|
'---'
Der Schüler wird an einem der Orte gezogen 1
- 9
. Stellen Sie sich vor, die Zeichen seien quadratisch und die Zeichenfläche ein kartesisches Gitter mit der Mitte des 9
Zeichens bei (0, 0), der Mitte 1
bei (1, 0) und so weiter. Wenn das Programm Eingaben erhält - ein Klick oder eine Bewegung -, sollte es die Eingabeposition auf die nächste Gitterkoordinate abbilden 𝑀. Wenn 𝑀 (0, 0) ist, sollte die Pupille bei (0, 0) gezeichnet werden, dh an der Stelle von 9
oben. Ansonsten sollte wie unten beschrieben gezeichnet werden.
Stellen Sie sich eine kartesische Ebene vor, die über dem Gitter liegt und in Oktanten mit den Nummern 1 bis 8 unterteilt ist :
Wenn 𝑀 innerhalb von Oktant 1 liegt , sollte die Pupille an der Stelle von 1
oben gezeichnet werden , dh bei (1, 0). Wenn 𝑀 in Oktant 2 ist , sollte es um 2
- und so weiter gezeichnet werden . Zur Veranschaulichung zeigt das folgende Bild einen Teil des Rasters, der farblich gekennzeichnet ist, je nachdem, wo die Pupille gezeichnet werden soll, wenn sich der Mauszeiger an einer bestimmten Stelle befindet. Befindet sich der Cursor beispielsweise an einer der grünen Koordinaten (wobei zu beachten ist, dass die Gitterkoordinaten in den Mittelpunkten der Quadrate und nicht in ihren Ecken liegen), sollte die Pupille an gezeichnet werden 4
.
Die Pupillen der beiden Augen bewegen sich unabhängig voneinander. Wiederholen Sie den Vorgang für jedes Auge mit 𝑀 relativ zur Mitte des Auges.
Anmerkungen
Dies ist keine Herausforderung für die grafische Ausgabe . Die Ausgabe muss ein Zeichenraster sein. Sie können natürlich Grafikroutinen verwenden, um ein Zeichenraster zu zeichnen.
Leerzeichen können gezeichnet werden (oder eher nicht gezeichnet werden), dies ist jedoch zweckmäßig. Eine leere Stelle im Raster entspricht einem Leerzeichen und wird als gleichwertig betrachtet.
"Echtzeit" ist hier definiert als weniger als 200 ms zwischen dem Eingang und dem entsprechenden Ausgang, der gezogen wird.
Es liegt in Ihrem Ermessen, welche Maustasten für die Eingabe verwendet werden und ob ein Drücken oder Loslassen einen "Klick" darstellt.
Die Leinwand muss gelöscht werden, oder das visuelle Äquivalent muss erreicht werden. Bei einer terminalbasierten Lösung wird beispielsweise das Drucken einer neuen Zeichenfläche unter der vorherigen Zeichenfläche nicht als gleichwertig angesehen.
Wenn der Benutzer in der Nähe des Randes der Zeichenfläche klickt, sodass einige der Augenzeichen über den Rand hinaus gezeichnet werden, ist das Verhalten undefiniert. Bei nachfolgenden Klicks muss das Programm jedoch normal weiterlaufen.
Wenn der Mauszeiger die "Zeichenfläche" verlässt, ist das Verhalten undefiniert, das Programm muss jedoch normal weiterlaufen, wenn der Mauszeiger die Zeichenfläche erneut betritt.
Ein Textcursor wird möglicherweise auf der Zeichenfläche angezeigt, solange er die Ausgabe nicht verdeckt.
Standardlücken sind verboten.
<pre>
oder font-family:monospace
).