Между линиями

31

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

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

Вот как они созданы. Все линии будут на регулярной сетке, так что отдельные цифры состоят из небольшого числа ячеек сетки. Вот формы из 10 цифр (мы будем игнорировать десятичную точку для этой задачи):

введите описание изображения здесь
Да, 7 отличается от примера золотого сечения в верхней части. Я вроде все испортил. Мы пойдем с этим.

Обратите внимание, что каждая цифра имеет пять ячеек и три ячейки. Чтобы отобразить число, вы можете представить, что все его цифры расположены рядом друг с другом, так что между каждой парой цифр ровно один пустой столбец. Например, принимая в 319качестве входных данных, мы написали бы:

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

Обратите внимание, что мы добавляем один ведущий и завершающий пустой столбец. Теперь мы инвертируем ячейки:

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

На выходе должны быть границы результирующих полигонов:

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

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

вход

  • Вы можете написать программу или функцию, используя ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции, в виде строки или списка цифр. (Вы не можете взять число, так как это не позволит вам поддерживать ведущие нули.)
  • Вы можете предположить, что на входе не будет больше 16 цифр.

Выход

  • Вывод может отображаться на экране или записываться в файл в обычном формате изображения.
  • Вы можете использовать как растровую, так и векторную графику.
  • В любом случае соотношение сторон ячеек базовой сетки должно быть равно 1 (то есть ячейки должны быть квадратами).
  • В случае растровой графики каждая ячейка должна охватывать не менее 20 на 20 пикселей.
  • Строки должны быть не шире, чем 10% размера ячейки. Я готов дать один или два пикселя, так как здесь есть псевдонимы.
  • Линии и фон могут быть любыми двумя четко различимыми цветами, но формы, созданные линиями, не должны заполняться (то есть внутренняя часть должна быть также цветом фона).
  • В каждом замкнутом контуре не должно быть пробелов.
  • Конечно, весь результат должен быть виден.

Тестовые случаи

Вот 10 входов, которые вместе охватывают все возможные пары соседних цифр, а также все возможные начальные и конечные цифры:

07299361548
19887620534
21456837709
39284106657
49085527316
59178604432
69471338025
79581224630
89674235011
97518264003

И вот ожидаемые результаты для тех:

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

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

Мартин Эндер
источник
Будет ли принято ASCII искусство?
Blue
2
@ Синий, я думаю, это решило бы совсем другую задачу, и ответы вряд ли будут сопоставимы, так что нет, извините. Я вообще не фанат смешивания графического вывода и ASCII-графики в одной задаче.
Мартин Эндер
хорошо, спасибо за быстрый ответ
Blue
Разрешено ли импортировать шрифты?
Марв
@Marv Хм, интересный вопрос. Я бы сказал, что вы должны посчитать размер файла шрифта в этом случае.
Мартин Эндер

Ответы:

1

BBC BASIC, 182 символа ASCII (токенизированный размер файла 175 байт)

Скачать переводчик можно по адресу http://www.bbcbasic.co.uk/bbcwin/bbcwin.html.

I.n$
F.j=0TOLENn$*4p=ASCM."?@\@?[@_?DTP?TT@?pv@?PTD?@TD?||@?@T@?PT@",VALM.n$,j/4+1,1)*4+1+j MOD4)F.k=0TO4p*=2q=64A.p
V.537;q;0;2585;0;q;537;-q;0;2585;0;-q;25;0;64;
N.MOVEBY 64,-320N.

Оценка. Когда вышеуказанная программа вставляется в редактор и запускается, редактор расширит сокращенные ключевые слова до полных ключевых слов на экране, хотя на самом деле они составляют всего 1 байт после токенизации. (Пример I.= INPUTобъем памяти 1 байт.)

объяснение

Я просто объясню, что делает линия VDU: она рисует прямоугольник, переворачивая текущий цвет пикселя на экране. Это означает, что (с небольшой осторожностью с углами) можно просто нарисовать одну ячейку рядом друг с другом, и промежуточный край будет отменен и исчезнет из-за двойного рисования.

При внимательном рассмотрении будет выявлено, что верхний правый и нижний левый углы ячейки нарисованы, но верхний левый и нижний правый отсутствуют («закруглены») для выполнения этой работы.

