Tra le linee


31

inserisci qui la descrizione dell'immagine

Mentre scarabocchiavo su carta a quadretti l'altro giorno, ho trovato il carattere sopra lo spazio negativo per le cifre. Nel caso in cui non l'avessi ancora individuato, gli spazi tra le forme sopra riportate producono il rapporto aureo 1.618033988749 . In questa sfida, il tuo compito è prendere un numero come input e renderlo esattamente come mostrato nell'esempio sopra.

Ecco come vengono creati. Tutte le linee saranno su una griglia regolare, in modo che le singole cifre siano costituite da un piccolo numero di celle della griglia. Ecco le forme delle 10 cifre (ignoreremo il punto decimale per questa sfida):

inserisci qui la descrizione dell'immagine
Sì, il 7 differisce dall'esempio del rapporto aureo in alto. L'ho un po 'incasinato. Andremo con questo.

Si noti che ogni cifra è alta cinque celle e larga tre celle. Per rendere un numero, puoi immaginare di posizionare tutte le sue cifre una accanto all'altra, in modo che ci sia esattamente una colonna vuota tra ogni coppia di cifre. Ad esempio, prendendo 319come input, scriveremmo:

inserisci qui la descrizione dell'immagine

Si noti che aggiungiamo una colonna vuota iniziale e finale. Ora invertiamo le celle:

inserisci qui la descrizione dell'immagine

L'output dovrebbe quindi essere i confini dei poligoni risultanti:

inserisci qui la descrizione dell'immagine

Naturalmente è possibile generare il risultato in qualsiasi altro modo, a condizione che l'output del rendering appaia lo stesso.

Ingresso

  • È possibile scrivere un programma o una funzione, prendendo input tramite STDIN (o l'alternativa più vicina), argomento della riga di comando o argomento della funzione, come una stringa o un elenco di cifre. (Non puoi prendere un numero in quanto ciò non ti permetterebbe di supportare gli zeri iniziali.)
  • Si può presumere che non ci saranno più 16 cifre nell'input.

Produzione

  • L'output può essere visualizzato sullo schermo o scritto su un file in un formato immagine comune.
  • È possibile utilizzare sia grafica raster che grafica vettoriale.
  • In entrambi i casi, le proporzioni delle celle della griglia sottostante devono essere 1 (ovvero, le celle dovrebbero essere quadrate).
  • Nel caso della grafica raster, ogni cella dovrebbe coprire almeno 20 per 20 pixel.
  • Le linee non devono essere più larghe del 10% della dimensione della cella. Sono disposto a dare uno o due pixel di libertà a causa dell'aliasing qui.
  • Le linee e lo sfondo possono essere due colori chiaramente distinguibili, ma le forme create dalle linee non devono essere riempite (ovvero gli interni dovrebbero essere anche il colore di sfondo).
  • Non ci devono essere spazi vuoti all'interno di ogni circuito chiuso.
  • Naturalmente, l'intero risultato deve essere visibile.

Casi test

Ecco 10 ingressi, che insieme coprono tutte le possibili coppie di cifre adiacenti, nonché ogni possibile cifra iniziale e finale:

07299361548
19887620534
21456837709
39284106657
49085527316
59178604432
69471338025
79581224630
89674235011
97518264003

Ed ecco i risultati attesi per quelli:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Assicurati che il tuo codice funzioni anche quando ti viene data una sola cifra (non voglio includere qui i risultati previsti, perché dovrebbero essere ovvi e la sezione del test case è abbastanza gonfia così com'è).


L'arte ASCII sarebbe accettata?
Blue

2
@Blue Penso che ciò comporterebbe un compito molto diverso, e le risposte sarebbero difficilmente comparabili, quindi no, scusa. In genere non sono un fan del mix di output grafico e arte ASCII in un'unica sfida.
Martin Ender,

va bene, grazie per la rapida risposta
Blue

È consentito importare caratteri?
Marv,

@Marv hm, domanda interessante. Direi che dovresti contare la dimensione del file del font in quel caso.
Martin Ender,

Risposte:


1

BBC BASIC, 182 caratteri ASCII (dimensione file tokenizzata 175 byte)

Scarica l'interprete su 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.

Punteggio: quando il programma sopra è incollato nell'editor ed eseguito, l'editor espande le parole chiave abbreviate in parole chiave complete sullo schermo, sebbene in realtà siano solo 1 byte dopo la tokenizzazione. (Esempio I.= INPUTspazio di archiviazione 1 byte.)

Spiegazione

Spiegherò semplicemente cosa fa la linea VDU: disegna una scatola capovolgendo il colore del pixel corrente sullo schermo. Ciò significa che (con un po 'di attenzione agli angoli) è possibile semplicemente disegnare una cella una accanto all'altra e il bordo intermedio si annullerà e scomparirà a causa del doppio disegno.

Un attento esame rivelerà che gli angoli in alto a destra e in basso a sinistra di una cella sono disegnati ma mancano quelli in alto a sinistra e in basso a destra ("arrotondati") per farlo funzionare.

Dopo che la cella viene disegnata, il cursore grafico viene spostato verso l'alto di 32 pixel pronto per la successiva cella da disegnare.

Il resto del programma è una decompressione bitmap ASCII abbastanza semplice. Le dimensioni della cella sono 64x64 unità per il golf / compatibilità con il modo in cui la bitmap viene decompressa. qcontrolla la dimensione della cella tracciata: unità 64x64 per una cella presente, 0x0 per una cella assente.

Codice Ungolfed

  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

Produzione

Gli MOVEs ottengono solo l'output ad altezze appropriate sullo schermo. BBC Basic utilizza 2 unità = 1 pixel in questa modalità, quindi le celle sono in realtà 32x32 pixel.

inserisci qui la descrizione dell'immagine


10

Ottava, 233 225 216 213 byte

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)

Ecco il primo caso di test (da una cattura dello schermo ridimensionata, st si adatta al mio monitor =): inserisci qui la descrizione dell'immagine

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)

L'ingresso può essere di lunghezza arbitraria, come ad es '07299361548'

La convoluzione è la chiave del successo.


Grazie @LuisMendo per aver migliorato il punteggio di un sacco di byte =)
flawr

