선 사이


31

여기에 이미지 설명을 입력하십시오

며칠 전에 정사각형 종이에 낙서를하면서 위의 음수 글꼴을 숫자로했습니다. 아직 발견하지 않은 경우 위 모양 사이의 공간이 1.618033988749 의 황금 비율을 나타냅니다 . 이 도전에서, 당신의 임무는 숫자를 입력으로 취해서 위의 예에서 보여 지듯이 정확하게 렌더링하는 것입니다.

이것들이 어떻게 만들어 지는가. 모든 줄은 일반 격자에 있으므로 개별 숫자는 적은 수의 격자 셀로 구성됩니다. 10 자리의 모양은 다음과 같습니다 (이 문제의 소수점은 무시합니다).

여기에 이미지 설명을 입력하십시오
예, 7 은 상단의 황금 비율 예와 다릅니다. 나는 약간 엉망. 우리는 이것으로 갈 것입니다.

각 숫자는 키가 5 셀이고 너비가 3 셀입니다. 숫자를 렌더링하려면 각 숫자 쌍 사이에 정확히 하나의 빈 열이 있도록 모든 숫자를 서로 옆에 배치하는 것을 상상할 수 있습니다. 예를 들어, 319입력으로 받아들이면 다음 과 같이 작성합니다.

여기에 이미지 설명을 입력하십시오

하나의 선행 및 후행 빈 열을 추가합니다. 이제 우리는 세포를 뒤집습니다.

여기에 이미지 설명을 입력하십시오

그런 다음 결과는 결과 다각형의 경계 여야합니다.

여기에 이미지 설명을 입력하십시오

물론 렌더링 된 출력이 동일하게 보이는 한 다른 방식으로 결과를 생성 할 수 있습니다.

입력

  • STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을 문자열 또는 숫자 목록으로 사용하여 프로그램 또는 함수를 작성할 수 있습니다. (앞의 0을 지원할 수 없으므로 숫자를 사용할 수 없습니다.)
  • 입력에 16 자리가 더 이상 없을 것이라고 가정 할 수 있습니다.

산출

  • 출력은 화면에 표시되거나 일반적인 이미지 형식으로 파일에 기록 될 수 있습니다.
  • 래스터 및 벡터 그래픽을 모두 사용할 수 있습니다.
  • 어느 경우 에나, 기본 그리드의 셀의 종횡비는 1이어야합니다 (즉, 셀은 정사각형이어야 함).
  • 래스터 그래픽의 경우 각 셀은 최소 20 x 20 픽셀을 포함해야합니다.
  • 선은 셀 크기의 10 %를 넘지 않아야합니다. 여기에 앨리어싱으로 인해 하나 또는 두 개의 픽셀을 줄이려고합니다.
  • 선과 배경은 명확하게 구별 할 수있는 두 가지 색상이 될 수 있지만 선으로 만든 모양은 채워서는 안됩니다 (즉, 내부도 배경색이어야 함).
  • 닫힌 루프마다 틈이 없어야합니다.
  • 물론 전체 결과를 볼 수 있어야합니다.

테스트 사례

여기에 가능한 모든 선행 및 후행 숫자뿐만 아니라 가능한 모든 인접 숫자 쌍을 포함하는 10 개의 입력이 있습니다.

07299361548
19887620534
21456837709
39284106657
49085527316
59178604432
69471338025
79581224630
89674235011
97518264003

그 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

한 자릿수가 주어지면 코드가 작동하는지 확인하십시오 (예상되는 결과를 포함하고 싶지 않으며 테스트 사례 섹션이 충분히 부풀어 오르기 때문에 여기에 포함하고 싶지 않습니다).


ASCII 아트가 허용됩니까?
Blue

2
@Blue 나는 그것이 매우 다른 작업을 할 것이라고 생각하고 대답은 거의 비교할 수 없으므로 미안합니다. 나는 일반적으로 한 번의 도전으로 그래픽 출력과 ASCII 아트를 혼합하는 팬이 아닙니다.
마틴 엔더

좋아요, 빠른 답변 감사합니다
Blue

글꼴을 가져올 수 있습니까?
Marv

@Marv hm, 흥미로운 질문입니다. 이 경우 글꼴 파일의 크기를 계산해야한다고 말하고 싶습니다.
마틴 엔더

답변:


1

BBC 기본, ASCII 문자 182 자 (토큰 파일 크기는 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

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

산출

MOVE들 바로 출력이 화면에 높이를 적절한 얻을 수 있습니다. BBC 기본 모드에서는이 모드에서 2 단위 = 1 픽셀을 사용하므로 셀은 실제로 32x32 픽셀입니다.

enter image description here


10

옥타브, 233225216 바이트

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)

다음은 첫 번째 테스트 사례입니다 (크기 조정 된 화면 캡처에서 내 모니터에 맞습니다). enter image description here

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'

컨볼 루션은 성공의 열쇠입니다.


바이트 수로 점수를 향상시켜 준 @LuisMendo에게 감사드립니다 =)
flawr

2
컨볼 루션이 성공의 열쇠라는 데 더 동의 할 수 없었 습니다 :-)
Luis Mendo

어떻게 든 이것은 항상 내 성공적인 matlab / 옥타브 답변의 모토입니다 : D
flawr

5

자바 스크립트 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()}}

언 골프 드 :

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

수율 :

Example output


5

HTML + 자바 스크립트 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()

1
나는 당신이 닫는 스크립트 태그가 필요하다고 생각하지 않습니다 ...
Mama Fun Roll

3

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

언 골프

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

한 자리 숫자 :

enter image description here enter image description here


java.awt. *는 java.awt.image.BufferedImage를 포함하지 않습니까?
Element118

@ Element118 그렇지 않습니다.
Marv

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

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

디스크에 쓸 때 lol, 디스크에서 읽을 때 검은 색 채우기를 편집하십시오.


2

파이썬 3, 326325 바이트

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
나는 다른 날 당신의 다른 답변 중 하나에 이것을 언급하려고했지만 range(3)결코 가치가 없습니다.
Sp3000

1

C #, 768773776 바이트

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

pic


설명

각 입력 숫자에 대해 5 개의 셀 라인에 4 비트가 사용됩니다.

"75557262277174771717557117471774757711117575775717"비트 맵으로 0-9를 나타냅니다.

위의 큰 정수의 처음 5 자리 숫자, 즉 755570에 대한 각 배열 행이 표시되는 방법을 나타냅니다. , 즉 백색 세포 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} }


다음에 의해 표시 될 때의 모습 pq모양을 살펴 보겠습니다 ArrayPlot.

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

pis


이것은 단순히 큰 배열을 통해 렌더링하기 전에 각 숫자에 대해 0과 1의 배열을 결합합니다 ArrayPlot. 마지막 자리 뒤의 최종 수직 공간으로 *정의됩니다 j.

Thread[Join @@ Transpose /@ j /@ Characters@(s <> "*")]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.