Entre líneas

31

ingrese la descripción de la imagen aquí

Mientras garabateaba en papel de regla cuadrada el otro día, se me ocurrió la fuente de espacio negativo anterior para dígitos. En caso de que aún no lo haya visto, los espacios entre las formas anteriores producen la proporción dorada 1.618033988749 . En este desafío, su tarea es tomar un número como entrada y representarlo exactamente como se muestra en el ejemplo anterior.

Así es como se crean estos. Todas las líneas estarán en una cuadrícula regular, de modo que los dígitos individuales estén formados por un pequeño número de celdas de la cuadrícula. Aquí están las formas de los 10 dígitos (ignoraremos el punto decimal para este desafío):

ingrese la descripción de la imagen aquí
Sí, el 7 difiere del ejemplo de la proporción áurea en la parte superior. Lo arruiné un poco. Iremos con este.

Observe que cada dígito tiene cinco celdas de alto y tres celdas de ancho. Para representar un número, puede imaginarse colocando todos sus dígitos uno al lado del otro, de modo que haya exactamente una columna vacía entre cada par de dígitos. Por ejemplo, tomando 319como entrada, escribiríamos:

ingrese la descripción de la imagen aquí

Observe que agregamos una columna vacía inicial y final. Ahora invertimos las células:

ingrese la descripción de la imagen aquí

La salida debería ser los límites de los polígonos resultantes:

ingrese la descripción de la imagen aquí

Por supuesto, puede generar el resultado de cualquier otra manera, siempre que la salida representada tenga el mismo aspecto.

Entrada

  • Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función, como una cadena o lista de dígitos. (No puede tomar un número ya que eso no le permitiría admitir ceros iniciales).
  • Puede suponer que no habrá más 16 dígitos en la entrada.

Salida

  • La salida puede mostrarse en la pantalla o escribirse en un archivo en un formato de imagen común.
  • Puede usar tanto gráficos de trama como gráficos vectoriales.
  • En cualquier caso, la relación de aspecto de las celdas de la cuadrícula subyacente debe ser 1 (es decir, las celdas deben ser cuadrados).
  • En el caso de los gráficos de trama, cada celda debe cubrir al menos 20 por 20 píxeles.
  • Las líneas no deben ser más anchas que el 10% del tamaño de la celda. Estoy dispuesto a dejar uno o dos píxeles de margen debido al alias aquí.
  • Las líneas y el fondo pueden ser dos colores claramente distinguibles, pero las formas creadas por las líneas no deben rellenarse (es decir, el interior también debe ser el color de fondo).
  • No debe haber huecos dentro de cada circuito cerrado.
  • Por supuesto, todo el resultado debe ser visible.

Casos de prueba

Aquí hay 10 entradas, que juntas cubren todos los pares posibles de dígitos adyacentes, así como todos los dígitos iniciales y finales posibles:

07299361548
19887620534
21456837709
39284106657
49085527316
59178604432
69471338025
79581224630
89674235011
97518264003

Y aquí están los resultados esperados para aquellos:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Asegúrese de que su código también funcione cuando se le da un solo dígito (no quiero incluir los resultados esperados aquí, porque deberían ser obvios, y la sección del caso de prueba está lo suficientemente hinchada como está).

Martin Ender
fuente
¿Sería aceptado el arte ASCII?
Azul
2
@Blue Creo que eso sería una tarea muy diferente, y las respuestas serían apenas comparables, así que no, lo siento. Generalmente no soy fanático de mezclar resultados gráficos y arte ASCII en un solo desafío.
Martin Ender
Muy bien, gracias por la respuesta rápida
Azul
¿Está permitido importar fuentes?
Marv
@Marv hm, pregunta interesante. Yo diría que debería contar el tamaño del archivo de fuente en ese caso.
Martin Ender

Respuestas:

1

BBC BASIC, 182 caracteres ASCII (tamaño de archivo tokenizado de 175 bytes)

Descargue el intérprete en 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.

Puntuación: cuando el programa anterior se pega en el editor y se ejecuta, el editor expandirá las palabras clave abreviadas a palabras clave completas en pantalla, aunque en realidad solo son 1 byte después de la tokenización. (Ejemplo I.= INPUTespacio de almacenamiento de 1 byte).

Explicación

Simplemente explicaré lo que hace la línea VDU: dibuja un cuadro cambiando un poco el color de píxel actual en la pantalla. Esto significa que (con un poco de cuidado con las esquinas) es posible simplemente dibujar una celda una al lado de la otra, y el borde intermedio se cancelará y desaparecerá debido al doble dibujo.