После отрисовки ячейки графический курсор перемещается вверх на 32 пикселя, готовый для рисования следующей ячейки.

Остальная часть программы представляет собой довольно простую декомпрессию растрового изображения ASCII. Размеры ячейки составляют 64x64 единицы для игры в гольф / совместимости с тем, как распаковывается растровое изображение. qуправляет размером отображаемой ячейки: 64x64 единиц для ячейки, которая присутствует, 0x0 для ячейки, которая отсутствует.

Код без правил

  m$="?@\@?[@_?DTP?TT@?pv@?PTD?@TD?||@?@T@?PT@" :REM bitmap for digits, including column of filled cells at left. BBC strings are 1-indexed
  INPUTn$                                       :REM user input
  FORj=0 TO LENn$*4                             :REM iterate 4 times per input digit, plus once more (plot column 0 of imaginary digit to finish)
    d=VAL MID$(n$,j/4+1,1)                      :REM extract digit from n$ (1-character string). VAL of empty string = 0, so 123->1,1,1,1,2,2,2,2,3,3,3,3,0
    p=ASC MID$(m$,d*4+1+j MOD4)                 :REM get column bitmap from m$ d*4 selects digit, j MOD4 selects correct column of digit, add 1 to convert to 1-index
    FORk=0TO4                                   :REM for each cell in the column
      p*=2                                      :REM bitshift p
      q=64ANDp                                  :REM find size of cell to draw. 64 for a filled cell, 0 for an absent cell.
      VDU537;q;0;                               :REM line q units right, inverting existing screen colour. Draw last pixel (will be inverted next line)
      VDU2585;0;q;                              :REM line q units up, inverting existing screen colour. Dont draw last pixel (will be filled in next line)
      VDU537;-q;0;                              :REM line q units left, inverting existing screen colour. Draw last pixel (will be inverted next line)
      VDU2585;0;-q;                             :REM line q units down, inverting existing screen colour. Dont draw last pixel (avoid inverting 1st pixel of 1st line)
      VDU25;0;64;                               :REM move up 64 units for cell above
    NEXT
    MOVEBY 64,-320                              :REM move right and down for next column.
  NEXT

Выход

В MOVEs только получить выход на соответствующие высоты на экране. В этом режиме BBC basic использует 2 единицы = 1 пиксель, поэтому ячейки на самом деле имеют размер 32x32 пикселя.

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

Уровень реки St
источник
10

Октава, 233 225 216 213 байт

o=@ones;l=z=o(5,1);for k=input('')-47;l=[l,reshape(dec2bin([448,22558,8514,10560,3936,2376,328,15840,320,2368](k),15),5,[])-48,z];end;L=~o(size(l)+2);L(2:6,2:end-1)=l;O=o(3);O(5)=-8;M=~conv2(kron(L,o(25)),O);imshow(M)

Вот первый тестовый пример (из снимка экрана с измененным размером, но он подходит моему монитору =): введите описание изображения здесь

o=@ones;
l=z=o(5,1);                   %spacer matrices
for k=input('')-47;           %go throu all input digis
                              %decode the matrices for each digit from decimal
l=[l,reshape(dec2bin([448,22558,8514,10560,3936,2376,328,15840,320,2368](k),15),5,[])-48,z];
end
L=~o(size(l)+2);           %pad the image
L(2:6,2:end-1)=l;
O=o(3);O(5)=-8;               %create edge detection filter
imshow(~conv2(kron(L,o(25)),O)) %image resizing /edge detection (change 25 to any cell size you like)

Ввод может быть произвольной длины, например, например '07299361548'

Свертка - ключ к успеху.

flawr
источник
Спасибо @LuisMendo за улучшение оценки на кучу байтов =)
flawr
2
Я не мог согласиться с тем, что Convolution является ключом к успеху :-)
Луис Мендо
Каким-то образом это всегда является девизом для моих успешных ответов matlab / octave: D
flawr
5

Javascript ES6, 506 байт

