ระหว่างเส้น


31

ป้อนคำอธิบายรูปภาพที่นี่

ในขณะที่ดูเดิลไปรอบ ๆ บนกระดาษสี่เหลี่ยมจตุรัสในวันอื่น ๆ ฉันพบว่ามีฟอนต์พื้นที่ว่างด้านบนเป็นตัวเลข ในกรณีที่คุณไม่ได้เห็นมันยังช่องว่างระหว่างรูปทรงดังกล่าวข้างต้นให้ผลผลิตอัตราส่วนทองคำ1.618033988749 ในการท้าทายนี้งานของคุณคือนำตัวเลขเป็นอินพุตและแสดงตามตัวอย่างที่แสดงด้านบน

นี่คือวิธีการสร้างสิ่งเหล่านี้ เส้นทั้งหมดจะอยู่ในกริดปกติเพื่อให้แต่ละหลักประกอบด้วยเซลล์กริดจำนวนน้อย นี่คือรูปทรงของตัวเลข 10 หลัก (เราจะละเว้นจุดทศนิยมสำหรับความท้าทายนี้):

ป้อนคำอธิบายรูปภาพที่นี่
ใช่7แตกต่างจากตัวอย่างอัตราส่วนทองคำที่ด้านบน ฉันคิดว่าเป็นอย่างนั้น เราจะไปกับอันนี้

ขอให้สังเกตว่าแต่ละหลักสูงห้าเซลล์และสามเซลล์กว้าง ในการแสดงตัวเลขคุณสามารถจินตนาการถึงการวางตัวเลขทั้งหมดไว้ข้างๆกันเช่นมีคอลัมน์ว่างหนึ่งคอลัมน์ระหว่างตัวเลขแต่ละคู่ ตัวอย่างเช่นรับ319อินพุตเราจะเขียน:

ป้อนคำอธิบายรูปภาพที่นี่

โปรดสังเกตว่าเราเพิ่มหนึ่งคอลัมน์ที่ว่างนำหน้าและต่อท้าย ตอนนี้เรากลับเซลล์:

ป้อนคำอธิบายรูปภาพที่นี่

ผลลัพธ์ควรเป็นขอบเขตของรูปหลายเหลี่ยมที่เป็นผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่

แน่นอนคุณอาจสร้างผลลัพธ์ด้วยวิธีอื่นตราบใดที่เอาต์พุตที่แสดงนั้นมีลักษณะเหมือนกัน

อินพุต

  • คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นรับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด) อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ฟังก์ชันเป็นสตริงหรือรายการตัวเลข (คุณไม่สามารถรับตัวเลขได้เนื่องจากจะไม่อนุญาตให้คุณสนับสนุนศูนย์นำหน้า)
  • คุณอาจคิดว่าจะไม่มีตัวเลข 16 หลักในอินพุต

เอาท์พุต

  • ผลลัพธ์อาจปรากฏบนหน้าจอหรือเขียนลงไฟล์ในรูปแบบภาพทั่วไป
  • คุณสามารถใช้กราฟิกแรสเตอร์และเวคเตอร์
  • ไม่ว่าในกรณีใดอัตราส่วนของเซลล์ของกริดพื้นฐานต้องเป็น 1 (นั่นคือเซลล์ควรเป็นกำลังสอง)
  • ในกรณีของกราฟิกแรสเตอร์แต่ละเซลล์ควรครอบคลุมอย่างน้อย 20 คูณ 20 พิกเซล
  • บรรทัดต้องไม่กว้างกว่า 10% ของขนาดเซลล์ ฉันยินดีที่จะให้ระยะห่างหนึ่งหรือสองพิกเซลเนื่องจากนามแฝงที่นี่
  • เส้นและพื้นหลังสามารถเป็นสองสีที่แตกต่างอย่างชัดเจน แต่รูปร่างที่สร้างโดยเส้นจะต้องไม่เติม
  • จะต้องไม่มีช่องว่างในแต่ละวงปิด
  • แน่นอนผลลัพธ์ทั้งหมดจะต้องปรากฏให้เห็น

กรณีทดสอบ

ต่อไปนี้คืออินพุต 10 ตัวซึ่งรวมกันครอบคลุมทุกคู่ที่เป็นไปได้ของตัวเลขที่อยู่ติดกันรวมถึงตัวเลขนำหน้าและต่อท้ายที่เป็นไปได้ทั้งหมด:

07299361548
19887620534
21456837709
39284106657
49085527316
59178604432
69471338025
79581224630
89674235011
97518264003

และนี่คือผลลัพธ์ที่คาดหวังสำหรับสิ่งเหล่านั้น:

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

ตรวจสอบให้แน่ใจว่ารหัสของคุณใช้งานได้เมื่อได้รับตัวเลขหนึ่งตัว (ฉันไม่ต้องการรวมผลลัพธ์ที่คาดไว้ที่นี่เพราะควรจะชัดเจนและส่วนของกรณีทดสอบนั้นค่อนข้างแน่นพอแล้ว)


ASCII art จะได้รับการยอมรับหรือไม่?
สีฟ้า

2
@Blue ฉันคิดว่ามันจะทำให้งานแตกต่างกันมากและคำตอบก็แทบจะเทียบเคียงไม่ได้เลยขอโทษด้วย โดยทั่วไปฉันไม่ได้เป็นแฟนของการผสมเอาท์พุทกราฟิกและศิลปะ ASCII ในความท้าทาย
Martin Ender

เอาล่ะขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว
Blue

อนุญาตให้นำเข้าแบบอักษรหรือไม่
Marv

@ Marv หืมคำถามที่น่าสนใจ ฉันว่าคุณควรนับขนาดของไฟล์ฟอนต์ในกรณีนั้น
Martin Ender

คำตอบ:


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 ไบต์หลังจาก tokenisation (ตัวอย่าง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 แบบพื้นฐานใช้ 2 หน่วย = 1 พิกเซลในโหมดนี้ดังนั้นเซลล์จึงมีขนาด 32x32 พิกเซล

ป้อนคำอธิบายรูปภาพที่นี่


10

Octave, 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'

Convolution คือกุญแจสู่ความสำเร็จ


ขอขอบคุณสำหรับการปรับปรุง @LuisMendo คะแนนโดยพวงของไบต์ = บริการ)
flawr

2
ฉันไม่เห็นด้วยมากขึ้นกับConvolution คือกุญแจสู่ความสำเร็จ :-)
Luis Mendo

ยังไงก็เถอะนี่คือคำขวัญสำหรับคำตอบที่ประสบความสำเร็จของฉัน 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])

อัตราผลตอบแทน:

ตัวอย่างผลลัพธ์


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>

น้อย golfed

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

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 มันไม่ได้
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))

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

lol ที่เขียนไปยังดิสก์แล้วอ่านจากดิสก์แก้ไขไปเติมสีดำ


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

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

pic


คำอธิบาย

สี่บิตจะถูกใช้ในแต่ละเซลล์ 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, 1, 0}, {1, 0, 0, 0} }


ลองดูสิ่งที่pและqมีลักษณะเหมือนเมื่อแสดงโดยArrayPlot:

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

Pis


ArrayPlotนี้ก็ร่วมอาร์เรย์ของศูนย์และคนในแต่ละหลักก่อนการแสดงผลอาร์เรย์ใหญ่ผ่าน *ถูกกำหนดให้jเป็นพื้นที่แนวตั้งสุดท้ายหลังจากเลขท้ายสุดท้าย

Thread[Join @@ Transpose /@ j /@ Characters@(s <> "*")]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.