Вы можете помнить или не помнить Xeyes, демонстрационную программу, которая шла с (и, насколько я знаю, до сих пор поставляется) системой X Window. Его целью было нарисовать пару глаз, которые следовали за курсором мыши:
Ваша задача - воссоздать Xeyes с искусством ASCII. Напишите программу или функцию, которая рисует два художественных глаза ASCII (см. Ниже), где бы пользователь ни щелкал, а затем перемещал их зрачки так, чтобы они указывали в направлении курсора.
Приведенный выше GIF является записью этой неконтактной реализации Ruby , которую можно запустить с любой последней версией Ruby. Вы также можете найти его полезным в качестве справочного материала для управляющих последовательностей Xterm.
Характеристики
Это код-гольф , поэтому выигрывает решение с наименьшим количеством байтов.
Это ASCII-арт вызов, так что ваша программа должна сделать с помощью ASCII - символов, в частности, символы -
, .
, |
, '
, 0
, пробел и символ новой строки. 1 2
Это интерактивный вызов, поэтому ваша программа должна принимать входные данные и выводить их в режиме реального времени. 3
Прежде чем ваша программа начнет принимать ввод, она должна инициализировать пустой холст не менее 20 строк и 20 столбцов. Не следует ничего рисовать, пока пользователь не нажмет на холст.
Каждый раз, когда пользователь нажимает 4 на холсте, программа должна очистить любой предыдущий вывод и затем нарисовать эти глаза ASCII на холсте, центрируя по символу, ближайшему к месту расположения курсора мыши. 5 6 (Ниже ✧
представляет курсор мыши и не должен быть нарисован.)
.---. .---.
| | | |
| 0|✧|0 |
| | | |
'---' '---'
Обратите внимание, как зрачки «указывают» на курсор.
Каждый раз, когда курсор мыши перемещается по холсту, программа должна заново нарисовать зрачки, чтобы они продолжали указывать на курсор, например , 7
✧
.---. .---.
| 0| | 0|
| | | |
| | | |
'---' '---'
Ученик указывая
Предположим, что мы перечислили позиции внутренних девяти символов каждого глаза следующим образом:
.---.
|678|
|591|
|432|
'---'
Ученик будет нарисован в одном из мест 1
- 9
. Чтобы решить, какой из них, представьте, что символы квадратные и что холст представляет собой декартову сетку с центром 9
символа в (0, 0), центром 1
в (1, 0) и т. Д. Когда программа получает ввод - щелчок или движение - она должна сопоставить местоположение ввода с ближайшей координатой сетки 𝑀. Если 𝑀 равно (0, 0), зрачок должен быть нарисован в (0, 0), то есть в месте, указанном 9
выше. В противном случае его следует нарисовать, как описано ниже.
Представьте себе декартову плоскость, наложенную на сетку и разделенную на октанты с номерами 1 - 8 :
Если 𝑀 лежит в пределах октанта 1 , то зрачок должен быть нарисован в месте, 1
указанном выше, то есть в (1, 0). Если in находится в октанте 2, его следует нарисовать в 2
- и так далее. Чтобы проиллюстрировать, ниже изображение показывает часть сетки с цветовой кодировкой в соответствии с тем, где зрачок должен быть нарисован, когда курсор мыши находится в определенном месте. Когда, например, курсор находится в любой из зеленых координат (имея в виду, что координаты сетки лежат в центрах квадратов, а не в их углах), зрачок должен быть нарисован в 4
.
Зрачки двух глаз двигаются независимо, поэтому для каждого глаза повторите процесс с 𝑀 относительно центра этого глаза.
Заметки
Это не проблема графического вывода . Вывод должен быть сеткой символов. Вы можете, конечно, использовать графические процедуры для рисования сетки символов.
Пробелы могут быть нарисованы (или, скорее, не нарисованы), однако это удобно. Пустое место в сетке выглядит так же, как символ пробела, и будет считаться эквивалентным.
«В режиме реального времени» здесь определяется как расстояние менее 200 мс между входом и соответствующим выводом.
На ваше усмотрение, какие кнопки мыши используются для ввода, и является ли нажатие или отпускание «щелчком».
Холст должен быть очищен, или должен быть достигнут визуальный эквивалент. Например, в терминальном решении печать нового холста ниже предыдущего холста не считается эквивалентной.
Когда пользователь щелкает рядом с краем холста, так что некоторые из символов глаза будут нарисованы за его краем, поведение не определено. Тем не менее, программа должна продолжать работать в обычном режиме при последующих нажатиях.
Когда курсор мыши покидает «холст», поведение не определено, но программа должна продолжать работать в обычном режиме, когда курсор снова входит в холст.
Текстовый курсор может появиться на холсте, если он не скрывает вывод.
Стандартные лазейки запрещены.
<pre>
или font-family:monospace
).