a=>{with(document)with(body.appendChild(createElement`canvas`))with(getContext`2d`){width=height=(a.length+2)*80;scale(20,20);translate(1,1);lineWidth=0.1;beginPath();["oint",...a.map(i=>"05|7agd7|oint 067128a45|oicgmnt 01de25|oil9amnt 01de23fg45|oint 03fh5|68ec6|oint 03fg45|oij78knt 05|9agf9|oij78knt 01dh5|oint 05|78ed7|9agf9|oint 03fg45|78ed7|oint".split` `[i]),"05"].map(i=>{i.split`|`.map(i=>[...i].map((e,i,_,p=parseInt(e,36),l=~~(p/6),r=p%6)=>i?lineTo(l,r):moveTo(l,r)));translate(4,0)});stroke()}}

Ungolfed:

a=>{                                            // anonymous function declaration, accepts array of numbers
  with(document)                                // bring document into scope
  with(body.appendChild(createElement`canvas`)) // create canvas, drop into html body, bring into scope
  with(getContext`2d`){                         // bring graphics context into scope
    width=height=(a.length+2)*80;               // set width and height
    scale(20,20);                               // scale everything to 20x
    translate(1,1);                             // add padding so outline doesn't touch edge of canvas
    lineWidth=0.1;                              // have to scale line width since we scaled 20x
    beginPath();                                // start drawing lines
    ["oint",                                    // beginning "glyph", draws left end of negative space, see below
     ...a.map(i=>`05|7agd7|oint                 // glyphs 0-9 encoded as vertices
                  067128a45|oicgmnt             //   glyphs seperated by " "
                  01de25|oil9amnt               //   lines within each glyph seperated by "|"
                  01de23fg45|oint               //   a single vertex is stored as a base36 char
                  03fh5|68ec6|oint              //     where a number corresponds to one of the verts shown below:
                  03fg45|oij78knt               //        0  6 12 18 24
                  05|9agf9|oij78knt             //        1  7 13 19 25
                  01dh5|oint                    //        2  8 14 20 26
                  05|78ed7|9agf9|oint           //        3  9 15 21 27
                  03fg45|78ed7|oint`            //        4 10 16 22 28
       .split` `[i]),                           //        5 11 17 23 29
     "05"]                                      // end "glyph", draws right end of negative space, see above
      .map(i=>{                                 // for each glyph string
        i.split`|`                              // seperate into list of line strings
          .map(i=>[...i]                        // convert each line string into list of chars
            .map((e,i,_,p=parseInt(e,36),       // convert base36 char to number
                  l=~~(p/6),r=p%6)=>            // compute x y coords of vertex
              i?lineTo(l,r):moveTo(l,r)));      // draw segment
        translate(4,0)});                       // translate origin 4 units to right
    stroke()}}                                  // draw all lines to canvas

Предполагается, что есть <body>возможность добавить холст, протестированный в Firefox 46.

Пример выполнения (назначение анонимной функции для f):

f([1,0,3])

выходы:

Пример вывода

Dendrobium
источник
5

HTML + JavaScript ES6, 352

Тест бегущего фрагмента ниже

<canvas id=C></canvas><script>s=prompt(),C.width=-~s.length*80,c=C.getContext("2d"),[...s].map(d=>[30,d*=3,++d,++d].map(w=a=>{for(a=parseInt("vhvivgtlnllv74vnltvlt11vvlvnlv0"[a],36)*2+1,p=1,y=100,i=64;i>>=1;p=b,y-=20)c.moveTo(x+20,y),b=a&i?1:0,c[b-p?'lineTo':'moveTo'](x,y),(a^q)&i&&c.lineTo(x,y-20);q=a,x+=20}),q=63,x=0),w(30),w(0),c.stroke()</script>

Меньше гольфа

s=prompt(),C.width=-~s.length*80,c=C.getContext("2d"),
w=a=>{
  a=parseInt("vhvivgtlnllv74vnltvlt11vvlvnlv0"[i],36)*2+1
  for(p=1,y=100,i=32;i;p=b,y-=20,i>>=1)
    c.moveTo(x+20,y),
    b=a&i?1:0,
    c[b-p?'lineTo':'moveTo'](x,y),
    (a^q)&i&&c.lineTo(x,y-20)
  q=a 
  x+=20
},
[...s].map(d=>[30,d*=3,++d,++d].map(w),q=63,x=0),
w(30),w(0)
c.stroke()
edc65
источник
1
Я не думаю, что вам нужен закрывающий тег сценария ...
Mama Fun Roll
3

Java, 768 байт