2
Non potrei essere più d'accordo con Convolution: la chiave del successo :-)
Luis Mendo,

In qualche modo questo è sempre il motto per le mie risposte matlab / ottave di successo: D
flawr

5

Javascript ES6, 506 byte

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

Suppone che ci sia un <body>a cui aggiungere il canvas, testato in Firefox 46.

Esempio di esecuzione (assegnazione della funzione anonima a f):

f([1,0,3])

rendimenti:

Esempio di output


5

HTML + JavaScript ES6, 352

Prova a eseguire lo snippet di seguito

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

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

1
Non credo che ti serva il tag di chiusura dello script ...
Mama Fun Roll

3

Java, 768 byte

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

Gli appunti

  • L'input è una singola stringa come argomento. Come usare: javac G.java,java G 80085

  • Sto iniziando con una tela nera, quindi aggiungo i numeri come positivi bianchi. Creo una copia dell'immagine e poi capovolgo ogni pixel nero che ha 4 vicini neri sull'immagine originale.

Uscite

0 1 2 3 4 5 6 7 8 9

Alcune cifre singole:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


java.awt. * non contiene java.awt.image.BufferedImage?
Element118,

@ Element118 no.
Marv,

2

R, troppi byte per il 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))

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

lol a scrivere su disco, quindi leggere da disco modifica il riempimento nero.


2

Python 3, 326 325 byte

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

2
L'altro giorno avrei commentato una delle tue altre risposte, ma range(3)non ne vale la pena.
Sp3000,

1

C #, 768 773 776 byte

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

Prende il numero come argomento della riga di comando. Produce un'immagine BMP piacevole, pulita e senza alias con il numero come nome.

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

1

Mathematica 328 byte

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

pic


Spiegazione

Verranno utilizzati quattro bit in ciascuna delle 5 righe di celle per ciascuna cifra di input.

"75557262277174771717557117471774757711117575775717"rappresenta da 0 a 9 come bitmap.

Le prime 5 cifre nell'intero grande sopra, in particolare 75557indicano come deve essere visualizzata ogni riga dell'array per zero. 7rappresenterà {0,1,1,1}, cioè, un globulo bianco, seguito, alla sua destra, da 3 globuli neri; il primo 0è uno spazio vuoto per separare le cifre visualizzate. 5corrisponde a {0,1,0,1}, cioè celle bianche, nere, bianche, nere.

Di seguito viene prodotto un elenco di regole di sostituzione:

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

Si noti che quando 3viene immesso, verrà sostituito da 71717 Questa rappresentazione è espressa in 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} }

Il suo inverso bianco-nero si trova semplicemente scambiando la 1s e la 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} }


Vediamo come pe qquando vengono visualizzati da ArrayPlot:

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

pis


Questo semplicemente unisce le matrici di zeri e di quelle per ogni cifra prima di eseguire il rendering della matrice grande tramite ArrayPlot. *è definito jcome lo spazio verticale finale dopo l'ultima cifra.

Thread[Join @@ Transpose /@ j /@ Characters@(s <> "*")]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.