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.
quelle
<pre>
oderfont-family:monospace
).Antworten:
HTML + CSS + JavaScript (ES6), 93 + 19 +
278276 = 388 Bytequelle
X||Y
können gespielt werdenX|Y
, um 2 Bytes zu sparen.|
hat Vorrang vor dem ternären Ausdruck.|
und||
auf etwas der gleichen Ebene, und beide oben?:
.. BeideX||Y?w*r(cos(a)):0
undX||Y?h*r(sin(a)):0
sind derzeit in der Formboolean_condition?A:B
. Wenn Sie also darauf umsteigenX||Y
,X|Y
wird ein bisschen ODER ausgeführt und dann wieder als boolesche Bedingung interpretiert. ((X||Y)?A:B
Vs(X|Y)?A:B
, nichtX|(Y?A:B)
). Auch ich sehe keinen Unterschied , wenn ich „Copy - Snippet zu beantworten“ und ändern Sie das||
zu|
. Soweit ich dasExcel VBA, 630 Bytes
Deklarierte Arbeitsblatt-Subroutine, die bei einem Mausklick ausgeführt wird, bei dem keine Eingabe erfolgt und ein Augenpaar erzeugt wird, das dem Cursor folgt. Dies hängt von der enthaltenen Hilfsfunktion und der Typdeklaration ab, die in einem normalen Modul abgelegt werden muss.
Diese Version ist so kalibriert, dass sie mit dem Standardzoom von 100% ausgeführt wird. Bricht ab, wenn Sie versuchen, einen Bildlauf durchzuführen.
Helferfunktion und Typdeklaration
Ungolfed und Kommentiert
Diese Version ist für eine Zoomstufe von 400% kalibriert.
Helferfunktion und Typdeklaration
Ausgabe
Gif
Bild mit höherer Auflösung
quelle
'
Zeichen ganz rechts, unterscheidet sich die Ausgabe von dem'
Zeichen ganz links . 2. Die Position der Augen ist nicht festgelegt. Ein Mausklick sollte dazu führen, dass sie sich an die angeklickte Position bewegen. Ich bin bei der Eingabemethode flexibel (ich würde beispielsweise einen virtuellen Mauszeiger akzeptieren, der mit den Pfeiltasten gesteuert wird), aber es gibt zwei unterschiedliche Eingabeereignisse mit unterschiedlichem Verhalten: Mausbewegung und Mausklick.Worksheet_SelectionChange
Ereignis ausgelöst und der Anrufbereich (Target
oderT
in diesem Fall) überschritten, wodurch die Augen und a*
im Anruf neu gezeichnet werden ZelleQBasic ( QB64 ),
361305 BytesLinksklick platziert die Augen. Wenn die Platzierung der Augen dazu führen würde, dass ein Teil der Augen außerhalb der Grenzen liegt, "friert" das Programm ein, bis eine gültige Platzierung vorgenommen wurde.
Der schwierigste Teil ist das Platzieren der Schüler. Meistens sind die Koordinaten der Pupille nur der Mittelpunkt des Auges plus (Vorzeichen (Δx), Vorzeichen (Δy)), außer dass in den Oktanten 1 und 5 die y-Koordinate gleich dem y-Zentrum ist und in den Oktanten In 3 und 7 ist die x-Koordinate gleich der x-Mitte. Oktantengrenzen können anhand der Neigung
m
der Linie vom Mittelpunkt des Auges zu den Mauskoordinaten berechnet werden . Wenn Sie bei der Berechnung der Steigung durch Null dividieren, erhalten Sie günstigerweise eine Gleitkomma-Unendlichkeit (+/-) und keinen Fehler.Ungolfed
quelle
?0
stattdessen verwenden?"0"
? Dies legt nahe, dass Sie sowohl einen numerischen Ausdruck als auch Zeichenfolgen verwenden können."| |"
. Also würde es wahrscheinlich nichts retten."0"
ist nur 2 Bytes länger.6502 Maschinencode (C64 + 1351 Maus ), 630 Bytes
In Aktion:
Keine Online-Demo , sorry, da es AFAIK no js C64 Emulator gibt, der eine Maus unterstützt. Wenn Sie es selbst ausprobieren möchten, greifen Sie zu VICE , laden Sie die ausführbare Binärdatei herunter und starten Sie sie im C64-Emulator:
Unter
ctrl+m
Unix / Linux undctrl+q
unter Windows können Sie die Mauseingabe im laufenden Emulator abrufen / entfernen .Ja, das musste gemacht werden;) Immerhin gibt es eine originale Commodore-Maus für den C64, aber das eingebaute Betriebssystem unterstützt sie natürlich nicht, so dass ich zuerst einen Maustreiber brauchte, der bereits 230 Bytes benötigte ( einschließlich eines Hardware-Sprites in Form eines Mauszeigers, der den Code für den Bildschirmbereich überprüft, ohne jedoch die Zeigerkoordinaten in Text-Bildschirmkoordinaten zu übersetzen).
Wenn Sie interessiert sind, können Sie den Code als Assembly-Quelle hier lesen :)
quelle
Sauber ,
1014904892884840814782772769 Bytes-6 Byte, wenn die Augen nicht an einem Raster ausgerichtet werden müssen
Das war nicht einfach. Benutzeroberflächen in funktionalen Sprachen sind selten.
Stellen Sie sicher, dass Sie iTasks Clean verwenden, die
Courier
Schriftart installiert haben undStdLib
VOR allen UnterordnernObjectIO
im Modul-Suchpfad.Kompilieren mit (Beispiel kann abweichen):
clm -IL StdLib -IL ObjectIO -IL "ObjectIO/OS <YOUR_OS_HERE>" -IL Dynamics -IL Generics -IL Platform -nci <MODULE_NAME_HERE>
Wenn Sie Clean noch nie zuvor ausgeführt haben, kann das Kompilieren dieses Projekts mehr als 5 Minuten dauern.
Ungolfed:
Wie Sie aus der ungolften Version ersehen können, besteht der größte Teil des Codes lediglich aus der Kombination von "monospaced font" und "reply to the mouse". Und obwohl
Courier
es nicht leicht zu sagen ist, zeichnet es tatsächlich das.
s und'
s. Das Wechseln zu so etwasConsolas
macht es klarer.quelle
(abs m)<9&&(abs n)<w='9'
zu(abs m)<9&(abs n)<w='9'
? Außerdem schlage ich vor, anstelle des Screenshots ein Screen-to-Gif hinzuzufügen .Ruby, 335 + 13 = 348 Bytes
+13 Bytes für das
-rio/console
zu aktivierende FlagIO#getch
.Enthält die unten
0x1b
gezeigten wörtlichen ESC ( ) -Zeichen␛
. xxd dump folgt.Achtung: Dies räumt beim Beenden nicht von selbst auf. Siehe Hinweis unter xxd dump unten.
Ungolfed
Dies ist ein ziemlich naiver Golf meiner ursprünglichen Ruby-Implementierung .
xxd dump
Dieses Programm aktiviert die Mausverfolgung mit der xterm-Steuersequenz, schaltet
\e[?1003h
sie jedoch beim Beenden nicht aus. Verwenden Sie zum Ausschalten die Steuersequenz\e[?1003l
, z.Da das Programm alle Eingaben aufnimmt, ist das Beenden schwierig. Wenn Sie den Vorgang mit Strg + C beenden möchten, fügen Sie die folgende Zeile hinzu
(s<<STDIN.getch
:Ohne weiteres:
quelle