Картина старого друга в искусстве ASCII


36

Я надеюсь, что эта картина вам знакома.

введите описание изображения здесь

Это один из призраков Пакмана в его «уязвимом» состоянии после того, как Пакман съел пилюлю.

Соревнование

Изобразите нашего призрака в маленькой рамке, используя искусство ASCII. При нормальном масштабе (подробнее об этом позже) каждый квадрат на изображении выше должен соответствовать одному символу, а рамка должна иметь разделение на один символ вверх и вниз и разделение на два символа слева и справа от призрака :

####################
#                  #
#       ####       #
#     ########     #
#    ##########    #
#   ############   #
#   ############   #
#   ###  ##  ###   #
#  ####  ##  ####  #
#  ##############  #
#  ##############  #
#  ##  ##  ##  ##  #
#  # ##  ##  ## #  #
#  ##############  #
#  ## ###  ### ##  #
#  #   ##  ##   #  #
#                  #
####################

Но это выглядит не очень красиво. #может быть не лучшим выбором для активных пикселей. Кроме того, клетки персонажей не квадратные, что делает нашего друга более призрачным, чем он есть.

Таким образом, для большей гибкости картина будет меняться в зависимости от трех входных параметров:

  • Символ, который будет использоваться для активных пикселей;
  • Горизонтальный масштабный коэффициент;
  • Вертикальный масштабный коэффициент.

Например, с %, 4, 2вывод будет лучше выглядящим

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%                                                                        %%%%
%%%%                                                                        %%%%
%%%%                            %%%%%%%%%%%%%%%%                            %%%%
%%%%                            %%%%%%%%%%%%%%%%                            %%%%
%%%%                    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                    %%%%
%%%%                    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                    %%%%
%%%%                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                %%%%
%%%%                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                %%%%
%%%%            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%            %%%%
%%%%            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%            %%%%
%%%%            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%            %%%%
%%%%            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%            %%%%
%%%%            %%%%%%%%%%%%        %%%%%%%%        %%%%%%%%%%%%            %%%%
%%%%            %%%%%%%%%%%%        %%%%%%%%        %%%%%%%%%%%%            %%%%
%%%%        %%%%%%%%%%%%%%%%        %%%%%%%%        %%%%%%%%%%%%%%%%        %%%%
%%%%        %%%%%%%%%%%%%%%%        %%%%%%%%        %%%%%%%%%%%%%%%%        %%%%
%%%%        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        %%%%
%%%%        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        %%%%
%%%%        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        %%%%
%%%%        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        %%%%
%%%%        %%%%%%%%        %%%%%%%%        %%%%%%%%        %%%%%%%%        %%%%
%%%%        %%%%%%%%        %%%%%%%%        %%%%%%%%        %%%%%%%%        %%%%
%%%%        %%%%    %%%%%%%%        %%%%%%%%        %%%%%%%%    %%%%        %%%%
%%%%        %%%%    %%%%%%%%        %%%%%%%%        %%%%%%%%    %%%%        %%%%
%%%%        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        %%%%
%%%%        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        %%%%
%%%%        %%%%%%%%    %%%%%%%%%%%%        %%%%%%%%%%%%    %%%%%%%%        %%%%
%%%%        %%%%%%%%    %%%%%%%%%%%%        %%%%%%%%%%%%    %%%%%%%%        %%%%
%%%%        %%%%            %%%%%%%%        %%%%%%%%            %%%%        %%%%
%%%%        %%%%            %%%%%%%%        %%%%%%%%            %%%%        %%%%
%%%%                                                                        %%%%
%%%%                                                                        %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

правила

Все встроенные разрешены.

Входные данные принимаются в любом разумном формате и в любом порядке. Первый ввод выше (символ для активных пикселей) гарантированно будет печатным символом ASCII (коды от 32 до 126).

Конечный пробел после каждой строки или завершающий перевод новой строки после последней строки являются приемлемыми.

Код гольф, побеждает меньше байтов.


Посмотрите внимательно на картинку на несколько секунд. Тогда посмотри, что получится! ...
sergiol

Не могу поверить, что пока нет никаких документов об углях.
Вейцзюнь Чжоу

Ответы:


34

CJam, 53 51 49 байтов