Un examen detallado revelará que se dibujan las esquinas superior derecha e inferior izquierda de una celda, pero faltan las partes superior izquierda e inferior derecha ("redondeadas") para que esto funcione.

Después de que se dibuja la celda, el cursor de gráficos se mueve hacia arriba 32 píxeles listo para dibujar la siguiente celda.

El resto del programa es una descompresión de mapa de bits ASCII bastante sencilla. Las dimensiones de la celda son 64x64 unidades para golf / compatibilidad con la forma en que se descomprime el mapa de bits. qcontrola el tamaño de la celda que se traza: 64x64 unidades para una celda que está presente, 0x0 para una celda que está ausente.

Código sin golf

  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

Salida

Los MOVEs solo llevan la salida a las alturas apropiadas en la pantalla. BBC basic utiliza 2 unidades = 1 píxel en este modo, por lo que las celdas son en realidad 32x32 píxeles.

ingrese la descripción de la imagen aquí

Level River St
fuente
10

Octava, 233 225 216 213 bytes

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)

Aquí el primer caso de prueba (de una captura de pantalla redimensionada, st se ajusta a mi monitor =): ingrese la descripción de la imagen aquí

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)

La entrada puede tener una longitud arbitraria, como p. Ej. '07299361548'

La convolución es la clave del éxito.

falla
fuente
Gracias @LuisMendo por mejorar la puntuación en
varios
2
No podría estar más de acuerdo con Convolution es la clave del éxito :-)
Luis Mendo
De alguna manera, este es siempre el lema de mis exitosas respuestas matlab / octava: D
flawr
5

Javascript ES6, 506 bytes

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()}}

Sin golf:

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

Supone que hay <body>que agregar el lienzo, probado en Firefox 46.

Ejemplo ejecutado (asignando una función anónima a f):

f([1,0,3])

rendimientos:

Salida de ejemplo

Dendrobium
fuente
5

HTML + JavaScript ES6, 352

Prueba a ejecutar el fragmento a continuación

<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>

Menos golf

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
fuente
1
No creo que necesites la etiqueta de cierre del script ...
Mama Fun Roll
3

Java, 768 bytes

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"));}}

Sin golf

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"));
    }
}

Notas

  • La entrada es una sola cadena como argumento. Modo de empleo: javac G.java,java G 80085

  • Estoy comenzando con un lienzo negro, luego agrego los números como positivos en blanco. Creo una copia de la imagen y luego volteo cada píxel negro que tiene 4 vecinos negros en la imagen original.

Salidas

0 0 1 2 3 4 4 5 5 6 6 7 7 8 9 9

Algunos dígitos individuales:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Marv
fuente
java.awt. * no contiene java.awt.image.BufferedImage?
Element118
@ Element118 no lo hace.
Marv
2

R, demasiados bytes para jugar al golf ( 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))

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

jajaja al escribir en el disco, luego leer desde el disco editar el relleno negro

Vlo
fuente
2

Python 3, 326 325 bytes

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
fuente
2
Iba a comentar esto en una de sus otras respuestas el otro día, pero range(3)nunca vale la pena.
Sp3000
1

C #, 768 773 776 bytes

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");}}}

Toma el número como argumento de línea de comando. Emite una imagen BMP bonita, limpia y sin alias con el número como nombre.

Original antes del golf:

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");
        }
    }
}
Thomas Weller
fuente
1

Mathematica 328 bytes

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"]

Foto


Explicación

Se utilizarán cuatro bits en cada una de las 5 líneas de celdas para cada dígito de entrada.

"75557262277174771717557117471774757711117575775717"representa de 0 a 9 como mapas de bits.

Los primeros 5 dígitos en el entero grande anterior, es decir, 75557cómo se debe mostrar cada fila de matriz para cero. 7representará {0,1,1,1}, es decir, una celda blanca, seguida, a su derecha, por 3 celdas negras; el inicio 0es un espacio en blanco para separar los dígitos mostrados. 5corresponde a {0,1,0,1}, que es blanco, negro, blanco, celdas negras.

Lo siguiente produce una lista de reglas de reemplazo:

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"}

Tenga en cuenta que cuando 3se ingresa, se reemplazará por 71717 Esta representación se expresa en binario:

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} }

Su inversa negro-blanco se encuentra simplemente intercambiando las 1s y 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} }


Veamos qué aspecto py cómo se qve cuando lo muestra ArrayPlot:

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

pis


Esto simplemente une las matrices de ceros y unos para cada dígito antes de representar la matriz grande a través de ArrayPlot. *se define jcomo el espacio vertical final después del último dígito.

Thread[Join @@ Transpose /@ j /@ Characters@(s <> "*")]
DavidC
fuente