Вдохновленный этим списком из руководства пользователя Commodore 64:
10 PRINT "{CLR/HOME}"
20 POKE 53280,7 : POKE 53281,13
30 X = 1 : Y = 1
40 DX = 1 : DY = 1
50 POKE 1024 + X + 40 * Y, 81
60 FOR T = 1 TO 10 : NEXT
70 POKE 1024 + X + 40 * Y, 32
80 X = X + DX
90 IF X <= 0 OR X >= 39 THEN DX = -DX
100 Y = Y + DY
110 IF Y <= 0 OR Y >= 24 THEN DY = -DY
120 GOTO 50
Создайте аналогичную программу на выбранном вами языке / платформе, чтобы отразить похожий на шарик объект вокруг вашего терминала, экрана, холста или другой области визуального отображения.
Вы не должны точно имитировать графику PETSCII C64, просто O
или o
подойдет, и вам не нужно использовать GOTO
команду, если она все еще существует на вашем языке. Пока ваш шар начинается сверху холста и движется по диагонали, пока не достигнет предела холста, а затем соответственно отскакивает, как показано ниже:
- Двигаясь вниз и вправо и ударяясь о нижнюю часть экрана, подпрыгивает и продолжает движение вправо;
- Путешествие вверх и вправо, попадание в крайнюю правую границу и отскок влево и вверх;
- Путешествие влево и вверх и удар по вершине, отскок влево и вниз;
- Путешествие налево и вниз и достигает самой левой границы, подпрыгивает направо и вниз;
- Бьет любой угол и меняет направление;
Тогда у нас все хорошо.
Вам также не нужно перемещать шарик на 8 пикселей одновременно, как это происходит в листинге BASIC на C64; вы можете перемещать один блок символов или один пиксель за раз, в зависимости от того, что вы считаете наиболее подходящим.
Чтобы увидеть этот листинг BASIC, вы можете ввести его с помощью этого онлайн-эмулятора Commodore 64, если ваш браузер поддерживает Flash.
Ответы:
6502 машинный код (C64),
908991 байт+2 байта, потому что для этого нужен адрес загрузки (не PIC из-за самостоятельной модификации)
Онлайн демо
Использование:
sys49152
Я изо всех сил старался уменьшить размер (например, НЕ используя IRQ для измерения времени, а вместо этого глупые пустые петли), все еще невозможно достичь уровня гольфового C64 BASIC от Titus : о, хорошо. Но выглядит менее мерцающим;)
Пояснение: (порок разборки)
Просто для удовольствия, вот более профессиональный вариант, использующий спрайт для мяча и мигающий границу при попадании в 385 байт (содержащий данные спрайта, которые используются на месте ):
Демонстрационная версия онлайн - | - источник ассемблера ca65
Запустите и остановите прыгающий мяч с помощью
sys49152
.$C000
, что требует копирования содержимого экрана и набора символов (шрифта).RUN/STOP + RESTORE
сломан, не пытайтесь.TI$
будет отставать.источник
inc $d020
болееjsr flash
;) hitshimselfwithalargetrout подмигнул изумительно!.prg
файла, и из моего мета-вопроса, который я здесь взял, я должен включить его ... возможно, мог бы пропустить его, если бы код был позиционно независимым.Утилиты Bash + Unix,
125117 байтАнимация пробного запуска:
источник
CP-1610 в сборе,
67…6462 DECLE = 78 байтЭтот код предназначен для запуска на Intellivision . Он использует один из своих аппаратных спрайтов, известный как MOB (для мобильного объекта).
Код операции CP-1610 кодируется 10-битным значением, известным как «DECLE». Длина этой программы составляет 62 DECLE, начиная с 4800 долларов США и заканчивая 483 долларами США.
Шестнадцатеричный дамп + источник
Выход
источник
HTML (Microsoft Edge / Internet Explorer), 81 байт
Представьте, что это 1998 год с этими вложенными
<marquee>
тегами:Протестировано в Microsoft Edge, хотя из того, что я читал, IE также должен поддерживать маркеры. Решительно не работает в Chrome.
Установка
direction=up
сохранит 2 байта, но нарушит правило, согласно которому мяч должен начинаться сверху холста.источник
direction
атрибут.marquee
, это довольно креативно!TI-BASIC,
7170Весьма буквальный перевод, я не удивлюсь, если есть хитрости, чтобы сделать его меньше.
Экран 16x8 и 1-индексированный, поэтому константы разные.
~
это SourceCoder способ написать символ отрицания.Это выглядит более гладко на оборудовании.
источник
Befunge, 209 байтов
Предполагается, что размер экрана составляет 80x25, но вы можете легко настроить диапазон, заменив
"O"
(79) в последней строке и*64
(24) во второй последней строке (обратите внимание, что вторая последняя строка выполняется справа налево). Скорость также можно отрегулировать, заменив"2"
(50) на последней строке.источник
Ява,
184176 байтЭто использует ANSI Escape-последовательности для перемещения курсора, который является объектом, который прыгает вокруг
85 x 25
дисплея терминала. Сохранить в файл с именемA.java
.Ungolfed
демонстрация
источник
Thread.sleep(50)
. И ваши игры в гольф и без игры не совпадают.Clojure,
398380375 байт-18 байт, изменив имя шрифта на пустую строку по умолчанию, вставив проверку границ и исправив проблему с нижней границей (которую вы можете увидеть в GIF). Исправление того, что фактически сохраненные байты.
-5 байт, изменив более лаконичный синтаксис деструктурирования и сократив шарик на пиксель.
Использует Quil .
Я пытался переключиться в функциональный режим, но это потребовало много дополнительного кода и оказалось дороже.
(Обратите внимание, что новая версия не отскакивает рано внизу экрана, как в GIF.)
источник
(+ 0 font-size)
там. Это смущает. Я исправлю это в следующей версии. Должно спасти меня как 5 байтов.Ракетка 247 байт
Ungolfed:
Выход:
источник
Желе, 37 байт
С некоторой помощью из этого ответа для получения правильного цикла и escape-символов. В настоящее время он отображается на экране размером 80x24, но его можно легко изменить в коде.
Координаты в каждом направлении могут быть представлены как элементы двух списков,
[0, 1,..., 24, 23,..., 1]
и[0, 1,..., 80, 79,..., 1]
, давайте назовем ихY
иX
которые бесконечно повторяются. Это бесконечное повторение можно эмулировать с помощью модульной индексации - с помощьюị
Jelly. Пример: вi
итерации мяч находится в положении(X[i%|X|], Y[i%|Y|]) = (iịY, iịX)
. Движущийся шарик - это просто курсор, который помещается в позицию, испускаяiịY
новые строки иiịX
пробелы.демонстрация
объяснение
источник
SmileBASIC,
8574 байтаПоложение шара можно смоделировать с помощью двух треугольных волн, и самый короткий способ, которым я смог найти их в SmileBASIC, был арксинус (синус (x)). (алгоритм с использованием MOD был длиннее, поскольку SB использует
MOD
вместо%
)источник
CSS / HTML, 200 + 7 = 207 байт
Эта версия показывает вам размер холста, а также дает анимации более пиксельное ощущение:
Показать фрагмент кода
источник
Dyalog APL, 44 байта
Объяснение:
{
...}⍨1 1
: вызвать данную функцию с ⍺ = ⍵ = 1 1⎕SM∘←0,G←⍺+⍵
: сохранить⍺+⍵
вG
, отобразить0
в этом месте в⎕SM
окне.⎕DL.1
: подождите 1/10 секунды⊃1 G∨.≥G⎕SD
: Проверка , еслиG
находится на⎕SM
границе окна (1≥G
илиG≥⎕SD
,⎕SD
это с Creen д imensions)1-2×
: Карта[1,0]
на[¯1,1]
, чтобы изменить направление движения⍵×
: умножить текущее направление движения наG∇
: рекурсия, пустьG
будет новое местоположение (⍺
) и⍵....
будет новое направление (⍵
).источник
PHP,
1129794103102 байтаотскакивает заглавную
O
в сетке 40х25, начиная с правого верхнего угла;печатает 99 строк, чтобы очистить экран.
Беги с
-nr
.A^K
=chr(10)
= новая строкаA^a
=chr(32)
= пробелисточник
for($d=$e=-1;;usleep(1e5))echo($r=str_repeat)(A^K,99),$r(A^a,$x+=$d*=$x%79?1:-1),O,$r(A^K,$y+=$e*=$y%24?1:-1);
, Модуль имеет значение false в 0 и N и меняет направление. К сожалению, мы должны инициализировать $ d и $ e в -1, но все же получить некоторую экономию.$x%79<=>.5
также работает для тех же байтов.Симонс Бейсик (C64),
6665 байтОдин байт сохранен благодаря @ShaunBebbers.
Мне нужна только одна строка, потому что Simons Basic имеет функцию по модулю.
На самом деле, для этого требуется физический C64 и модуль BASIC Симона
(или любое другое расширение BASIC, имеющее
mod
функцию).Введите следующие 69 символов:
{CLR}
это PETSCII 147, который очищает экран. Используйте Shift + CLR / HOME, чтобы ввести его.ByteCount
При сохранении на диск, он занимает 65 байт, так как команды лексемы:
for
,to
,poke
,abs
,next
иgoto
один байт каждый;mod
занимает два байта.Это составляет 59 байтов кода плюс 4 байта для указателей и 2 байта для номера строки.
Для справки см. Сопоставление C64 и поиск
$800
(основной текст программы).(Вы можете найти область памяти видеоэкрана на
$400
.)сломать
Программа зацикливается
I
от 0 до 623 (= LCM 48 и 78 минус 1). В петлеI
отображается на 39..0..38 соответственно на 24..0..23(как это делает оригинальная программа).
Когда цикл завершен, программа перезапускается, переходя к строке 0.
C64 BASIC,
7776 байтК сожалению, мне нужны две строки, потому что даже при всех возможных сокращениях потребуется 83 символа - слишком много, чтобы использовать редактор строк C64:
(Шестнадцатеричный редактор может быть использован для создания более длинной строки, которая будет составлять 73 байта.)
источник
:
и нет;
goto
в своейgoto
goto 0
$0400
в$07e7
; или использовать спрайты. Использование Kernal с$ffd2
(выходной аккумулятор) будет работать, так как вы можете достаточно легко установить X и Y pos на курсор (я не помню вызов этого), но вам, возможно, придется избегать позиции последнего символа в случае, если он вызывает перевод строки.Python 2,
176168 байтЭто предполагает размер терминала 80x24. Определенно не оптимально, но я новичок в гольфе, так что да.
Спасибо Р. Капу за предложение x% 79 <1 вместо x <1 или x> 79 и то же самое для y.
источник
x<1or x>78
сx%79<0
иy<1or y>22
сy%23<1
.Rebol / View,
284266 байтUngolfed:
источник
C 294 байта
Безголовая версия:
объяснение
graphics.h
в мой/usr/include
каталог. Поэтому я искал и это то, что я нашел. Это графическая реализация TurboC, использующая SDL для Linux. Можно также использовать OpenGL. В Windows, я думаю, он уже установлен, не уверен насчет MacOS.void initgraph(int *graphdriver, int *graphmode, char *pathtodriver);
инициализирует систему и переводит ее в графический режим, в этом случае графический драйвер определяется автоматически. Пожалуйста, обратитесь к этой ссылке для более подробной информации.x
иy
координаты, которые определяют положение мяча.a
иb
являются флагами,a
устанавливается в ноль, когдаx
значение опускается ниже 60, иb
устанавливается в ноль, когдаy
опускается ниже 60.x
иy
превышают граничные значения окна, и координаты соответственно корректируются.usleep
так, чтобы мой процессор не напрягался.closegraph()
звонок, чтобы закрыть окно. Но здесь этого не хватает.Должен быть скомпилирован с флагом компоновщика
-lgraph
На реальном оборудовании он работает более плавно. :)
источник
graphics.h
. Этот ответ askubuntu.com/questions/525051/… оказался полезным.MATL , 42 байта
Это использует экран 70 × 16 и символ
O
. Если вы подождете несколько отскоков, вы увидите, как мяч попадает в угол.Попробуйте в MATL Online!
Размер экрана можно легко изменить в коде. Соответствующая часть
8E70
, которая толкает8
, удваивает и толкает70
. Например, для экрана 80 × 25 замените на5W80
, который выталкивает5
, возводит его в квадрат и толкает80
(или заменяет на25 80
, но для этого требуется еще один байт).Кроме того, добавление
tD
в конце кода показывает текущую позицию в реальном времени (по вертикали, затем по горизонтали,1 1
вверху слева). Например, для80×18
экранаПопробуйте тоже!
объяснение
Это использует бесконечный цикл. Положение сохраняется в буфере обмена
H
как вектор 1 × 2, а направление сохраняется в буфере обменаI
как вектор 1 × 2 с записями1
или-1
.Каждая итерация очищает экран, определяет матрицу пробелов, записывает
O
в соответствующую позицию и отображает ее. Затем положение и направление должны быть обновлены.Положение на
1
основе, и, следовательно, края экрана1
и максимальный размер экрана. Таким образом, если размер экрана по модулю дает0
или1
в первом, или во втором компонентах, что означает, что мы достигли вертикального или горизонтального края соответственно, этот компонент вектора направления отрицается. После этого новое направление добавляется к текущей позиции, чтобы получить новую позицию.источник
Вот список ZX Spectrum.
источник
C + curses, 190 байт
Объяснение:
источник
Lua ( LÖVE 2D ), 130 байт
Lua - не лучший язык, когда дело доходит до кода гольфа, но вот, пожалуйста! Несколько моментов, которые стоит упомянуть:
Размер холста по умолчанию - 800 x 600. Его можно изменить в файле конфигурации, но я не увидел никаких ограничений по размеру, поэтому оставил его как есть.
love.draw()
это функция рисования LÖVE, и она имеет предопределенное имя. Альтернативные функции LÖVE, которые можно было бы использовать, были быlove.update(dt)
иlove.run()
- первая была бы длиннее в байтах, а вторая короче, да, но без встроенного бесконечного цикла. Таким образом,draw()
кажется, наш лучший выбор здесь.Выше версия использует
love.graphics.points
для рисования мяча. Хотя короче, я не уверен, что это разрешено. Вот GIF как он работает:Как вы можете видеть (или, возможно, не можете), на экране движется один пиксель. Хотя это экономит байты, это не самый удовлетворительный результат.
Итак, я сделал альтернативное 131-байтовое решение :
Этот использует
love.graphics.print
- который печатает текст - и0
как шар, делая его намного более заметным и привлекательным.источник
ЧИП-8,
363428 байтНикаких хитростей здесь ...
Требуется интерпретатор, который правильно рисует спрайты (в кадре может быть нарисован только один спрайт, что замедляет программу настолько, чтобы вы могли ее видеть).
Видео низкого качества
источник
ZX Spectrum BASIC - 179 байтов
Здесь это просто немного сжато. Это 179 байт с включённой графикой
источник
o
илиO
вы можете сохранить некоторые байты в символьном списке; Вы также можете редактировать предыдущие ответы, когда у вас есть улучшенные решения, вместо того, чтобы повторно отвечать на тот же вопрос