q~"ǟ #/?Y__Fy_Nf ǟ"f{'Ƞ^2b_W%+S@+f=}fe*e*N*

Обратите внимание, что три символа непечатаемые. Попробуйте онлайн!

Задний план

Правая половина немасштабированного вывода идентична левой, поэтому достаточно закодировать один из них. Если мы заменим пробелы нулями, а непространственные - единицами, получим

1111111111
1000000000
1000000011
1000001111
1000011111
1000111111
1000111111
1000111001
1001111001
1001111111
1001111111
1001100110
1001011001
1001111111
1001101110
1001000110
1000000000
1111111111

где каждая строка может быть интерпретирована как двоичное число. Это дает

1023 512 515 527 543 575 575 569 633 639 639 614 601 639 622 582 512 1023

Самый простой способ закодировать эту информацию - заменить каждое целое число символом Unicode в этой кодовой точке, но все они требуют кодирования двух байтов с помощью UTF-8.

С помощью XOR целых чисел с 544 мы сохраняем все целые, кроме двух, ниже 128 и избегаем нулевых байтов.

Результат

479 32 35 47 63 31 31 25 89 95 95 70 121 95 78 102 32 479

как целые числа или

ǟ #/?\x1f\x1f\x19Y__Fy_Nf ǟ

как сбежавшая строка.

Как это работает

q~                e# Read and evaluate all input. This pushes the vscale factor V,
                  e# the hscale factor H, and the character C.
"ǟ #/?Y__Fy_Nf ǟ" e# Push that string.
f{                e# For each character, push C and the character; then:
'Ƞ^               e#   XOR the character with '\u0220' (544), casting to integer.
 2b               e#   Convert from integer to base 2.
 _W%              e#   Push a reversed copy of the binary digits.
 +                e#   Concatenate.
 S@+              e#   Append C to " ".
 f=               e#   Replace each binary digit with ' ' or C.
}                 e#
fe*               e# Repeat each character in each string H times.
e*                e# Repeat each string V times.
N                 e# Join the strings, separating by linefeeds.

7
Как быстро и короткий код! Впечатляет!
Луис Мендо

10

Perl, 113 105 104 100 97 96

Добавлено +2 для -ap

Предложения dev-null save 9 bytes Исправлено неверное количество, как заметил Деннис

Запустить с помощью echo "2 4 %" | perl -ap pacman.pl

pacman.pl:

}for(map+(unpack(aXBXB8Xb8XBXa),$/)x"@F","\xff\x00\x03\x0f\x1f\x3f\x3f\x39\x79\x7f\x7f\x66\x59\x7f\x6e\x46\x00\xff"=~/./g){s%%($&?$F[2]:$")x$F[1]%ge

за исключением того, что строка "\xff\x00\x03\x0f\x1f\x3f\x3f\x39\x79\x7f\x7f\x66\x59\x7f\x6e\x46\x00\xff"должна быть записана в двоичной форме с одинарными кавычками

Пробел в качестве символа замены становится пустой строкой и приводит к коротким строкам. Но это все равно будет выглядеть пустым


9

Dyalog APL, 64 байта

{/∘⍉/⍺,⊂' '⍵[1+,∘⌽⍨1⍪⍨1⍪1,0⍪⍨0⍪0,0,⍉(7/2)⊤⎕AV⍳'Äâ\⊥⊥∘)⍞⍞┬#⍞`⍒']}

Это принимает масштабный коэффициент в качестве левого аргумента и символ в качестве правого аргумента, то есть:

      2 1{/∘⍉/⍺,⊂' '⍵[1+,∘⌽⍨1⍪⍨1⍪1,0⍪⍨0⍪0,0,⍉(7/2)⊤⎕AV⍳'Äâ\⊥⊥∘)⍞⍞┬#⍞`⍒']}'%'
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
 %%                                    %% 
 %%              %%%%%%%%              %% 
 %%          %%%%%%%%%%%%%%%%          %% 
 %%        %%%%%%%%%%%%%%%%%%%%        %% 
 %%      %%%%%%%%%%%%%%%%%%%%%%%%      %% 
 %%      %%%%%%%%%%%%%%%%%%%%%%%%      %% 
 %%      %%%%%%    %%%%    %%%%%%      %% 
 %%    %%%%%%%%    %%%%    %%%%%%%%    %% 
 %%    %%%%%%%%%%%%%%%%%%%%%%%%%%%%    %% 
 %%    %%%%%%%%%%%%%%%%%%%%%%%%%%%%    %% 
 %%    %%%%    %%%%    %%%%    %%%%    %% 
 %%    %%  %%%%    %%%%    %%%%  %%    %% 
 %%    %%%%%%%%%%%%%%%%%%%%%%%%%%%%    %% 
 %%    %%%%  %%%%%%    %%%%%%  %%%%    %% 
 %%    %%      %%%%    %%%%      %%    %% 
 %%                                    %% 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

Объяснение:

  • ⍉(7/2)⊤⎕AV⍳'Äâ\⊥⊥∘)⍞⍞┬#⍞`⍒'Левая половина призрака, без границы. (Это симметрично.) Каждый символ имеет свой старший бит, чтобы предотвратить выбор непечатаемых символов ⎕AV, но используются только первые 7 байтов.

  • 0,⍪⍨0⍪0,0,: добавить границу пробелов слева, сверху и снизу

  • 1⍪⍨1⍪1,: добавить рамку слева, сверху и снизу
  • ,∘⌽⍨: присоединиться к нему с его вертикальным зеркалом
  • 1+: добавьте 1, потому что массивы по умолчанию индексируются 1
  • ' '⍵[... ]: использовать эту матрицу в качестве указателя на строку ' '⍵, поэтому каждый 0 сопоставляется с пробелом, а каждый 1 сопоставляется .
  • ⍺,⊂: приложить матрицу и присоединить ее к масштабным коэффициентам
  • /: правый сгиб со следующей функцией:
  • /∘⍉: транспонировать и масштабировать горизонтально

7

MATL , 71 байт

32hO511-3-12-16-32O6-64-6O25 13-38 17 40 70-511Nq$hYs10H$Bt!P!hi1$lX*Q)

Попробуйте онлайн!

объяснение

Изображение горизонтально симметрично, поэтому необходимо кодировать только левую половину. Каждая строка из 10 пикселей двоично кодируется как число от 0 до 1023. Активные пиксели кодируются как 0, а не как 1, поэтому первая строка имеет номер 0, а не 1023.

Поскольку последовательные строки отличаются только несколькими пикселями, числа дополнительно кодируются по-разному. Таким образом, каждая строка будет декодирована как совокупная сумма всех чисел до этой строки с последующим преобразованием в двоичную.

Нужные номера тогда

0 511 -3 -12 -16 -32 0 6 -64 -6 0 25 13 -38 17 40 70 -511

0 вводится в MATL с использованием Oфункции, которая избегает разделителя с соседними числами. Кроме того, отрицательные знаки не подразумевают дополнительные байты, поскольку они служат разделителями.

После того, как массив был создан, он суммируется, двоично декодируется и горизонтально отражается. Результирующий двумерный массив используется для индексации строки из двух символов для получения результата. Эта строка имеет вид '% ', где '%'находится входной символ.

Как отмечает @Conor, код также работает с двумя символами в качестве входных данных. В этом случае последняя индексированная строка будет иметь вид '%_ ', где входные данные представляют собой строку из двух символов '%_'. Пространство будет просто игнорироваться, потому что индексный массив обращается только к первым двум символам.

32                                             % space (ASCII)
h                                              % concat horizontally with 1st input: char
O511-3-12-16-32O6-64-6O25 13-38 17 40 70-511   % push these numbers
Nq$h                                           % concat all those numbers
Ys                                             % cumulative sum
10H$B                                          % convert to 10-digit binary numbers
                                               % gives 2D array, each number in one row
t                                              % duplicate
!P!                                            % flip horizontally
h                                              % concat horizontally
i                                              % take 2nd input: array [V H]
1$l                                            % matrix oh V×H ones  
X*                                             % Kronecker product to increase vertical
                                               % and horizontal scales by V and H resp.
Q                                              % add 1. Converts array of 0,1 into 1,2
)                                              % uses those 1,2 as indices into string


