Вы можете помнить или не помнить 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
).Ответы:
HTML + CSS + JavaScript (ES6), 93 + 19 +
278276 = 388 байтисточник
X||Y
могут быть в гольфе,X|Y
чтобы сэкономить 2 байта.|
конечном итоге имеет приоритет над троичным выражением.|
и||
на несколько одинаковом уровне, и оба выше?:
. ОбаX||Y?w*r(cos(a)):0
иX||Y?h*r(sin(a)):0
в настоящее время находятся в формеboolean_condition?A:B
. Поэтому, когда вы переходитеX||Y
наX|Y
него, вы будете делать битовое ИЛИ, а затем снова интерпретировать его как логическое условие. ((X||Y)?A:B
против(X|Y)?A:B
, нетX|(Y?A:B)
). Кроме того , я не вижу никакой разницы , когда я использую «Копировать фрагмент кода , чтобы ответить» и изменить||
к|
. Насколько я могу судить, все по-прежнему работает точно так же ...Excel VBA, 630 байт
Объявленная подпрограмма рабочего листа, которая запускается по щелчку мыши, не требует ввода и создает пару глаз, которые следуют за курсором. Это зависит от включенной вспомогательной функции и объявления типа, которые должны быть помещены в обычный модуль.
Эта версия откалибрована для работы с масштабом по умолчанию 100%. Перерывы, если вы пытаетесь прокрутить.
Функция помощника и объявление типа
Ungolfed и комментируется
Эта версия откалибрована для работы с уровнем увеличения 400%.
Функция помощника и объявление типа
Выход
Gif
Более высокое разрешение изображения
источник
'
символ, вывод будет отличаться от того, когда он находится на крайнем левом символе'
. 2. Положение глаз не фиксировано. Щелчок мыши должен заставить их переместиться в положение щелчка. Я гибок в способе ввода (я бы принял, скажем, виртуальный курсор мыши, управляемый клавишами со стрелками), но есть два различных события ввода с различным поведением: движение мыши и щелчок мыши.Worksheet_SelectionChange
событие и пройти диапазон вызова (Target
илиT
в этом случае) - что перерисовывает глаза и a*
в вызове клеткаQBasic ( QB64 ),
361305 байтЛевый щелчок помещает глаза. Если размещение глаз приведет к тому, что часть глаз выйдет за пределы, программа «зависнет», пока не будет выполнено правильное размещение.
Основная сложная часть - это размещение учеников. В большинстве случаев координаты зрачка представляют собой только центр глаза плюс (знак (Δx), знак (Δy)), за исключением того, что в октантах 1 и 5 координата y равна y-центру, а в октантах 3 и 7, x-координата равна x-центру. Границы октанта можно рассчитать, используя наклон
m
линии от центра глаза до координат мыши. Удобно, когда деление на ноль при расчете наклона дает бесконечность с плавающей точкой (+/-), а не ошибку.Ungolfed
источник
?0
вместо?"0"
? Это говорит о том, что вы можете использовать как числовое выражение, так и строки."| |"
. Так что, вероятно, это ничего не спасет."0"
только на 2 байта больше.Машинный код 6502 ( мышь C64 + 1351 ), 630 байт
В бою:
Нет онлайн демо , извините, потому что есть AFAIK, нет эмулятора js C64, поддерживающего мышь. Если вы хотите попробовать это сами, возьмите VICE , загрузите исполняемый двоичный файл и запустите его в эмуляторе C64:
Чтобы получить / отменить ввод мыши в работающем эмуляторе, используйте
ctrl+m
в Unix / Linux иctrl+q
в Windows.Да, это должно было быть сделано;) В конце концов, это оригинальный Commodore мышь для C64, но, конечно же , встроенная операционная система не поддерживает, так что я первый нужен драйвер мыши, который уже взял 230 байт ( включая аппаратный спрайт в форме курсора мыши и код проверки границ для области экрана, но без перевода координат указателя в текстовые координаты экрана).
Если вам интересно, вы можете прочитать код как источник сборки здесь :)
источник
Чистый ,
1014904892884840814782772769 байт-6 байт, если глазам не нужно привязываться к сетке
Это было нелегко. Интерфейсы на функциональных языках редко бывают.
Убедитесь, что вы используете iTasks Clean, у вас
Courier
установлен шрифт иStdLib
ДО любых подпапокObjectIO
в пути поиска модуля.Компилировать с (например, может отличаться):
clm -IL StdLib -IL ObjectIO -IL "ObjectIO/OS <YOUR_OS_HERE>" -IL Dynamics -IL Generics -IL Platform -nci <MODULE_NAME_HERE>
Если вы никогда раньше не запускали Clean, ожидайте, что этот проект займет более 5 минут для компиляции.
Ungolfed:
Как вы можете видеть из версии без гольфа, большая часть кода просто устанавливает комбинацию «моноширинный шрифт» с «реагировать на мышь». И хотя
Courier
это не так просто сказать, это на самом деле рисует.
s и'
s. Обмениваясь чем-то вроде,Consolas
становится понятнее.источник
(abs m)<9&&(abs n)<w='9'
чтобы(abs m)<9&(abs n)<w='9'
? Кроме того, я предлагаю добавить экранный рисунок вместо скриншота.Рубин, 335 + 13 = 348 байт
+13 байт для
-rio/console
включения флагаIO#getch
.Содержит буквенные
0x1b
символы ESC ( ), как показано␛
ниже. xxd дамп следует.Внимание: это не убирает за собой на выходе. Смотрите примечание под дампом xxd ниже.
Ungolfed
Это довольно наивный гольф моей оригинальной реализации Ruby .
xxd dump
Эта программа включает отслеживание мыши с помощью последовательности управления xterm,
\e[?1003h
но не выключает ее при выходе. Чтобы отключить его, используйте последовательность управления\e[?1003l
, например:Так как программа съедает весь ввод, сложно выйти. Если вы хотите выйти, нажав Ctrl + C, добавьте следующую строку ниже
(s<<STDIN.getch
:Без дальнейших церемоний:
источник