import java.awt.*;import java.awt.image.*;class G{public static void main(String[]v)throws Exception{int s=20,n=v[0].length(),i=0,j,w=(n*3+n+1)*s,h=5*s,a[][]={{6,7,8},{0,2,3,10,11,12,13},{1,6,8,13},{1,3,6,8},{3,4,5,6,8,9},{3,6,8,11},{6,8,11},{1,2,3,4,6,7,8,9},{6,8},{3,6,8}};BufferedImage o,b=new BufferedImage(w,h,1);Graphics g=b.getGraphics();g.setColor(Color.WHITE);for(;i<n;i++)for(j=0;j<15;j++){int c=j;if(java.util.Arrays.stream(a[v[0].charAt(i)-48]).noneMatch(e->e==c))g.fillRect((1+i*4+j/5)*s,j%5*s,s,s);}o=new BufferedImage(b.getColorModel(),b.copyData(null),0>1,null);for(i=1;i<h-1;i++)for(j=1;j<w-1;j++)if((b.getRGB(j+1,i)|b.getRGB(j-1,i)|b.getRGB(j,i+1)|b.getRGB(j,i-1))<-1)o.setRGB(j,i,-1);javax.imageio.ImageIO.write(o,"png",new java.io.File("a.png"));}}

Ungolfed

import java.awt.*;
        import java.awt.image.BufferedImage;

class Q79261 {
    public static void main(String[] v) throws Exception {
        int scale = 20, n = v[0].length(), i = 0, j, width = (n * 3 + n + 1) * scale, height = 5 * scale, values[][] = {{6, 7, 8}, {0, 2, 3, 10, 11, 12, 13}, {1, 6, 8, 13}, {1, 3, 6, 8}, {3, 4, 5, 6, 8, 9}, {3, 6, 8, 11}, {6, 8, 11}, {1, 2, 3, 4, 6, 7, 8, 9}, {6, 8}, {3, 6, 8}};
        BufferedImage output, temp = new BufferedImage(width, height, 1);
        Graphics g = temp.getGraphics();
        g.setColor(Color.WHITE);
        for (; i < n; i++)
            for (j = 0; j < 15; j++) {
                int finalJ = j;
                if (java.util.Arrays.stream(values[v[0].charAt(i) - 48]).noneMatch(e -> e == finalJ))
                    g.fillRect((1 + i * 4 + j / 5) * scale, j % 5 * scale, scale, scale);
            }
        output = new BufferedImage(temp.getColorModel(), temp.copyData(null), 0 > 1, null);
        for (i = 1; i < height - 1; i++)
            for (j = 1; j < width - 1; j++)
                if ((temp.getRGB(j + 1, i) | temp.getRGB(j - 1, i) | temp.getRGB(j, i + 1) | temp.getRGB(j, i - 1)) < -1)
                    output.setRGB(j, i, -1);
        javax.imageio.ImageIO.write(output, "png", new java.io.File("a.png"));
    }
}

Заметки

  • Ввод является единственной строкой в ​​качестве аргумента. Как использовать: javac G.java,java G 80085

  • Я начинаю с черного холста, затем добавляю цифры в виде белых позитивов. Я создаю копию изображения, а затем переворачиваю каждый черный пиксель с 4 черными соседями на исходном изображении.

Выходы

0 1 2 3 4 5 6 7 8 9

Некоторые однозначные цифры:

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

Марв
источник
java.awt. * не содержит java.awt.image.BufferedImage?
Element118
@ Element118 это не так.
Марв
2

R, слишком много байтов для гольфа ( 1530+ 1115)