1
Начиная с версии 16.0.0 языка, замените запятые на пробелы
Луис Мендо

3

C (gcc) , 199 197 байтов

-2 байта благодаря @JonathanFrech

n,j;f(c,h,v){for(char t[20],i=18;i--;){for(n=10;n--;)t[n]=t[19-n]=((("\xff\0""1;\x7fM3\x7f\x7fON~~|x`\0\xff"[i]<<3)|(i&&i^17?1:7))>>n)&1?c:32;for(j=v;j--;puts(""))for(n=20*h;n--;)putchar(t[n/h]);}}

Попробуйте онлайн!

188 байт (непечатные)

Предоставлено @JonathanFrech.

n,j;f(c,h,v){for(char t[20],i=18;i--;){for(n=10;n--;)t[n]=t[19-n]=((("\xff\0001;M3ON~~|x`\0\xff"[i]<<3)|(i&&i^17?1:7))>>n)&1?c:32;for(j=v;j--;puts(""))for(n=20*h;n--;)putchar(t[n/h]);}}

Попробуйте онлайн!

Ничего впечатляющего не происходит. Как и другие заметили, призрак очень симметричен. Само изображение имеет ширину 20 единиц, но за исключением верхнего и нижнего рядов, три крайних правых столбца идентичны. Это позволяет нам хранить половину изображения в виде символов вместо использования целых чисел:

#######  127     \x7f
           0     \0
##        96     `
####     120     x
#####    124     |
######   126     ~
######   126     ~
#  ###    78     N
#  ####   79     O
#######  127     \x7f
#######  127     \x7f
 ##  ##   51     3
#  ## #   77     M
#######  127     \x7f
 ### ##   59     ;
 ##   #   49     1
           0     \0
#######  127     \x7f

Результирующая строка была перевернута, чтобы извлечь несколько байтов из-за наличия нисходящего цикла for (также решающего проблему с шестнадцатеричными побегами). Другие петли могут быть перевернуты без проблем благодаря симметрии.

Каждый символ смещен влево и имеет границу (с особой тщательностью в первом и последнем рядах). Тогда это просто вопрос правильного масштабирования строки.

Все циклы for заставляют меня чувствовать, что есть лучший способ.



@JonathanFrech Ах, спасибо!
gastropner


@JonathanFrech Аккуратный, но не слишком увлекающийся непечатными.
gastropner

Есть ли у вас идеи, почему \xffне может быть заменен ÿ( TIO )?
Джонатан Фрех

2

Серьезно, 116 байт

╩' "3ff 200 203 20f 21f 23f 23f 239 279 27f 27f 266 259 27f 26e 246 200 3ff"s`24╙(¿¡╜'1(Æ' '0(Æ"╛*"£M;R@+εj2└@n`M'
j

Эта новая строка важна. HexDump:

00000000: ca27 2022 3366 6620 3230 3020 3230 3320  .' "3ff 200 203
00000010: 3230 6620 3231 6620 3233 6620 3233 6620  20f 21f 23f 23f
00000020: 3233 3920 3237 3920 3237 6620 3237 6620  239 279 27f 27f
00000030: 3236 3620 3235 3920 3237 6620 3236 6520  266 259 27f 26e
00000040: 3234 3620 3230 3020 3366 6622 7360 3234  246 200 3ff"s`24
00000050: d328 a8ad bd27 3128 9227 2027 3028 9222  .(...'1(.' '0(."
00000060: be2a 229c 4d3b 5240 2bee 6a32 c040 6e60  .*".M;R@+.j2.@n`
00000070: 4d27 0d0a 6a                             M'..j

Та же стратегия, что и в ответе CJam Денниса , но значения кодируются в шестнадцатеричном формате , а не в XOR с 544, и в Seriously намного сложнее манипулировать строками.

Попробуйте онлайн!


2

BBC BASIC, 239 236 232 214 байтов

0DEFPROCM(A,B,C)C=C-32:FORU=0TO18*A-1:FORV=0TO20*B-1:Y=U DIVA:X=V DIVB:V.32-C*FNC((X<10)*-X-(X>9)*(19-X),Y):N.:P.:N.:E.
1DEFFNC(X,Y)Z=Y*10+X:=((ASCMI."#Cb^2aC*[#1CF<;)C$;I9I$;EYLb&#",Z/6+1)-35)AND(2^(Z MOD6)))=0

При вызове PROCM(1,1,35)появляется призрак из символов #. Аргументами PROCM являются: горизонтальная шкала, вертикальная шкала, значение символа ASCII.

Эта программа будет работать как для Brandy Basic, так и для BASIC 2 на оригинальной модели B.


2

Пакетный, 740 722 720 байтов

@echo off
setlocal enabledelayedexpansion
set h=%3
set w=
set s=
for /l %%a in (1,1,%2)do set w=%1!w!&set s= !s!
call:l ####################
call:l #                  #
call:l #       ####       #
call:l #     ########     #
call:l #    ##########    #
call:l #   ############   #
call:l #   ############   #
call:l #   ###  ##  ###   #
call:l #  ####  ##  ####  #
call:l #  ##############  #
call:l #  ##############  #
call:l #  ##  ##  ##  ##  #
call:l #  # ##  ##  ## #  #
call:l #  ##############  #
call:l #  ## ###  ### ##  #
call:l #  #   ##  ##   #  #
call:l #                  #
call:l ####################
exit/b
:l
set l=%*
set l=!l: =%s%!
for /l %%a in (1,1,%h%)do echo !l:#=%w%!

Изменить: Сохранено 18 20 байт, удалив ненужные пробелы.


2

Stax , 45 байт

àÄÅ╣>u°↨2ö|dτÅbn╦─▀:ΣFúÇz?⌂É\!n▄§V0Ncó╤½8|δò_

Запустите и отладьте его

Объяснение:

"<long string>"!E' x+:BA/s|*mn|*:m Full program, implicit input.
"<long string>"!E                  Push 1531747987795407832964332490922049710271411270772589567
                 ' x+              Push a space plus the given character
                     :B            Interpret the number in binary, replacing 0 with ' ' and 1 with the given char
                       A/          Group into pieces of length 10.
                                   Gives the first half of each line.
                         s|*       Repeat each line <vertical scale factor> times
                            m      For each line:
                             n|*     Repeat each character <horizontal scale factor> times
                                :m   Mirror
                                     Implicit output with newline

Третий показывает с некоторыми цветами на моем экране. Очень приятно :-)
Луис Мендо

1

JavaScript (ES6), 167 байт

(s,w,h)=>[...`NJ56:*

\fLJJSlJ[s5NJ`].map(c=>`${t=(c.charCodeAt()^565).toString(2)}${[...t].reverse().join``}
`.replace(/./g,b=>` ${s}`[b].repeat(w)).repeat(h)).join``

Основано на ответе @ Денниса. Я думаю, вы могли бы сбрить еще один байт, используя вместо него буквальный FF \f, но я сомневаюсь, что смогу вставить его сюда. При попытке этого вы также можете использовать \u01CAвместо NJперсонажа.

К сожалению, добавление пробела к аргументу символа стоит целых 6 байтов.


1

Python 2, 838 828 618 байт

Сохраняя 210 байтов, используя строку вместо массива, спасибо Деннису за это предложение, я знаю, что могу сделать еще лучше, но пока это хорошее улучшение.

Это лучшее, что я могу сделать, я не очень хорош с графикой в ​​командной строке.

Я взял маленький призрак в качестве базы.

Я использую ascii 219 по умолчанию, потому что с этим char призрак выглядит довольно круто !!!

Golfed

def g(c,s,w,h,l=""):
 x="c-20,c-1,s-18,c-1,c-1,s-7,c-4,s-7,c-1,c-1,s-5,c-8,s-5,c-1,c-1,s-4,c-10,s-4,c-1,c-1,s-3,c-12,s-3,c-1,c-1,s-3,c-12,s-3,c-1,c-1,s-3,c-3,s-2,c-2,s-2,c-3,s-3,c-1,c-1,s-2,c-4,s-2,c-2,s-2,c-4,s-2,c-1,c-1,s-2,c-14,s-2,c-1,c-1,s-2,c-14,s-2,c-1,c-1,s-2,c-2,s-2,c-2,s-2,c-2,s-2,c-2,s-2,c-1,c-1,s-2,c-1,s-1,c-2,s-2,c-2,s-2,c-2,s-1,c-1,s-2,c-1,c-1,s-2,c-14,s-2,c-1,c-1,s-2,c-2,s-1,c-3,s-2,c-3,s-1,c-2,s-2,c-1,c-1,s-2,c-1,s-3,c-2,s-2,c-2,s-3,c-1,s-2,c-1,c-1,s-18,c-1,c-20"
 for r in x.split(","):
  d=r.split("-");l+=d[0].replace("s",s).replace("c",c)*int(d[1])*w
  if len(l)==20*w:print(l+"\n")*h,;l=""

Попробуйте это на repl.it

Ungolfed

def pacmanGhost(char = "█", sep = " ", width = 1, height = 1):
    coords = [[[char, 20]], [[char, 1], [sep, 18], [char, 1]],[[char, 1], [sep, 7], [char, 4], [sep, 7], [char, 1]], [[char, 1], [sep, 5], [char, 8], [sep, 5],
         [char, 1]], [[char, 1], [sep, 4], [char, 10], [sep, 4], [char, 1]], [[char, 1], [sep, 3], [char, 12], [sep, 3], [char, 1]], [[char, 1], [sep, 3],
         [char, 12], [sep, 3], [char, 1]], [[char, 1], [sep, 3], [char, 3], [sep, 2], [char, 2], [sep, 2], [char, 3], [sep, 3], [char, 1]], [[char, 1],
         [sep, 2], [char, 4], [sep, 2], [char, 2], [sep, 2], [char, 4], [sep, 2], [char, 1]], [[char, 1], [sep, 2], [char, 14], [sep, 2], [char, 1]],
         [[char, 1], [sep, 2], [char, 14], [sep, 2], [char, 1]], [[char, 1], [sep, 2], [char, 2], [sep, 2], [char, 2], [sep, 2], [char, 2], [sep, 2],
         [char, 2], [sep, 2], [char, 1]], [[char, 1], [sep, 2], [char, 1], [sep, 1], [char, 2], [sep, 2], [char, 2], [sep, 2], [char, 2], [sep, 1], [char, 1],
         [sep, 2], [char, 1]], [[char, 1], [sep, 2], [char, 14], [sep, 2], [char, 1]], [[char, 1], [sep, 2], [char, 2], [sep, 1], [char, 3], [sep, 2],
         [char, 3], [sep, 1], [char, 2], [sep, 2], [char, 1]], [[char, 1], [sep, 2], [char, 1], [sep, 3], [char, 2], [sep, 2], [char, 2], [sep, 3],
         [char, 1], [sep, 2], [char, 1]], [[char, 1], [sep, 18], [char, 1]], [[char, 20]]]
    for coord in coords:
        line = ""
        for element in coord:
            line = "{}{}".format(line, element[0] * element[1] * width)
        for i in range(height):
            print(line)
    return

Тест

введите описание изображения здесь


Вы получили бы гораздо лучший результат, если бы просто сохранили несжатое немасштабированное изображение в виде строки. Кроме того, вы тратите байты на аргументы по умолчанию и инструкцию return.
Деннис

Нет такого понятия, как код ASCII 219.
mbomb007

1

Python 2, 244 байта

p,w,h=raw_input().split()
for i in range(18): mystr=''.join([(p if i=='1'else' ')*int(w)for i in str(10+(i%17==0))+format(ord('\xff\x00\x03\x0f\x1f??9y\x7f\x7ffY\x7fnF\x00\xff'[i]),'08b')]);print'\n'.join([mystr+mystr[::-1]for j in[1]*int(h)])

1

Python 2, 169 байт

def a(s,x,y):
    z=[]
    for c in u'\u01df #/?\x1f\x1f\x19Y__Fy_Nf \u01df':
        b="".join((s if d=="1"else" ")*x for d in bin(ord(c)^544)[2:]);z+=[b+b[::-1]]*y
    print"\n".join(z)

Попробуйте онлайн!

Объяснение:

u'\u01df #/?\x1f\x1f\x19Y__Fy_Nf \u01df'

Как и в ответе Дениса , каждый символ в этой строке представляет двоичное представление одной строки левой половины «изображения», XOR 544.

for c in <unicode string>:

Для каждого символа в строке сделайте следующее:

    bin(ord(c)^544)

Преобразуйте символ в его целочисленное представление, затем выполните двоичное XOR с 544. Затем преобразуйте это целое число в строку символов его двоичного представления, например, «0xb1111111111».

    for d in <string>[2:]

Для каждого символа в строчке, начиная с позиции 2 (которая пропускает 0b в начале), сделайте следующее:

    (s if d=="1"else" ")*x

Если символ == "1", замените его на предоставленный символ, в противном случае замените его пробелом. Затем скопируйте этот символ х раз. (x = 0 приведет к пустой строке.)

    b="".join(<previously generated list of strings>)

Объединить все строки в одну длинную строку, разделенную пустой строкой "".

    z+=[b+b[::-1]]*y

создайте строку из b +, противоположную b, затем создайте массив, содержащий y экземпляров этой строки (y = 0 создаст пустой список []), затем добавьте этот список в список z.

print"\n".join(z)

Наконец, выведите на экран каждую из полученных строк, разделенных переносами строк.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.