Ви можете або не пам'ятаєте Xeyes, демонстраційну програму, яка поставляється з (і, наскільки я знаю, все ще поставляється з) віконною системою X. Його метою було намалювати пару очей, які слідкували за курсором миші:
Ваше завдання - відтворити 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). Якщо 𝑀 в октанті 2, його слід намалювати на 2
—і так далі. Для ілюстрації, на зображенні нижче показана частина сітки, кодована кольором відповідно до того, де слід намалювати зіницю, коли курсор миші знаходиться в певному місці. Наприклад, коли курсор знаходиться на будь-якій із зелених координат (маючи на увазі, що координати сітки лежать у центрах квадратів, а не в їхніх кутах), учень повинен бути намальований у 4
.
Зіниці двох очей рухаються незалежно, тому для кожного ока повторіть процес з 𝑀 відносно центру цього ока.
Примітки
Це не є завданням графічного виводу . Вихід повинен бути сіткою символів. Звичайно, ви можете використовувати графічні підпрограми для малювання сітки символів.
Білий простір може бути намальований (а точніше, не намальований), проте це зручно. Порожнє місце в сітці виглядає так само, як пробіл і вважатиметься рівнозначним.
"Реальний час" визначається тут як менший за 200 мс між входом та відповідним висновком, що проводиться.
На ваш розсуд, які кнопки (ми) миші спостерігаються для введення, і чи натискання чи випуск є "клацанням".
Полотно повинно бути очищено, або візуальний еквівалент повинен бути досягнутий. Наприклад, на базі термінального рішення, друк нового полотна нижче попереднього полотна не вважається еквівалентом.
Коли користувач клацає біля краю полотна таким чином, що частина очей символів буде виведена за його край, поведінка не визначена. Однак програма повинна продовжувати працювати нормально після наступних клацань.
Коли курсор миші залишає "полотно", поведінка не визначена, але програма повинна продовжувати працювати нормально, коли курсор знову потрапляє на полотно.
Текстовий курсор може з’являтися на полотні, доки він не затьмарює вихід.
Стандартні лазівки заборонені.
<pre>
або font-family:monospace
).