library(reshape2);library(ggplot2);library(png)
M=matrix(1,5,3)
M=lapply(list(c(7:9),c(1,3,4,11:14),c(2,7,9,14),c(2,4,7,9),c(4:7,9,10),c(4,7,9,12),c(7,9,12),c(2:5,7:10),c(7,9),c(4,7,9)),function(x){M[x]=0;M})
g=function(P){
S=matrix(0,5,1)
R=NULL
for(N in P){R=Reduce(cbind2,list(R,S,M[[N+1]]))}
cbind(R,S)}
p=function(P){
o=t(apply(g(P),1,rev))
ggplot(melt(o),aes(x=Var1,y=Var2))+geom_raster(aes(fill=value))+coord_flip()+scale_fill_continuous(guide=FALSE,high="#FFFFFF",low="#000000")+scale_y_reverse()+scale_x_reverse()+theme_bw()+theme(panel.grid=element_blank(),panel.border=element_blank(),panel.background=element_blank(),axis.title=element_blank(),axis.text=element_blank(),axis.ticks=element_blank(),plot.margin=unit(c(0,0,0,0),"mm"))+ggsave("t.png",width=dim(o)[2]/2.5,height=2,units="in",dpi=99)
q=readPNG("t.png")
k=q[,,1]
b=replace(k,k==1,0)
for(i in 1:nrow(k)){
for(j in 1:ncol(k)){
u=(i==nrow(k))
v=(j==ncol(k))
if(u&v){b[i,j]=1;break}
if((i==1)|u|(j==1)|v){b[i,j]=1;next}else{if(all(k[c((i-1):(i+1)),c((j-1):(j+1))])){b[i,j]=1}else{b[i,j]=0}}}}
q[,,1:3]=abs(replace(k,b==1,0)-1)
writePNG(q,"t.png")}

# run p(c(0,1,2,3,4,5))

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

LOL при записи на диск, а затем при чтении с диска отредактируйте черную заливку.

Vlo
источник
2

Python 3, 326 325 байт

import numpy
from skimage import io,transform as t,filters as f
r=[[1]*5,[0]*5]
for c in map(int,input()):r+=[map(float,bin(0x3f1fa7e1bd7b5aff84ff6b7fd6f087ff5ff6bf)[2:][15*c+5*i:15*c+5*-~i])for i in[0,1,2]]+[[0]*5]
r+=[[1]*5]
p=[[1]*len(r)]
r=p+list(zip(*r))+p
io.imsave("o.png",1-f.sobel((t.rescale(numpy.array(r),16,0))))
orlp
источник
2
Я собирался прокомментировать это на одном из ваших других ответов на днях, но range(3)это никогда не стоит.
Sp3000
1

C #, 768 773 776 байт

namespace System.Drawing{class P{static void Main(string[]a){uint[]l={0xEBFBFFFC,0xB89B21B4,0xABFFF9FC,0xAA1269A4,0xFFF3F9FC};var w=a[0].Length*80+20;var b=new Bitmap(w,100);var g=Graphics.FromImage(b);g.FillRectangle(Brushes.Black,0,0,w,100);for(int i=0;i<a[0].Length;i++)for(int r=0;r<5;r++)for(int c=0;c<3;c++)if((l[r]&((uint)1<<(175-a[0][i]*3-c)))>0)g.FillRectangle(Brushes.White,20*(1+i*4+c),20*r,20,20);for(int x=1;x<w-1;x++)for(int y=1;y<99;y++)if(b.GetPixel(x,y).B+b.GetPixel(x+1,y).B+b.GetPixel(x,y+1).B+b.GetPixel(x,y-1).B+b.GetPixel(x+1,y-1).B+b.GetPixel(x+1,y+1).B+b.GetPixel(x-1,y+1).B+b.GetPixel(x-1,y-1).B==0)b.SetPixel(x,y,Color.Red);for(int x=1;x<w-1;x++)for(int y=1;y<99;y++)if(b.GetPixel(x,y).R>0)b.SetPixel(x,y,Color.White);b.Save(a[0]+".bmp");}}}

Принимает число в качестве аргумента командной строки. Выводит красивое, чистое, не сглаженное изображение BMP с номером в качестве имени.

Оригинал до игры в гольф:

namespace System.Drawing
{
    class P
    {
        static void Main(string[] args)
        {
            var numbers = args[0];
            uint[] lines = {
                0xEBFBFFFC, // 111 010 111 111 101 111 111 111 111 111 00
                0xB89B21B4, // 101 110 001 001 101 100 100 001 101 101 00
                0xABFFF9FC, // 101 010 111 111 111 111 111 001 111 111 00
                0xAA1269A4, // 101 010 100 001 001 001 101 001 101 001 00
                0xFFF3F9FC  // 111 111 111 111 001 111 111 001 111 111 00
            };
            var width = numbers.Length*4 + 1;
            var bmp = new Bitmap(width*20, 5*20);
            using (var gfx = Graphics.FromImage(bmp))
            {
                gfx.FillRectangle(Brushes.Black, 0, 0, width*20+2, 5*20+2);
                // Process all numbers
                for (int i = 0; i < numbers.Length; i++)
                {
                    var number = numbers[i]-'0';
                    for (int line = 0; line < 5; line++)
                    {
                        for (int col = 0; col < 3; col++)
                        {
                            if ((lines[line] & ((uint)1<<(31-number*3-col))) >0)
                                gfx.FillRectangle(Brushes.White, 20*(1 + i * 4 + col), 20*line, 20 , 20 );
                        }
                    }
                }
                // Edge detection
                for (int x = 1; x < width*20-1; x++)
                {
                    for (int y = 1; y < 5*20-1 ; y++)
                    {
                        if (bmp.GetPixel(x,y).B +
                            bmp.GetPixel(x + 1, y).B +
                                bmp.GetPixel(x, y + 1).B +
                                bmp.GetPixel(x, y - 1).B +
                                bmp.GetPixel(x + 1, y - 1).B +
                                bmp.GetPixel(x + 1, y + 1).B + 
                                bmp.GetPixel(x - 1, y + 1).B + 
                                bmp.GetPixel(x - 1, y - 1).B == 0)
                                bmp.SetPixel(x, y, Color.Red);
                    }
                }
                // Convert red to white
                for (int x = 1; x < width * 20 - 1; x++)
                {
                    for (int y = 1; y < 5 * 20 - 1; y++)
                    {
                        if (bmp.GetPixel(x, y).R>0)
                            bmp.SetPixel(x, y, Color.White);
                    }
                }
            }
            bmp.Save(@"c:\tmp\test.bmp");
        }
    }
}
Томас Веллер
источник
1

Mathematica 328 байтов

j@d_:=Partition[IntegerDigits[FromDigits[d/.Thread[ToString/@Range[0,9]->StringPartition["75557262277174771717557117471774757711117575775717",5]],16],2, 20]/.{0->1,1->0},4];j@"*"=Array[{1}&,5];
w@s_:=  ColorNegate@EdgeDetect@Rasterize@ArrayPlot[Thread[Join@@Transpose/@j/@Characters@(s<>"*")],Frame->False,ImageSize->Large]

w["07299361548"]
w["19887620534"]

фильм


объяснение

Четыре бита будут использоваться в каждой из 5 строк ячеек для каждой входной цифры.

"75557262277174771717557117471774757711117575775717"представляет от 0 до 9 как растровые изображения.

Первые 5 цифр большого целого числа выше, а именно 75557указывают, как должна отображаться каждая строка массива для нуля. 7будет представлять {0,1,1,1}собой белую клетку, за которой справа будут 3 черные клетки; ведущий 0- это пробел для разделения отображаемых цифр. 5соответствует {0,1,0,1}, то есть белым, черным, белым, черным клеткам.

Ниже приведен список правил замены:

Thread[ToString /@ Range[0, 9] -> StringPartition["75557262277174771717557117471774757711117575775717", 5]]

{"0" -> "75557", "1" -> "26227", "2" -> "71747", "3" -> "71717", "4" -> "55711", "5" - > "74717", "6" -> "74757", "7" -> "71111", "8" -> "75757", "9" -> "75717"}

Обратите внимание, что при 3вводе он будет заменен на 71717 Это представление выражается в двоичном виде:

p = Partition[IntegerDigits[FromDigits["3" /. {"3" -> "71717"}, 16], 2, 20], 4]

{{0, 1, 1, 1}, {0, 0, 0, 1}, {0, 1, 1, 1}, {0, 0, 0, 1}, {0, 1, 1, 1} }

Его черно-белая обратная сторона определяется простым обменом 1s и 0s.

q = p /. {0 -> 1, 1 -> 0}

{{1, 0, 0, 0}, {1, 1, 1, 0}, {1, 0, 0, 0}, {1, 1, 1, 0}, {1, 0, 0, 0} }


Давайте посмотрим, что pи qкак выглядит при отображении ArrayPlot:

ArrayPlot[#, Mesh -> True, ImageSize -> Small, PlotLegends -> Automatic] & /@ {p, q}

пись


Это просто объединяет массивы нулей и единиц для каждой цифры перед рендерингом большого массива через ArrayPlot. *определяется jкак окончательное вертикальное пространство после последней цифры.

Thread[Join @@ Transpose /@ j /@ Characters@(s <> "*")]
DavidC
источник