Я надеюсь, что эта картина вам знакома.
Это один из призраков Пакмана в его «уязвимом» состоянии после того, как Пакман съел пилюлю.
Соревнование
Изобразите нашего призрака в маленькой рамке, используя искусство ASCII. При нормальном масштабе (подробнее об этом позже) каждый квадрат на изображении выше должен соответствовать одному символу, а рамка должна иметь разделение на один символ вверх и вниз и разделение на два символа слева и справа от призрака :
####################
# #
# #### #
# ######## #
# ########## #
# ############ #
# ############ #
# ### ## ### #
# #### ## #### #
# ############## #
# ############## #
# ## ## ## ## #
# # ## ## ## # #
# ############## #
# ## ### ### ## #
# # ## ## # #
# #
####################
Но это выглядит не очень красиво. #
может быть не лучшим выбором для активных пикселей. Кроме того, клетки персонажей не квадратные, что делает нашего друга более призрачным, чем он есть.
Таким образом, для большей гибкости картина будет меняться в зависимости от трех входных параметров:
- Символ, который будет использоваться для активных пикселей;
- Горизонтальный масштабный коэффициент;
- Вертикальный масштабный коэффициент.
Например, с %
, 4
, 2
вывод будет лучше выглядящим
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% %%%%
%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%%
%%%% %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
правила
Все встроенные разрешены.
Входные данные принимаются в любом разумном формате и в любом порядке. Первый ввод выше (символ для активных пикселей) гарантированно будет печатным символом ASCII (коды от 32 до 126).
Конечный пробел после каждой строки или завершающий перевод новой строки после последней строки являются приемлемыми.
Код гольф, побеждает меньше байтов.
источник
Ответы:
CJam,
535149 байтовОбратите внимание, что три символа непечатаемые. Попробуйте онлайн!
Задний план
Правая половина немасштабированного вывода идентична левой, поэтому достаточно закодировать один из них. Если мы заменим пробелы нулями, а непространственные - единицами, получим
где каждая строка может быть интерпретирована как двоичное число. Это дает
Самый простой способ закодировать эту информацию - заменить каждое целое число символом Unicode в этой кодовой точке, но все они требуют кодирования двух байтов с помощью UTF-8.
С помощью XOR целых чисел с 544 мы сохраняем все целые, кроме двух, ниже 128 и избегаем нулевых байтов.
Результат
как целые числа или
как сбежавшая строка.
Как это работает
источник
Perl,
1131051041009796Добавлено +2 для
-ap
Предложения dev-null save 9 bytes Исправлено неверное количество, как заметил Деннис
Запустить с помощью
echo "2 4 %" | perl -ap pacman.pl
pacman.pl
:за исключением того, что строка
"\xff\x00\x03\x0f\x1f\x3f\x3f\x39\x79\x7f\x7f\x66\x59\x7f\x6e\x46\x00\xff"
должна быть записана в двоичной форме с одинарными кавычкамиПробел в качестве символа замены становится пустой строкой и приводит к коротким строкам. Но это все равно будет выглядеть пустым
источник
Dyalog APL, 64 байта
Это принимает масштабный коэффициент в качестве левого аргумента и символ в качестве правого аргумента, то есть:
Объяснение:
⍉(7/2)⊤⎕AV⍳'Äâ\⊥⊥∘)⍞⍞┬#⍞`⍒'
Левая половина призрака, без границы. (Это симметрично.) Каждый символ имеет свой старший бит, чтобы предотвратить выбор непечатаемых символов⎕AV
, но используются только первые 7 байтов.0,⍪⍨0⍪0,0,
: добавить границу пробелов слева, сверху и снизу1⍪⍨1⍪1,
: добавить рамку слева, сверху и снизу,∘⌽⍨
: присоединиться к нему с его вертикальным зеркалом1+
: добавьте 1, потому что массивы по умолчанию индексируются 1' '⍵[
...]
: использовать эту матрицу в качестве указателя на строку' '⍵
, поэтому каждый 0 сопоставляется с пробелом, а каждый 1 сопоставляется⍵
.⍺,⊂
: приложить матрицу и присоединить ее к масштабным коэффициентам/
: правый сгиб со следующей функцией:/∘⍉
: транспонировать и масштабировать горизонтальноисточник
MATL , 71 байт
Попробуйте онлайн!
объяснение
Изображение горизонтально симметрично, поэтому необходимо кодировать только левую половину. Каждая строка из 10 пикселей двоично кодируется как число от 0 до 1023. Активные пиксели кодируются как 0, а не как 1, поэтому первая строка имеет номер 0, а не 1023.
Поскольку последовательные строки отличаются только несколькими пикселями, числа дополнительно кодируются по-разному. Таким образом, каждая строка будет декодирована как совокупная сумма всех чисел до этой строки с последующим преобразованием в двоичную.
Нужные номера тогда
0 вводится в MATL с использованием
O
функции, которая избегает разделителя с соседними числами. Кроме того, отрицательные знаки не подразумевают дополнительные байты, поскольку они служат разделителями.После того, как массив был создан, он суммируется, двоично декодируется и горизонтально отражается. Результирующий двумерный массив используется для индексации строки из двух символов для получения результата. Эта строка имеет вид
'% '
, где'%'
находится входной символ.Как отмечает @Conor, код также работает с двумя символами в качестве входных данных. В этом случае последняя индексированная строка будет иметь вид
'%_ '
, где входные данные представляют собой строку из двух символов'%_'
. Пространство будет просто игнорироваться, потому что индексный массив обращается только к первым двум символам.источник
C (gcc) ,
199197 байтов-2 байта благодаря @JonathanFrech
Попробуйте онлайн!
188 байт (непечатные)
Предоставлено @JonathanFrech.
Попробуйте онлайн!
Ничего впечатляющего не происходит. Как и другие заметили, призрак очень симметричен. Само изображение имеет ширину 20 единиц, но за исключением верхнего и нижнего рядов, три крайних правых столбца идентичны. Это позволяет нам хранить половину изображения в виде символов вместо использования целых чисел:
Результирующая строка была перевернута, чтобы извлечь несколько байтов из-за наличия нисходящего цикла for (также решающего проблему с шестнадцатеричными побегами). Другие петли могут быть перевернуты без проблем благодаря симметрии.
Каждый символ смещен влево и имеет границу (с особой тщательностью в первом и последнем рядах). Тогда это просто вопрос правильного масштабирования строки.
Все циклы for заставляют меня чувствовать, что есть лучший способ.
источник
\xff
не может быть замененÿ
( TIO )?Серьезно, 116 байт
Эта новая строка важна. HexDump:
Та же стратегия, что и в ответе CJam Денниса , но значения кодируются в шестнадцатеричном формате , а не в XOR с 544, и в Seriously намного сложнее манипулировать строками.
Попробуйте онлайн!
источник
BBC BASIC,
239236232214 байтовПри вызове
PROCM(1,1,35)
появляется призрак из символов #. Аргументами PROCM являются: горизонтальная шкала, вертикальная шкала, значение символа ASCII.Эта программа будет работать как для Brandy Basic, так и для BASIC 2 на оригинальной модели B.
источник
Пакетный,
740722720 байтовИзменить: Сохранено
1820 байт, удалив ненужные пробелы.источник
Stax , 45 байт
Запустите и отладьте его
Объяснение:
источник
JavaScript (ES6), 167 байт
Основано на ответе @ Денниса. Я думаю, вы могли бы сбрить еще один байт, используя вместо него буквальный FF
\f
, но я сомневаюсь, что смогу вставить его сюда. При попытке этого вы также можете использовать\u01CA
вместоNJ
персонажа.К сожалению, добавление пробела к аргументу символа стоит целых 6 байтов.
источник
Python 2,
838828618 байтСохраняя 210 байтов, используя строку вместо массива, спасибо Деннису за это предложение, я знаю, что могу сделать еще лучше, но пока это хорошее улучшение.
Это лучшее, что я могу сделать, я не очень хорош с графикой в командной строке.Я взял маленький призрак в качестве базы.
Я использую ascii 219 по умолчанию, потому что с этим char призрак выглядит довольно круто !!!
Golfed
Попробуйте это на repl.it
Ungolfed
Тест
источник
Python 2, 244 байта
источник
Python 2, 169 байт
Попробуйте онлайн!
Объяснение:
Как и в ответе Дениса , каждый символ в этой строке представляет двоичное представление одной строки левой половины «изображения», XOR 544.
Для каждого символа в строке сделайте следующее:
Преобразуйте символ в его целочисленное представление, затем выполните двоичное XOR с 544. Затем преобразуйте это целое число в строку символов его двоичного представления, например, «0xb1111111111».
Для каждого символа в строчке, начиная с позиции 2 (которая пропускает 0b в начале), сделайте следующее:
Если символ == "1", замените его на предоставленный символ, в противном случае замените его пробелом. Затем скопируйте этот символ х раз. (x = 0 приведет к пустой строке.)
Объединить все строки в одну длинную строку, разделенную пустой строкой "".
создайте строку из b +, противоположную b, затем создайте массив, содержащий y экземпляров этой строки (y = 0 создаст пустой список []), затем добавьте этот список в список z.
Наконец, выведите на экран каждую из полученных строк, разделенных переносами строк.
источник