Когда я рос, моей первой консольной игровой системой был Atari 2600, и я всегда буду любить некоторые из тех игр, которые мне так нравились в детстве. Многие из графики все еще запоминаются, возможно, даже культовые.
Оказывается, что эти спрайты являются очень упрощенными растровыми изображениями, шириной 8 пикселей с переменной высотой, где двоичное представление представляет собой расположение пикселей.
Например, шестнадцатеричные байты 0x18, 0x24, 0x18 нарисуют грубый круг, например:
0x18: 00011000
0x24: 00100100
0x18: 00011000
Поскольку 8 пикселей в ширину создают довольно маленькую графику (даже по стандартам Atari 2600), было принято удваивать или увеличивать в четыре раза либо высоту, ширину или и то и другое, чтобы создать увеличенную (хотя и более блочную и искаженную) версию одного и того же изображения. Они также обычно переворачиваются вертикально или горизонтально как для спрайтов игроков, так и для игровых полей. Игра Combat является хорошим примером этого.
Задача состоит в том, чтобы написать код для отображения этих спрайтов в виде «графики» в форме ASCII, включая возможность растягивать или переворачивать их по вертикали, горизонтали или обоим. Это должно быть в виде полной программы или вызываемой функции.
Входные данные:
- Массив байтов, каждый из которых представляет горизонтальные биты для этой строки.
- Ненулевое целочисленное значение для каждого направления, горизонтальное и вертикальное, представляющее коэффициент масштабирования для этого измерения.
- Отрицательное значение указывает, что измерение также должно быть перевернуто вдоль его оси.
Выход:
- Представление ASCII в STDOUT или строку, разделенную новой строкой, с использованием пробела для черных (0) пикселей и любого печатного непробельного символа по вашему выбору для белых (1) пикселей.
Тестовые данные:
bmp1 = [ 0x06, 0x0F, 0xF3, 0xFE, 0x0E, 0x04, 0x04, 0x1E, 0x3F, 0x7F, 0xE3, 0xC3, 0xC3, 0xC7, 0xFF, 0x3C, 0x08, 0x8F, 0xE1, 0x3F ]
bmp2 = [ 0x07, 0xFD, 0xA7 ]
bmp3 = [ 0x00, 0x8E, 0x84, 0xFF, 0xFF, 0x04, 0x0E, 0x00 ]
bmp4 = [ 0x00, 0xFC, 0xFC, 0x38, 0x3F, 0x38, 0xFC, 0xFC]
Примечание. Выше приведен пример входных массивов байтов в шестнадцатеричном формате. Если ваша платформа не принимает шестнадцатеричные литералы для представления байтов, вы можете преобразовать их в собственный эквивалентный байту литерал.
Пример вывода:
f( bmp1, 1, 1 ) =>
--------
XX
XXXX
XXXX XX
XXXXXXX
XXX
X
X
XXXX
XXXXXX
XXXXXXX
XXX XX
XX XX
XX XX
XX XXX
XXXXXXXX
XXXX
X
X XXXX
XXX X
XXXXXX
--------
f( bmp1, -2, 1 ) =>
----------------
XXXX
XXXXXXXX
XXXX XXXXXXXX
XXXXXXXXXXXXXX
XXXXXX
XX
XX
XXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXX XXXXXX
XXXX XXXX
XXXX XXXX
XXXXXX XXXX
XXXXXXXXXXXXXXXX
XXXXXXXX
XX
XXXXXXXX XX
XX XXXXXX
XXXXXXXXXXXX
----------------
f( bmp2, 1, 2 ) =>
--------
XXX
XXX
XXXXXX X
XXXXXX X
X X XXX
X X XXX
--------
f( bmp2, 2, 1 ) =>
----------------
XXXXXX
XXXXXXXXXXXX XX
XX XX XXXXXX
----------------
f( bmp2, -2, -2 ) =>
----------------
XXXXXX XX XX
XXXXXX XX XX
XX XXXXXXXXXXXX
XX XXXXXXXXXXXX
XXXXXX
XXXXXX
----------------
f( bmp3, 1, -1 ) =>
--------
XXX
X
XXXXXXXX
XXXXXXXX
X X
X XXX
--------
f( bmp3, 3, 3 ) =>
------------------------
XXX XXXXXXXXX
XXX XXXXXXXXX
XXX XXXXXXXXX
XXX XXX
XXX XXX
XXX XXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXX
XXX
XXX
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
------------------------
f( bmp4, -1, -1 ) =>
--------
XXXXXX
XXXXXX
XXX
XXXXXX
XXX
XXXXXX
XXXXXX
--------
f( bmp4, 4, 2 ) =>
--------------------------------
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
--------------------------------
Примечание: горизонтальные линии выше и ниже показывают начало и конец вывода. Они не требуются в выходных данных, однако требуются пустые строки (представленные всеми нулями / пробелами) в начале и / или конце, как показано.
Примечание 2: эти тестовые растровые изображения были вдохновлены и перерисованы / закодированы на основе игровых скриншотов, помеченных как «добросовестное использование» в Википедии.
Ответы:
Python 2 , 117 байт
Попробуйте онлайн!
источник
05AB1E ,
2726 байтПринимает входные данные в виде списка 8-битных двоичных строк и выводит их
1
как непробельный символ.-1 байт благодаря @MagicOctopusUrn .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
0‹i
...0‹
. У нас есть 1 байт для>=0
, то естьd
. Но у нас также должен быть 1 байт для проверки на наличие отрицательных значений. Теперь я просто использую0‹
илиd_
.„íR³²‚0‹Ï.V
(полный кодεε²Ä×}J³Äи0ð:}„íR³²‚0‹Ï.V˜»
), который не является улучшением, но избавляет от одной из этих негативных проверок.εS²Ä×J³Äи²0‹ií]³0‹iR}˜0ð:»
сохраняет байт. Если вы можете взять в 2D-массив, вы можете удалитьS
полностью для 25 байтов.S²Ä×
вместоε²Ä×}
. Благодарность! Хм, если нам разрешено принимать двоичные входы в виде списка 0 и 1, дополнительный байт можно сохранить, пропустивS
. Спросит у ОП, разрешено ли это. Мне нравится твой„íR³²‚0‹Ï.V
другой комментарий. :)MATL ,
2419 байтВходные данные представляют собой массив десятичных чисел, горизонтальный масштаб, вертикальный масштаб.
Попробуйте онлайн!
объяснение
источник
Dyalog APL,
464233 байтаПопробуйте онлайн!
-9 благодаря ngn!
источник
{' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⍺,⊂⍉⍵⊤⍨8/2]}
DFN -> Программы:' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⎕,⊂⍉⎕⊤⍨8/2]
' #'[⍉⊃{⊖⍣(0>⍺)⍉⍵/⍨|⍺}/⎕,⊂⎕⊤⍨8/2]
. Кстати, вывод для второго теста кажется обратным в вашем исходном решенииПролог (SWI) , 252 байта
Попробуйте онлайн!
объяснение
источник
Древесный уголь , 28 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Цикл по списку байтов.
Карта по вертикальному коэффициенту масштабирования, таким образом, умножая выходные строки.
Преобразуйте входные данные в базу 2, переверните их, сопоставьте цифры с пробелом, а
X
затем умножьте каждый символ на коэффициент горизонтального масштабирования.Если коэффициент горизонтального масштабирования был положительным, подумайте, чтобы снова получить правильное изображение.
Отразите вертикально, если коэффициент вертикального масштабирования был отрицательным.
источник
F
(For
) вместо¿
(If
) для проверок?else
подразумевается, так что я могу использовать только один раз,if
если это последний оператор в блоке.If
здесь будет на самом делеIf ... Else If ...
вместо двух свободныхIf
. Хм, приятно знать.C (лязг) , 120 байтов
Попробуйте онлайн!
источник
Common Lisp , 157 байт
Попробуйте онлайн!
объяснение
источник
Tcl , 192 байта
Попробуйте онлайн!
источник
Машинный код 8088, IBM PC DOS,
7771 байтСобранный:
Листинг:
В ASM это оказалось более унылым, чем я изначально думал. Многочисленные параллельные циклы и множество ветвлений if / else могут вызвать головную боль.
Это реализовано как MACRO, так как оно позволяет передавать функциональные параметры для тестирования.
Выход
Вот тестовая программа для DOS, которая запрашивает масштабный коэффициент X и Y и рисует на экране. Обратите внимание, что слишком большое масштабирование дракона будет прокручиваться за верх, так как окно DOS по умолчанию всего 24 строки.
А вот и наш маленький дракончик (утка):
Попробуйте онлайн!
Вы можете протестировать виртуальную машину DOS с помощью DOSBox или VirtualConsoles.com, выполнив следующие действия:
PLANE
,KEY
,TANK
илиDRAGON
.источник
Perl 5, 105 байт
TIO
Если вход должен быть шестнадцатеричным
126 байт
источник
Желе , 21 байт
Попробуйте онлайн!
Предполагается, что существует не более одного аргумента командной строки.
источник
APL (Dyalog Extended) , 23 байта SBCS
метод Дзаймы
⎕IO←0
Попробуйте онлайн!
{
…}/
Уменьшить справа налево, используя следующую анонимную лямбду:|⍺
величина левого аргумента (коэффициент масштабирования)⍵/⍨
используйте это, чтобы воспроизвести правильный аргумент по горизонтали⍉
транспонирования⊖⍣(
...)
перевернуть, если:>⍺
коэффициент масштабирования меньше нуля⊃
раскрыть (поскольку сокращение включено, чтобы уменьшить ранг тензора с 1 до 0)' x'⊇⍨
выбрать элементы из строки "x", используя эту матрицуисточник
Рубин , 89 байт
Попробуйте онлайн!
источник
T-SQL, 216 байт
Перед выполнением этого MS-SQL Studio Management нажмите CRTL-t, чтобы отобразить данные в виде текста. Высота не может быть отрегулирована так, чтобы превышать количество элементов на входе.
Из-за ужасной реализации STRING_AGG переменная высоты будет работать только в MSSM. MS должен был сделать третий необязательный параметр, чтобы включить порядок сцепляемых элементов.
Онлайн-версия может поддерживать только настройку ширины. Высота приведет к броскому результату с несколькими формами укладки.
Этот скрипт не будет отображать правильные фигуры в онлайн-версии, поэтому я внес некоторые незначительные корректировки, чтобы компенсировать это. Попробуйте онлайн
источник