g | x | w | all
Bytes Lang Time Link
058TinyVG250809T184953ZAdam
285Swift 6 + SwiftUI full app250705T135939ZmacOSist
050Uiua250704T211336ZErikDaPa
nanCSS+HTML250703T043752ZMiro
100PNG170602T153557ZMeyer
062MATL170531T222101ZLuis Men
072Postscript170901T221942ZMorgan H
19205AB1E210527T034413ZMakonede
291Applesoft Basic201216T102350Zroblogic
137Python 2170601T010635ZJonathan
236Java 10200805T144601ZKevin Cr
083TikZ + TeX plain TeX200602T131818ZJoe85AC
265Java 11 OpenJDK200305T161344Zgreinet
310Java 11 OpenJDK200305T094945Zmindover
113HTML & CSS190415T144922ZGust van
090Desmos190315T204521ZBenjamin
096CSS+HTML = 13+83 =190314T163752ZTheCopyr
180Excel VBA180221T204218ZTaylor R
111R170803T073143Zplannapu
125SmileBASIC180223T131814Z12Me21
113R170601T074324Zmschilli
685C++ using SFML170904T174516ZHatsuPoi
3106502 machine code C64170904T112521ZFelix Pa
173Tcl/Tk170902T085352Zsergiol
238Python 3 + PyGame170828T012734ZRyan McC
nanJavascript170605T015820ZVictor
700SVG/CSS170604T004149ZNihsotas
155HTML & CSS170531T192748ZUriel
055imagegen170612T045923ZMCMaster
301SVG170604T034046ZRaffi
133SVG + HTML170603T194144ZMeyer
080IA32 machine code170601T103948Zanatolyg
144Ruby170531T203908ZMark Tho
189OpenTuring170603T214500ZJeffmagm
137TIBASIC170602T114317Zfoxite
062Mathematica170531T192107ZZaMoC
198Processing170601T220348ZZep
264Lua + LÖVE170602T122107Zmanatwor
155LaTeX + Tikz170602T114436ZTonioElG
226Bash + ImageMagick170601T140213Zmanatwor
118Ruby with Shoes170602T101322Zmanatwor
134Processing170602T002310ZGeorge P
832Apple Swift iOS CoreGraphics/QuartzCore 832 Bytes170602T083234ZJacob Ki
236R 313170601T000458ZCCB60
391Bash + feh170601T084504Zuser4594
nanCSS+HTML170602T034809ZTheraot
nanGLSL fragment shader170531T222509ZFreyja
482Applesoft BASIC170531T193934ZMD XF
221Processing170601T205603ZCody
2212PHP170601T130313ZTitus
124Octave170531T200537ZStewie G
156gnuplot170601T075625Zuser3440
103Octave170601T103605ZTasos Pa
333C#170601T093046ZTheLetha
170Tikz170531T223603ZWheat Wi
309Python 2.7170531T215235ZJoe Habe
582Here is my answer in Tcl/Tk 17 lines170531T221547ZSean Woo
nanCSS+HTML170531T211953ZOctopus

TinyVG, 58 bytes

TinyVG is a vector graphics format designed to be “golfier” than SVG. It uses a binary format rather than an XML dialect. I wrote this answer to see how it compares in terms of size on a simple image. (According to this meta answer, direct image answers are allowed as long as they show non-trivial effort in golfing.)

Output of xxd -ps -u:

72560150626203FFFF108400000903000102010160600121602021012060
21212020020402250518184525181805451818254518184545181800

Converted to SVG:

<svg xmlns="http://www.w3.org/2000/svg" width="98" height="98" viewBox="0 0 98 98"><rect style="fill:#FFFFFF;stroke-linecap:round;stroke:#838183;stroke-width:2;" x="1" y="1" width="96" height="96"/><rect style="fill:#FFFFFF;stroke-linecap:round;stroke:#838183;stroke-width:2;" x="1" y="33" width="96" height="32"/><rect style="fill:#FFFFFF;stroke-linecap:round;stroke:#838183;stroke-width:2;" x="33" y="1" width="32" height="96"/><rect style="fill:#FFFFFF;stroke-linecap:round;stroke:#838183;stroke-width:2;" x="33" y="33" width="32" height="32"/><rect style="fill:#000000;stroke:none;" x="37" y="5" width="24" height="24"/><rect style="fill:#000000;stroke:none;" x="69" y="37" width="24" height="24"/><rect style="fill:#000000;stroke:none;" x="5" y="69" width="24" height="24"/><rect style="fill:#000000;stroke:none;" x="37" y="69" width="24" height="24"/><rect style="fill:#000000;stroke:none;" x="69" y="69" width="24" height="24"/></svg>

Explanation

# Header
72 56 01     # This is a TinyVG version 1 image.
50           # Coordinates are specified with 8-bit precision
             # and 0 fractional bits,
             # colors are encoded as 16-bit RGB (rrrrrggggggbbbbb).
62 62        # The size is 98×98.
03           # The image uses three colors:
FF FF        #   RGB code for white
10 84        #   RGB code for gray
00 00        #   RGB code for black

# Drawing commands
09           # Outline fill rectangles
03           #   4 rectangles
00           #   Fill with color #0 (white)
01           #   Outline with color #1 (gray)
02           #   2 pixels thick
01 01 60 60  #   x y width height
01 21 60 20  #   x y width height
21 01 20 60  #   x y width height
21 21 20 20  #   x y width height
02           # Fill rectangles
04           #   5 rectangles
02           #   Color #2 (black)
25 05 18 18  #   x y width height
45 25 18 18  #   x y width height
05 45 18 18  #   x y width height
25 45 18 18  #   x y width height
45 45 18 18  #   x y width height
00           # End of file
```

Swift 6 + SwiftUI (full app), 285 bytes

(only tested on macOS, but should work fine on other platforms)

import SwiftUI
@main struct A:App{let body:some Scene=WindowGroup{{ZStack{Color.white
VStack{ForEach([[0,1,0],[0,0,1],[1,1,1]],id:\.self){r in
HStack{ForEach(r,id:\.self){s in
ZStack{{Rectangle().stroke}()(.gray,9)
if s>0{Circle().fill(.black).padding()}}}}}}}.frame}()(300,300,.top)}}

A screenshot of the app running on macOS.

Uiua, 50 bytes

⬚0.5⌝↘˙⊂1/⊂≡(⍉/⊂)≡₂(⍉⬚0.5⌝↘˙⊂¯1)≡₀(⬚0◇-⌝↘⌈÷₂⟜↯˙⊂6)⋯2_4_7□↯˙⊂12 1

Result: enter image description here

Explanation:

⬚0.5⌝↘˙⊂1/⊂≡(⍉/⊂)≡₂(⍉⬚0.5⌝↘˙⊂¯1)≡₀(⬚0◇-⌝↘⌈÷₂⟜↯˙⊂6)⋯2_4_7□↯˙⊂12 1
                                                         ↯˙⊂12 1 => 12x12 white sqrs
                                                  ⋯2_4_7□        => [0, 1, 0] [0, 0, 1] [1, 1, 1]
                                ≡₀(⬚0◇-⌝↘⌈÷₂⟜↯˙⊂6)               => create a 6x6 black square in the middle of the white squares for each truthy idx
                 ≡₂(⍉⬚0.5⌝↘˙⊂¯1)                                 => create a grey outline on the right and bottom sides of each square
         /⊂≡(⍉/⊂)                                                => concatenate all squares to create one big square
⬚0.5⌝↘˙⊂1                                                        => finally create a grey outline on the top and left sides of the big square

Try it online!

CSS+HTML, 47+83=130 bytes

Modified from answer by @Octopus

td{background:#fff;font-size:3em;line-height:.4
<table bgcolor=gray><tr><td><td>•<td><tr><td><td><td>•<tr><td>•<td>•<td>•

PNG, 105 100 bytes

PNG image    (i.e. this image file)

Considering that HTML and other non-programming languages are allowed, I was curious to see how much I could golf a plain browser-displayable image, to serve as a baseline comparison. The result is compressed with the open-source tools optipng (-o7 -zm1-9 -strip all) and pngwolf. I also experimented with zopflipng, but the results were bigger. Other closed-source compression tools might be able to shave off a couple more bytes.

Image data in base64:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAA
fCAAAAAA6xUnlAAAAK0lEQVR42mM4gB8wHPgPAwf+M0DAf4TYqDwp
4Ydp0qg8ofBDqMXKGpXHDwDDq0qBspApTgAAAABJRU5ErkJggg==

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAA
    fCAAAAAA6xUnlAAAAK0lEQVR42mM4gB8wHPgPAwf+M0DAf4TYqDwp
    4Ydp0qg8ofBDqMXKGpXHDwDDq0qBspApTgAAAABJRU5ErkJggg==">

Edit I made the dots touch the cell top and bottom, to cause more repetitiveness in the pixel pattern and thus improve the compression ratio. But don't worry, a dot still only fills (79)/(99) ≈ 78% of its cell.


Non-standard PNG, 88 bytes

As pointed out by @anatolyg, there is some golfing potential by removing the IEND chunk (12 bytes). Technically, IEND is required by the standard. However, each PNG chunk includes its own size and checksum information. It is therefore not absolutely necessary to have an end-marker. And indeed, all browsers I tested can display the image without issue.

Unfortunately (or fortunately), this non-standard image is rejected by imgur, so I cannot actually upload it. This is the base64 encoding:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAA
fCAAAAAA6xUnlAAAAK0lEQVR42mM4gB8wHPgPAwf+M0DAf4TYqDwp
4Ydp0qg8ofBDqMXKGpXHDwDDq0qBspApTg==

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAA
fCAAAAAA6xUnlAAAAK0lEQVR42mM4gB8wHPgPAwf+M0DAf4TYqDwp
4Ydp0qg8ofBDqMXKGpXHDwDDq0qBspApTg==">

MATL, 74 69 68 64 62 bytes

4:6B&f,.5+w]'k.'5Y08W5$XG7lZG1$3ZG1tZG4:"@th1Kh'k'3$XG1Mbw3$XG

Try it at MATL Online! (It takes a few seconds.)

Output from the online interpreter:

enter image description here

Postscript (72 bytes)

00000000: 924e 337b 924e 337b 3088 0034 2034 9281  .N3{.N3{0..4 4..
00000010: 3420 3092 ad7d 9283 924d 3020 3492 ad7d  4 0..}...M0 4..}
00000020: 9283 924d 337b 3188 0132 2032 9280 3420  ...M3{1..2 2..4
00000030: 3092 ad7d 9283 327b 88fc 3492 ad31 8801  0..}..2{..4..1..
00000040: 3220 3292 807d 9283                      2 2..}..

Text version:

gsave 3{gsave 3{0 0 4 4 rectstroke 4 0 translate}repeat grestore 0 4 translate}repeat grestore 3{1 1 2 2 rectfill 4 0 translate}repeat 2{-4 4 translate 1 1 2 2 rectfill}repeat

More readable text version:

/R {1 1 2 2 rectfill}def
gsave
3 {gsave 3 {0 0 4 4 rectstroke 4 0 translate} repeat grestore 0 4 translate} repeat
grestore
3 {R 4 0 translate} repeat
2 {-4 4 translate R} repeat

05AB1E, 192 bytes

„P230D2•1Ù!}c¡”·?I%Úré$(₅È,ï₂¥%_ŸŸ7ÞÈŸÀā5ΩQKÓ<g‹öÖKζΩlá>ÑzHŠ@UY∍ŸµHÔy¥¥çì’hιιkΔ¶B᱑êÕá5jθô∊7”ËôAÓÞªx—Ú‘AyQ½ÝYÇD≠z!ÄŸ—'¡Uγ¥!ε+¿þn0^ƵнƵ%X₃8нÜEÃĀ82Îx'IΣн∍óιêZ±иoŽÐθ³ÿIèÉœRuÎ0DBh_ĆûÚ‹ÈûÉW1Ò₁•3в1»

Try it online! Outputs as a plain PGM.

Output (enlarged)

Hacker Emblem

Actual output size is 30x30.


„P230D2•...•3в1»  # trimmed program
„P2               # push literal
   30             # push literal...
     D            # twice
      2           # push literal
             в    # push list of base-10 values of base...
            3     # literal...
             в    # digits of...
       •...•      # 427541225056090484779390842559962277535356179915664563570852766785644784557400927981185964800417173067134497361607731953969389383383710765821962940570130871145015821269287935868419374755244532042313674055574776583016673806369314382290002772542995095921556681406703587909310388486054711832330497506948107550678784337269482395576308349400348694552486117428881164944824595892240209460307603873442854698425661641130046746477556925533...
              1   # push literal
               »  # join stack by newlines, joining lists on the stack by spaces
                  # implicit output

Applesoft Basic, 405 291 bytes

0data51,29,73,51,73,73,51,73,29,73
1hgr:hcolor=3:fori=0to123:hplot0,i to123,i:next
2hcolor=0:fori=18to84step22:hplot18,i to84,i:hploti,18toi,84:next
3fori=1to5:reada,b:a=a+.5:b=b+.5:gosub8:next:end
8forr=1to9:hplota,b:forn=0to6.3step.1:y=sin(n)*r:x=cos(n)*r:hplottoa+x,b+y
9next:next:return

0data... locates the circles. 1hgr... draws white background. 2hcolor... draws grid. 3for..read.. gets data & calls the circle subroutine. (.5 is added at various points because of quirky Apple II drawing logic). 8for... to 9..return draws circles. (circle code adapted from hoist-point.com). Verified at https://www.calormen.com/jsbasic/

Python 2,  169 140  137 bytes

from turtle import*
up()
shape("square")
color("gray",[1]*3)
i=9
while i:i-=1;goto(20-i/3*20,i%3*20-20);stamp();209&2**i or dot(15,0,0,0)

Actual size, 61 by 61, plotted within a much larger canvas of 300 by 400:

actual size

Showing the pixel grid:

pixel grid version

The dots use 177 pixels within the range of 40%-80% whether considering the 19 by 19 white fill (144.4-288.8) or the 21 by 21 including both borders (176.4-352.8).

Note: the program terminates and closes the canvas window as soon as the drawing has been finished, to allow manual window closure append the line done().

turtle is a Python package developed for introductory graphical programming. A pen starts at x,y=0,0 in the middle of a 300 by 400 pixel canvas (by default), up lifts the pen, goto moves the pen, shape sets the shape of the pen to a named shape ("square" is a predefined shape with a default pixel-width of 21), color sets the colour, where two parameters set stroke (with default a width of 1) and fill; a byte is saved by using the (r,g,b) tuple option to replace "white" with [1,1,1] using the list multiplication [1]*3. Finally dot draws a dot with the given width in pixels and colour. The dot's default width value is too small to qualify, as is 9 so I made it an aesthetic and qualifying 15. The dot's colour could be "black" but the unpacked (r,g,b) tuple of 0,0,0 is shorter by two bytes.

The pen must move away from any dot at the end since otherwise the gray/white pen hides the dot.

The grid is traversed using a div (/) and mod (%) of i starting at 8 (i is initialised to 9 but is decremented at the beginning of the while loop) and working down to 0, offsetting the results of 2,1,0 to -1,0,1 using (1-...) and scaling each up to the grid size using a factor of 20 (note that 20-i/3*20 is actually a byte less than 20*(1-i/3), same goes for %). This produces the order [bottom-left, centre-left, top-left, bottom-middle, centre-middle, top-middle, bottom-right, centre-right, top-right], and requires a "hasDot" evaluation of [1,0,0,1,0,1,1,1,0], which is 302 in binary so may be accessed by inspecting the ith power of two component of 302 with using a bitwise-and, 302&2**i. This can then be inverted to 209&2**1 enabling the use of or rather than and.

Java 10, 242 236 bytes

import java.awt.*;v->new Frame(){{add(new Panel(){public void paint(Graphics g){for(int i=9,t;i-->0;g.setColor(Color.BLACK),g.fillOval(t%3*10+1,t/3*10+1,8,8),g.setColor(Color.GRAY),g.drawRect(i%3*10,i/3*10,10,10))t=i>4?i:1;}});show();}}

-6 bytes thanks to @ceilingcat.

Screenshot of the actual 30x30 pixels result:

enter image description here

Screenshot of the ten times larger 300x300 result:

enter image description here

Explanation:

import java.awt.*;            // Required import for almost everything
v->                           // Method with empty unused parameter and Frame return-type
  new Frame(){                //  Create the Frame
   {                          //   In an inner code-block:
     add(new Panel(){         //    Add a Panel we can draw on:
       public void paint(Graphics g){
                              //     Overwrite its paint method:
         for(int i=9,t;i-->0  //      Loop `i` in the range (9, 0]:
             ;                //        After every iteration:
              g.setColor(Color.BLACK),
                              //         Set the color to black
              g.fillOval(     //         Draw a solid circle:
                t%3*10+1,,    //          At x-coordinate t%3*10 + 1
                t/3*10+1,     //          At y-coordinate t//3*10 + 1
                8,8),         //          Of size 8x8 pixels (80%)
              g.setColor(Color.GRAY),
                              //         Then change the color to gray
              g.drawRect(     //         Draw an open square:
               i%3*10,i/3*10, //          At x,y-coordinate i%3*10, i//3*10
               10,10))        //          Of size 10x10 pixels
           t=i>4?             //       If `i` is 5, 6, 7 or 8:
              i               //        Set `t` to `i`
             :                //       Else:
              1;}});          //        Set `t` to 1 instead
     show();}}                //    And afterwards show the Frame

TikZ + TeX (plain TeX) 86 83 bytes

\input tikz\def~{)circle()(}\tikz\filldraw[step=2]grid(6,6)(,~3,~5,~5,3~3,5~,);\bye

Try online


Explanation

I recently found out that plain TeX saves you lots of bytes when compared to LaTeX. Started this one from scratch.


What about GRAY?

This is a little tricky but I believe that rgb(x,x,x) with 0≤x≤255 are 256 shades of gray. Basically, black is the darkest gray available.


Output

TeX Output

Java 11 (OpenJDK), 265 bytes

This is just a golfed version of @mindoverflow's answer, full credit goes to him. The problem is just that I can't comment yet.

()->{new Frame(){public void paint(Graphics g){int x=20,y=40,z=60,i=3;g.fillOval(x,0,x,x);g.fillOval(y,x,x,x);for(;i-->0;g.fillOval(i*x,y,x,x));g.setColor(Color.gray);for(i=4;i-->1;g.drawRect(0,0,z,i*x));g.drawLine(x,0,x,z);g.drawLine(y,0,y,z);}}.setVisible(2>1);};

It looks just like @mindoverflow`s, but by wrapping a couple of method calls into for-loops you can save 45 bytes.

enter image description here

Java 11 (OpenJDK), 310 bytes

First time golfing, I hope I got it right...

()->{new Frame(){public void paint(Graphics g){int x=20,y=40,z=60;g.fillOval(x,0,x,x);g.fillOval(0,y,x,x);g.fillOval(x,y,x,x);g.fillOval(y,y,x,x);g.fillOval(y,x,x,x);g.setColor(Color.gray);g.drawRect(0,0,z,z);g.drawRect(0,0,z,y);g.drawRect(0,0,z,x);g.drawLine(x,0,x,z);g.drawLine(y,0,y,z);}}.setVisible(2>1);};

Opens a window as small as the OS allows that can be dragged open. Also the image is partially hidden behind the window border:

enter image description here

Here's how it would look like without the border

enter image description here

HTML & CSS, 113 bytes

I started working on this version because of Octopus' similar answer.
I've mainly done away with excessive elements and replaced them with CSS-generated pseudo elements.

th{font:5em/.37''}th::after{content:'\2022
<table cellspacing=0 border><td><th><td><tr><td><td><th><tr><th><th><th

Here's another one of 95 bytes that makes use of x's instead of bullets

*{width:2em;font-size:2em;letter-spacing:-.22em;line-height:.645em
☐☒☐ ☐☐☒ ☒☒☒

Desmos, 90 characters/bytes

Nobody saw that one coming.

(x-3)^2+(y-1)^2<=1
(x-1)^2+(y-1)^2<=1
(x-5)^2+(y-1)^2<=1
(x-5)^2+(y-3)^2<=1
(x-3)^2+(y-5)^2<=1

Graph link
Thanks pydude for reminding me about inequalities!
If needed, I can crop the exported Desmos PNG to remove the axis/unneeded graph space

Desmos exported PNG




Desmos graph

CSS+HTML = 13+83 = 96 bytes

td{width:21px
<table cellspacing=0 border><td><td>⬛<td><tr><td>⬛<td><tr><td>⬛<td>⬛<td>⬛

Thanks to @mbomb007

CSS+HTML = 38+83 = 121 bytes [No Unicode]

CSS

p{width:8px;height:8px;background:#000

HTML

<table cellspacing=0 border><td><td><p><td><tr><td><p><td><tr><td><p><td><p><td><p>

Tested on:

Chrome 72.0.3626.121

enter image description here

CSS+HTML = 38+87 = 125 bytes [No Unicode]

CSS

p{width:8px;height:8px;background:#000

HTML

<table cellspacing=0 border><td><td><p><td><tr><td><td><td><p><tr><td><p><td><p><td><p>

Tested on: Chrome 72.0.3626.121

enter image description here

Excel VBA, 180 bytes

An anonymous VBE Immediate window function that takes no input and outputs to the default worksheet object (Sheet1).

Cells.RowHeight=48:Cells.Interior.Color=-1:[B2:D4].Borders.Color=7434613:For Each s In[{21,32,13,23,33}]:Sheet1.Shapes.AddShape(9,48*(s\10)+4,Mid(s,2)*48+4,40,40).ShapeStyle=8:Next

Commented Version

Cells.RowHeight=48                      ''  Make the Cells square
Cells.Interior.Color=-1                 ''  Remove the default grid
[B2:D4].Borders.Color=7434613           ''  Create the 3x3 gray grid at range `B2:D4`
For Each s In [{21,32,13,23,33}]        ''  Assign and iterate over a list of where
                                        ''  to place the dots; This list is a range that 
                                        ''  is coerced into a numeric array
        
    Sheet1.Shapes.AddShape(         _   ''  Add a shape to the Sheet1 object
                9,                  _   ''  An Oval (msoShapeOval)
                48*(s\10)+4,        _   ''  At the calculated value from the left
                Mid(s,2)*48+4,      _   ''  At the calculated value from the top
                40,                 _   ''  that is 40 units wide
                40                  _   ''  and is 40 units tall
                ).ShapeStyle=8          ''  and is black filled with a black outline

Next                                    ''  repeat to end of list

Output

Hacker Logo

-6 bytes for using [{21,32,13,23,33}] over Split("21 32 13 23 33")

-2 bytes for using Mid(s,2) over Right(s,1)

-3 bytes for using (s\10) over Left(s,1)

R, 119 114 111 bytes

(Thans to @JayCe for saving me 3 bytes)

Not shorter than the other R solution, but a completely different approach:

layout(matrix(c(1,9,2:8),3,,T))
par(mar=0*1:4)
for(i in 1:9){frame();if(i>4)points(.5,.5,,19,cex=29);box(fg=8)}

Uses a layout in which the 4 first plots are the empty cells, and the 5 others the ones with dots in them.

Glider

SmileBASIC, 125 bytes

GCLS-1GCOLOR #GRAY
GBOX.,8,30,38GBOX 10,8,20,38GBOX.,18,30,28G.,1G 1,2G-1,3G.,3G 1,3DEF G X,Y
GPUTCHR X*10+12,Y*10,58081,.END

58081 (U+E2E1, which is in the "Private Use Area" block) is the character code for a circle symbol. Putting it in a string would work too, but since it is encoded as 3 bytes in UTF-8, it would be the same length (and not show up correctly here).

markdown is awful

R (130 119 113 bytes)

plot(c(2,4,6,4,6),c(2,2,2,6,4),an=F,ax=F,xli=(l=c(1,7)),yli=l,xaxs="i",yaxs="i",pch=16,cex=19);grid(3,lt=1);box()

enter image description here

C++ using SFML, 708 706 685 bytes

-23 bytes thanks to Zacharý

#include<SFML\Graphics.hpp>
#define V =RectangleShape({6.f,300.f});r
#define H =RectangleShape({300.f,6.f});r
#define S(a,b).setPosition(a,b);
#define D(c,d)a.setPosition(c,d);w.draw(a);
using namespace sf;int main(){RenderWindow w(VideoMode(300,300),"");RectangleShape r[8];r[0]V[1]V[2]V[3]V[4]H[5]H[6]H[7]H[0]S(-3,0)r[1]S(97,0)r[2]S(197,0)r[3]S(297,0)r[4]S(0,-3)r[5]S(0,97)r[6]S(0,197)r[7]S(0,297)CircleShape a(40);a.setFillColor(Color::Black);while(w.isOpen()){Event e;while(w.pollEvent(e))if(e.type==Event::Closed)w.close();w.clear(Color::White);for(int i=0;i<8;++i){r[i].setFillColor(Color(128,128,128));w.draw(r[i]);}D(110,10)D(210,110)D(210,210)D(110,210)D(10,210)w.display();}}

Open a window where you see that :

SFML Displaying the hacker logo

Window is 300x300, so grid boxes are 100x100, and the dot have a 40 pixel radius, so the number of covered pixels is 40*40*3.14 ( something like 5024 ). So it respects the 40%-80% area filling rule.

If you want to run it by yourself, you should add this line : w.setFramerateLimit(60), to avoid your computer to heat up

6502 machine code (C64), 310 bytes

00 C0 A9 00 A8 85 FC A2 E0 86 FD A2 20 91 FC C8 D0 FB E6 FD CA D0 F6 A2 CC 86
FD A2 18 A0 27 C0 09 F0 20 C0 06 F0 1C C0 03 F0 18 C0 00 F0 14 E0 18 F0 10 E0
15 F0 0C E0 12 F0 08 E0 0F F0 04 A9 01 D0 02 A9 C1 91 FC 88 10 D5 A5 FC 69 27
85 FC A5 FD 69 00 85 FD CA 10 C4 A9 FF A2 0F 9D 60 E1 9D A0 E2 9D 38 E5 9D 78
E6 9D C8 E8 9D 08 EA 9D E0 E8 9D 20 EA 9D F8 E8 9D 38 EA CA 10 DF A9 40 85 FC
A9 E1 85 FD A2 20 A0 00 A9 18 91 FC C8 98 29 07 D0 F6 98 69 10 A8 CA F0 13 8A
29 03 D0 EA A5 FC 69 40 85 FC A5 FD 69 01 85 FD D0 DA A9 18 A2 02 9D 05 E0 9D
1D E0 9D 35 E0 9D 4D E0 9D 40 EB 9D 58 EB 9D 70 EB 9D 88 EB CA 10 E5 A9 0B 85
FC A9 E0 85 FD A2 20 A0 00 A9 FF 91 FC C8 98 29 01 D0 F6 98 69 06 A8 CA F0 13
8A 29 07 D0 EA A5 FC 69 C0 85 FC A5 FD 69 03 85 FD D0 DA A9 1F A2 01 9D 03 E0
9D C3 E3 9D 83 E7 9D 43 EB 49 E7 9D 4B E0 9D 0B E4 9D CB E7 9D 8B EB 49 E7 CA
10 E1 A9 94 8D 00 DD A9 3B 8D 11 D0 A9 3D 8D 18 D0 A9 01 8D 20 D0 D0 FE

I expected this to be possible in fewer bytes, but didn't find a way for quite a while, so posting it anyways now :)

Online demo, Usage: sys49152

Screenshot


Explanation: (commented vice disassembly listing)

         00 C0       .WORD $C000

         ; clear 8kiB monochrome bitmap at $E000:
         ;---------------------------------------
.C:c000  A9 00       LDA #$00
.C:c002  A8          TAY
.C:c003  85 FC       STA $FC
.C:c005  A2 E0       LDX #$E0
.C:c007  86 FD       STX $FD
.C:c009  A2 20       LDX #$20       ; 16 pages to clear
.C:c00b   .cl_loop:
.C:c00b  91 FC       STA ($FC),Y
.C:c00d  C8          INY
.C:c00e  D0 FB       BNE .cl_loop
.C:c010  E6 FD       INC $FD
.C:c012  CA          DEX
.C:c013  D0 F6       BNE .cl_loop

     ; set colors for each 8x8 pixel block:
         ; ------------------------------------
.C:c015  A2 CC       LDX #$CC       ; start address of bitmap colors
.C:c017  86 FD       STX $FD        ; ($CC00) in zeropage pointer
.C:c019  A2 18       LDX #$18       ; 25 rows
.C:c01b   .sc_loop1:
.C:c01b  A0 27       LDY #$27       ; 40 columns (counts down to 0)
.C:c01d   .sc_loop2:
.C:c01d  C0 09       CPY #$09       ; for every third column ...
.C:c01f  F0 20       BEQ .sc_gray
.C:c021  C0 06       CPY #$06
.C:c023  F0 1C       BEQ .sc_gray
.C:c025  C0 03       CPY #$03
.C:c027  F0 18       BEQ .sc_gray
.C:c029  C0 00       CPY #$00
.C:c02b  F0 14       BEQ .sc_gray
.C:c02d  E0 18       CPX #$18       ; ... or every third row ...
.C:c02f  F0 10       BEQ .sc_gray
.C:c031  E0 15       CPX #$15
.C:c033  F0 0C       BEQ .sc_gray
.C:c035  E0 12       CPX #$12
.C:c037  F0 08       BEQ .sc_gray
.C:c039  E0 0F       CPX #$0F
.C:c03b  F0 04       BEQ .sc_gray   ; ... use gray ($C) on white ($1)
.C:c03d  A9 01       LDA #$01       ; else use black ($0) on white ($1)
.C:c03f  D0 02       BNE .sc_store
.C:c041   .sc_gray:
.C:c041  A9 C1       LDA #$C1
.C:c043   .sc_store:
.C:c043  91 FC       STA ($FC),Y    ; store color
.C:c045  88          DEY
.C:c046  10 D5       BPL .sc_loop2
.C:c048  A5 FC       LDA $FC        ; add offset for next row to pointer
.C:c04a  69 27       ADC #$27
.C:c04c  85 FC       STA $FC
.C:c04e  A5 FD       LDA $FD
.C:c050  69 00       ADC #$00
.C:c052  85 FD       STA $FD
.C:c054  CA          DEX
.C:c055  10 C4       BPL .sc_loop1

         ; draw "dots" as solid squares of 16x16
         ; -------------------------------------
.C:c057  A9 FF       LDA #$FF       ; all 8 pixels set
.C:c059  A2 0F       LDX #$0F       ; loop over 2*8 = 16 rows
.C:c05b   .sq_loop:
.C:c05b  9D 60 E1    STA $E160,X    ; store at different offsets
.C:c05e  9D A0 E2    STA $E2A0,X    ; this works because of the strange
.C:c061  9D 38 E5    STA $E538,X    ; VIC-II framebuffer memory layout:
.C:c064  9D 78 E6    STA $E678,X    ;
.C:c067  9D C8 E8    STA $E8C8,X    ; 8 consecutive bytes form a block
.C:c06a  9D 08 EA    STA $EA08,X    ; of 8x8 pixels.
.C:c06d  9D E0 E8    STA $E8E0,X    ; The next 8x8 block is to the right
.C:c070  9D 20 EA    STA $EA20,X    ; of the previous one.
.C:c073  9D F8 E8    STA $E8F8,X    ; after 40 of these blocks, a new row
.C:c076  9D 38 EA    STA $EA38,X    ; starts.
.C:c079  CA          DEX
.C:c07a  10 DF       BPL .sq_loop

         ; draw vertical grid lines:
         ; -------------------------
.C:c07c  A9 40       LDA #$40       ; load vector with
.C:c07e  85 FC       STA $FC        ; start address of the
.C:c080  A9 E1       LDA #$E1       ; first grid line
.C:c082  85 FD       STA $FD
.C:c084  A2 20       LDX #$20       ; 32 line segments
.C:c086   .gv_loop1:
.C:c086  A0 00       LDY #$00       ; start offset at 0
.C:c088   .gv_loop2:
.C:c088  A9 18       LDA #$18       ; bit pattern for 2pixel wide line
.C:c08a  91 FC       STA ($FC),Y    ; store bit pattern in bitmap
.C:c08c  C8          INY
.C:c08d  98          TYA
.C:c08e  29 07       AND #$07       ; every 8 lines ...
.C:c090  D0 F6       BNE .gv_loop2
.C:c092  98          TYA        ; ... add 16 to offset to
.C:c093  69 10       ADC #$10       ; skip 2 columns
.C:c095  A8          TAY
.C:c096  CA          DEX
.C:c097  F0 13       BEQ .gov
.C:c099  8A          TXA
.C:c09a  29 03       AND #$03       ; every 4 line segments ...
.C:c09c  D0 EA       BNE .gv_loop2
.C:c09e   .gh:
.C:c09e  A5 FC       LDA $FC        ; ... add $140 (8 * 25) to vector
.C:c0a0  69 40       ADC #$40       ; to get one "row" down
.C:c0a2  85 FC       STA $FC
.C:c0a4  A5 FD       LDA $FD
.C:c0a6  69 01       ADC #$01
.C:c0a8  85 FD       STA $FD
.C:c0aa  D0 DA       BNE .gv_loop1

         ; draw vertical grid line endings:
         ; --------------------------------
.C:c0ac   .gov:
.C:c0ac  A9 18       LDA #$18
.C:c0ae  A2 02       LDX #$02       ; every ending is 3 pixels high
.C:c0b0   .gov_loop:
.C:c0b0  9D 05 E0    STA $E005,X    ; store at different offsets
.C:c0b3  9D 1D E0    STA $E01D,X    ; in bitmap, see explanation
.C:c0b6  9D 35 E0    STA $E035,X    ; for squares above
.C:c0b9  9D 4D E0    STA $E04D,X
.C:c0bc  9D 40 EB    STA $EB40,X
.C:c0bf  9D 58 EB    STA $EB58,X
.C:c0c2  9D 70 EB    STA $EB70,X
.C:c0c5  9D 88 EB    STA $EB88,X
.C:c0c8  CA          DEX
.C:c0c9  10 E5       BPL .gov_loop

         ; draw horizontal grid lines:
         ; ---------------------------
.C:c0cb  A9 0B       LDA #$0B       ; load vector with
.C:c0cd  85 FC       STA $FC        ; start address of the
.C:c0cf  A9 E0       LDA #$E0       ; first grid line
.C:c0d1  85 FD       STA $FD
.C:c0d3  A2 20       LDX #$20       ; 32 line segments
.C:c0d5   .gh_loop1:
.C:c0d5  A0 00       LDY #$00       ; start offset at 0
.C:c0d7   .gh_loop2:
.C:c0d7  A9 FF       LDA #$FF       ; all bits set for horizontal lines
.C:c0d9  91 FC       STA ($FC),Y    ; store bit pattern in bitmap
.C:c0db  C8          INY
.C:c0dc  98          TYA
.C:c0dd  29 01       AND #$01       ; every other line ...
.C:c0df  D0 F6       BNE .gh_loop2
.C:c0e1  98          TYA
.C:c0e2  69 06       ADC #$06       ; ... add 6 to offset to get to the
.C:c0e4  A8          TAY        ; next block
.C:c0e5  CA          DEX
.C:c0e6  F0 13       BEQ .goh
.C:c0e8  8A          TXA
.C:c0e9  29 07       AND #$07       ; every 8 line segments ...
.C:c0eb  D0 EA       BNE .gh_loop2
.C:c0ed  A5 FC       LDA $FC        ; ... add $3C0 (8 * 75) to vector
.C:c0ef  69 C0       ADC #$C0       ; to get three "rows" down
.C:c0f1  85 FC       STA $FC
.C:c0f3  A5 FD       LDA $FD
.C:c0f5  69 03       ADC #$03
.C:c0f7  85 FD       STA $FD
.C:c0f9  D0 DA       BNE .gh_loop1

         ; draw horizontal grid line endings:
         ; ----------------------------------
.C:c0fb   .goh:
.C:c0fb  A9 1F       LDA #$1F       ; bit pattern for 5 pixel wide line end
.C:c0fd  A2 01       LDX #$01       ; 2 pixels high
.C:c0ff   .goh_loop:
.C:c0ff  9D 03 E0    STA $E003,X    ; store at different offsets ...
.C:c102  9D C3 E3    STA $E3C3,X
.C:c105  9D 83 E7    STA $E783,X
.C:c108  9D 43 EB    STA $EB43,X
.C:c10b  49 E7       EOR #$E7       ; switch to right line end
.C:c10d  9D 4B E0    STA $E04B,X    ; and store ...
.C:c110  9D 0B E4    STA $E40B,X
.C:c113  9D CB E7    STA $E7CB,X
.C:c116  9D 8B EB    STA $EB8B,X
.C:c119  49 E7       EOR #$E7       ; switch back to left line end
.C:c11b  CA          DEX
.C:c11c  10 E1       BPL .goh_loop

         ; setup hardware to show graphics:
         ; --------------------------------
.C:c11e  A9 94       LDA #$94       ; select top bank for VIC-II
.C:c120  8D 00 DD    STA $DD00      ; address space ($C000 - $FFFF)
.C:c123  A9 3B       LDA #$3B       ; activate hires bitmap mode
.C:c125  8D 11 D0    STA $D011
.C:c128  A9 3D       LDA #$3D       ; select $0c00 for start of bitmap
.C:c12a  8D 18 D0    STA $D018      ; colors, $2000 for start of bitmap
.C:c12d  A9 01       LDA #$01       ; set border color to white
.C:c12f  8D 20 D0    STA $D020
.C:c132   .hl_end:
.C:c132  D0 FE       BNE .hl_end    ; --- and never come back (loop)

Tcl/Tk, 173

pack [canvas .c -bg #FFF]
time {.c cr l [incr i 10] 10 $i 40 -f gray;.c cr l 10 $i 40 $i -f gray} 4
lmap x\ y {2 1 3 2 1 3 2 3 3 3} {.c cr o ${x}2 ${y}2 ${x}8 ${y}8 -f #000}

enter image description here

Tcl/Tk, 188

pack [canvas .c -bg #FFF]
lmap i {2 12 22 32} {.c cr l 2 $i 32 $i -f gray;.c cr l $i 2 $i 32 -f gray}
lmap x {13 23 3 13 23} y {3 13 23 23 23} {.c cr o $x $y [incr x 8] [incr y 8] -f #000}

hacker logo

Python 3 + PyGame, 238 Bytes

from pygame import*
d=display
s=d.set_mode([55]*2)
s.fill([255]*3)
f=lambda*a:draw.line(s,[128]*3,*a)
for x in[0,18,36,54]:
 f((x,0),(x,55));f((0,x),(55,x))
for x,y in zip([3,5,1,3,5],[1,3,5,5,5]):draw.circle(s,[0]*3,(x*9,y*9),7)
d.flip()

The seemingly arbitrary constants are from me trying to make the image as large as possible without sacrificing bytes.

With non-printing characters, 229 Bytes

from pygame import*
d=display
s=d.set_mode([55]*2)
s.fill([255]*3)
f=lambda*a:draw.line(s,[128]*3,*a)
for x in b'\0␒$6':
 f((x,0),(x,55));f((0,x),(55,x))
for x,y in zip(b'␃␅␁␃␅',b'␁␃␅␅␅'):draw.circle(s,[0]*3,(x*9,y*9),7)
d.flip()

I replaced the lists with byte literals, which saves a bunch of characters, but the non-printing characters can't be displayed properly here. I substituted the non-printing characters with their graphical equivalents U+2400-U+2421 for display purposes.

screenshot

Javascript, 187 bytes (174+13) 205 bytes (192+13)

a=40,w=80,x=c.getContext`2d`;c=(X,Y)=>{x.beginPath();x.arc(X*a+20,Y*a+20,15,0,7);x.fill()};c(1,0),c(2,1),c(0,2),c(1,2),c(2,2);i=4;while(i--)x.strokeRect((i&1)*a,(i&2)*20,w,w)
<canvas id=c>

Ungolfed

a = 40,w = 80,
x = c.getContext `2d`;
c = (X, Y) => {
    x.beginPath();
    x.arc(X * a + 20, Y * a + 20, 15, 0, 7);
    x.fill()
};
c(1, 0), c(2, 1), c(0, 2), c(1, 2), c(2, 2);
i = 4;
while (i--) x.strokeRect((i&1)*a, (i&2)*20, w, w)

SVG/CSS, 700 bytes

rect{fill:white;stroke:grey;stroke-width:1}
<svg width=48 height=48 ><rect width=16 height=16 /><rect x=16 width=16 height=16 /><circle cx=24 cy=8 r=6 stroke=black stroke-width=1 fill=black /><rect x=32 width=16 height=16 /><rect y=16 width=16 height=16 /><rect x=16 y=16 width=16 height=16 /><rect x=32 y=16 width=16 height=16 /><circle cx=40 cy=24 r=6 stroke=black stroke-width=1 fill=black /><rect y=32 width=16 height=16 /><circle cx=8 cy=40 r=6 stroke=black stroke-width=1 fill=black /><rect x=16 y=32 width=16 height=16 /><circle cx=24 cy=40 r=6 stroke=black stroke-width=1 fill=black /><rect x=32 y=32 width=16 height=16 /><circle cx=40 cy=40 r=6 stroke=black stroke-width=1 fill=black /></svg>

HTML & CSS, 155 bytes

Turns out HTML is really forgiving about syntax errors.

1 byte saved thanks to @Octopus · 1 byte saved thanks to @Downgoat · 2 bytes saved thanks to @StephenS

2 bytes saved thanks to @Ryan · 3 bytes saved thanks to @styfle · 4 bytes saved thanks to @Ferrybig

13 bytes saved thanks to @SteveBennett

p{height:33px;width:33px;border-radius:50%;background:#000;margin:0
<table cellspacing=0 border=1><td><td><p><td><tr><td><td><td><p><tr><td><p><td><p><td><p

imagegen, 167 154 55 bytes (non-competing)

Edit 2: Added grid draw function

Edit 1: Fixed bug where you needed spaces to separate rectangle fill functions. Removed those spaces

output

31x31 F^G910R013,3,5R023,13,5R03,23,5R013,23,5R023,23,5

Running

To run, click the link above to the Github repository and read the usage section. After running imagegen, just paste the code into the console and hit enter. The program will generate an image to out.png in the same folder as the EXE.

Just started working on a new image generation golf language today to help me get used to C#. The score will continue to decrease as I add more features (and the answer will hopefully get less boring).

Explanation

  1. Fill image with white background
  2. Draw gray grid
  3. Draw each black rectangle individually

Code explanation

This is still a major work in progress, just started a couple hours ago

SVG, 487 449 355 301 Bytes

Compressed Version:

<svg><g id=g><path d=M1,1L1,13L13,13L13,1Z id=r fill=none stroke=gray /><use href=#r x=12 /><use href=#r x=24 /></g><use href=#g /><use href=#g y=12 /><use href=#g y=24 /><circle id=c cx=19 cy=7 r=5 /><use href=#c x=12 y=12 /><use href=#c x=-12 y=24 /><use href=#c x=0 y=24 /><use href=#c x=12 y=24 />

Special Thanks:

@Meyer - Thanks for taking off 54 bytes!

@ovs - Thanks for bringing up compliance issue with radius of circle

Uncompressed Version Code Snippet:

<svg>
    <g id=g>
        <path d=M1,1L1,13L13,13L13,1Z id=r fill=none stroke=gray />
        <use href=#r x=12 />
        <use href=#r x=24 />
    </g>
    <use href=#g />
    <use href=#g y=12 />
    <use href=#g y=24 />
    <circle id=c cx=19 cy=7 r=5 />
    <use href=#c x=12 y=12 />
    <use href=#c x=-12 y=24 />
    <use href=#c x=0 y=24 />
    <use href=#c x=12 y=24 />

SVG + HTML, 146 138 135 133 bytes

<svg>
<path fill=none stroke=#ccc d=m.5.5h30v30h-30zh10v30h10v-30zv10h30v10h-30 />
<path d=m11,1h9v9m1,1h9v9m-29,1h9v9m1-9h9v9m1-9h9v9>

Thanks to the lenient HTML parser, the xmlns="http://www.w3.org/2000/svg" declaration can be omitted, as well as attribute quotes and the closing tag. This version addresses some issues of other HTML solutions:

Edit Shaved off 8 bytes by exploiting the fact that subpaths do not need to be closed in order to be filled.

Edit According to the svg grammar, it is not necessary to separate non-digits with a comma (.5,.5). I also abandoned the explicit fill, so that I can change the draw direction of one line from negative to positive, saving a dash. And lastly, I adjusted the count to not include a trailing newline, sorry for this rookie mistake.

Edit Learning from another answer on codegolf, I have replaced the final 9 /> with 9>. This works fine in all tested browsers.

IA-32 machine code, 81 80 bytes

Hexdump:

60 8b f9 b8 50 35 20 20 ab b8 32 35 36 20 ab ab
ab fe 4f fe 33 c9 66 49 51 8a c1 d4 55 50 8a c5
d4 55 5b b2 80 84 c0 74 1f 84 db 74 1b b2 ff 2c
10 3c 35 77 13 93 2c 10 3c 35 77 0c 8d 0c 58 8a
cd b0 e4 d2 e0 79 01 42 92 aa 59 e2 cb aa 61 c3

It's a fastcall function called doit that returns the image in PGM format in the supplied buffer. Usage:

char buf[256 * 256 + 256];
doit(buf);

FILE* f = fopen("k.pgm", "wb");
fwrite(buf, 1, sizeof buf, f);
fclose(f);

Output:

hacker's logo

I used 256x256 resolution because it's cool it lets me split the pixel's index in ecx automatically into coordinates y in ch and x in cl. Also, the PGM file format requires the number 255 in the image header.

The inner squares are 54x54 (41% of the cell by area).

Source code (can be compiled by Visual Studio):

    pushad;                 // save all registers
    mov edi, ecx;           // edi is now the pointer to output
    mov eax, '  5P';        // PGM file header
    stosd;                  // store it
    mov eax, ' 652';        // the number 256 and a space
    stosd;                  // store the width
    stosd;                  // store the height
    stosd;                  // store maximum brightness
    dec byte ptr [edi-2];   // fix maximum brightness to 255

    xor ecx, ecx;           // initialize the counter of pixels
    dec cx;                 // to 65535
myloop:
    push ecx;

    mov al, cl;             // al = cl = x coordinate in the image
    _emit 0xd4;             // divide by 85
    _emit 85;               // ah = x cell number, al = x coordinate in cell
    push eax;
    mov al, ch;             // al = ch = y coordinate in the image
    _emit 0xd4;             // divide by 85
    _emit 85;               // ah = y cell number, al = y coordinate in cell
    pop ebx;                // bh = x cell number, bl = x coordinate in cell

    mov dl, 0x80;           // gray pixel value
    test al, al             // is cell boundary (y)?
    je output1;
    test bl, bl;            // is cell boundary (x)?
    je output1;

    mov dl, 255;            // white pixel value
    sub al, 16;
    cmp al, 53;
    ja output1;             // if outside the inner square, output white
    xchg eax, ebx;          // exchange the registers to shorten following code
    sub al, 16;
    cmp al, 53;
    ja output1;             // if outside the inner square, output white

    lea ecx, [ebx * 2 + eax]; // cell index = y * 2 + x
    mov cl, ch;
    mov al, 0xe4;           // load the bitmap for the glider pattern
    shl al, cl;             // shift the needed but into SF
    jns output1;            // the bit was 0? - output white
    inc edx;                // the bit was 1? - change to black

output1:
    xchg eax, edx;
    stosb;                  // output the byte

    pop ecx;
    loop myloop;
    stosb;                  // output an additional gray pixel
    popad;
    ret;

The cell pattern

0 1 0
0 0 1
1 1 1

can be represented by an "optimized" bitmap of 7 bits.

The bits are indexed by the expression y * 2 + x, where (x,y) is the location of the cell. This expression gives the same index to 2 pairs of cells. It's a lucky coincidence that the bit values there are the same.

Ruby, 144 166 164 148 144 bytes

require'ruby2d'
set background:'grey'
c=482;g=2,13,24;d=0
g.map{|y|g.map{|x|Square.new(x,y,9);Square.new(x+2,y+2,5,"black")if c[d]>0;d+=1}}
show

Output:

output

Edit: Now has grey gridlines.

OpenTuring, 203 189 bytes

This is a language I hated in high school, but it has graphics, so...

for i:0..2
for j:0..2
Draw.Box(i*30,j*30,(i+1)*30,(j+1)*30,28)
if j=0 then
Draw.FillOval(i*30+15,15,12,12,7)
end if
end for
end for
Draw.FillOval(45,75,12,12,7)
Draw.FillOval(75,45,12,12,7)

Screenshot

TI-BASIC, 218 140 137 bytes

Note: this byte count is a bit inflated. The program only uses 85 tokens, but that's saved in 137 bytes. Also, if you're using a non-color calculator, you could save another 4 tokens because you don't have to specify the color (which is blue by default), but I don't know if their screens are large enough for this challenge because I don't own one.

prgmHACKER (138 bytes, 86 tokens):

{0,1,2,1,2}→L1
{0,0,0,2,1}→L2
.3→R
For(I,0,5
L₁(I)+.5→A
L₂(I)+.5→B
For(N,0,R,dX
√(R²-N²
Line(A+N,B-Ans,A+N,B+Ans,BLACK
Line(A-N,B-Ans,A-N,B+Ans,BLACK
End
End

For proper display, this program requires that Xmin = Ymin = 0, Xmax = Ymax = 3, Xscl = Yscl = 1. dX also needs to be properly set, but the calculator does that for you when you set any other window variable. I couldn't see how much space these variables used in RAM.

Furthermore, the format settings should be { RectGC, CoordOff, GridLine, GridColor:MEDGRAY, Axes:OFF, ExprOff, BorderColor:1, Background:OFF } but these are toggled values and don't consume any extra space depending on the setting.

Mathematica, 62 bytes

Grid[{{,a=██,},{,,a},{a,a,a}},Frame->All,FrameStyle->Gray]

enter image description here

Mathematica, 71 bytes

Grid[{{,l=Graphics@Disk[],},{,,l},{l,l,l}},Frame->All,FrameStyle->Gray]


enter image description here

Processing, 212 198 bytes

background(-1);noFill();stroke(99);rect(0,0,99,99);rect(0,33,99,33);rect(33,0,33,99);fill(0);int f=25;ellipse(15,83,f,f);ellipse(50,83,f,f);ellipse(83,83,f,f);ellipse(83,50,f,f);ellipse(50,15,f,f);

Basically, we are using simple Processing to draw a white Background, then setting the transparency of the rectangles used for the grid and drawing their strokes in gray. We continue by defining the rectangle, setting the fill value again to fill the circles black and defining fives circles.

Voilà!

enter image description here

You could add

strokeWidth(2); 

or more to see the color of the strokes better.

(That's my first Code-Golf, I hope I did everything right.)

EDIT: Thanks to Kritixi Lithos! Removed the newlines, changed to int f=25 and used -1 in background(float)

Lua + LÖVE, 264 characters

l=love
g=l.graphics
g.setLineStyle("rough")function l.draw()g.setBackgroundColor(255,255,255)for i=0,8 do
x=i%3*11+1
y=(i-i%3)/3*11+1
g.setColor(127,127,127)g.rectangle("line",x,y,11,11)if("15678"):find(i)then
g.setColor(0,0,0)g.circle("fill",x+5,y+5,4)end
end
end

Sample output:

Glider drawn with Lua and LÖVE

Lua + LÖVE, 241 characters

l=love
g=l.graphics
function l.draw()g.setBackgroundColor(255,255,255)for i=0,8 do
x=i%3*10+1
y=(i-i%3)/3*10+1
g.setColor(127,127,127)g.rectangle("line",x,y,10,10)if("15678"):find(i)then
g.setColor(0,0,0)g.circle("fill",x+5,y+5,3)end
end
end

The question owner not answered yet the anti-aliasing question and some other solutions also have additional gray shades added by the anti-aliasing, so for now this shorter one looks also acceptable.

Sample output:

Glider drawn with Lua and LÖVE - with anti-aliasing

LaTeX + Tikz, 155 bytes

\documentclass[tikz]{standalone}\begin{document}\tikz{\draw(0,0)grid(3,3);\foreach\x/\y in{0/0,1/0,2/0,2/1,1/2}\fill(\x+.5,\y+.5)circle(.5);}\end{document}

result

Bash + ImageMagick, 233 226 characters

convert xc: +antialias -resize 31 -draw "stroke gray fill none ${r=rectangle} 0,0 10,30$r 20,0 30,30$r 0,0 30,10$r 0,20 30,30stroke #000 fill #000 ${c=circle} 15,5 15,8$c 25,15 25,18$c 5,25 5,28$c 15,25 15,28$c 25,25 25,28" x:

Sample output:

Glider drawn with Bash and ImageMagick

Bash + ImageMagick, 215 characters

convert xc: -resize 31 -draw "stroke gray fill none ${r=rectangle} 0,0 10,30$r 20,0 30,30$r 0,0 30,10$r 0,20 30,30stroke #000 fill #000 ${c=circle} 15,5 15,8$c 25,15 25,18$c 5,25 5,28$c 15,25 15,28$c 25,25 25,28" x:

The question owner not answered yet the anti-aliasing question and some other solutions also have additional gray shades added by the anti-aliasing, so for now this shorter one looks also acceptable.

Sample output:

Glider drawn with Bash and ImageMagick - with anti-aliasing

Ruby with Shoes, 118 characters

Shoes.app{9.times{|i|
stroke gray
fill white
rect x=i%3*w=10,y=i/3*w,w,w
stroke fill black
oval x+2,y+2,7if 482[i]>0}}

Bit checking borrowed from RJHunter's comment made on Mark Thomas's Ruby solution.

Sample output:

Glider drawn with Ruby with Shoes

Processing, 134 bytes

Inspired by @Zep, here's my Processing one-liner (and also my first code golf):

stroke(127);for(int i=0;i<9;i++){int x=i%3*30;int y=i/3*30;fill(255);rect(x+5,y+5,30,30);if(i==1||i>4){fill(0);ellipse(x+20,y+20,23,23);}};

Thanks for @Kritixi Lithos for his brilliant tips on shaving a few bytes off!

glider in Processing

Apple Swift (iOS - CoreGraphics/QuartzCore) - 832 Bytes

I drew the shape entirely using Quartz for an Apple iOS device. Unfortunatly this isn't a particularly size mindful language so the result is quite large, but this is as small as I can get it.

UIGraphicsBeginImageContext(CGSize(width:60,height:60));let c=UIGraphicsGetCurrentContext()!;UIColor.lightGray.setStroke();c.addRect(CGRect(x:0,y:0,width:60,height:60));c.move(to: CGPoint(x:20,y:0));c.addLine(to: CGPoint(x:20,y:60));c.move(to: CGPoint(x:40,y:0));c.addLine(to: CGPoint(x:40,y:60));c.move(to: CGPoint(x:0,y:20));c.addLine(to: CGPoint(x:60,y:20));c.move(to: CGPoint(x:0,y:40));c.addLine(to: CGPoint(x:60, y:40));c.strokePath();UIColor.black.setFill();c.addEllipse(in:CGRect(x:22,y:2,width:16,height:16));c.addEllipse(in:CGRect(x:42,y:22,width:16,height:16));c.addEllipse(in:CGRect(x:2,y:42,width:16,height:16));c.addEllipse(in:CGRect(x:22,y:42,width:16,height:16));c.addEllipse(in:CGRect(x:42,y:42,width:16,height:16));c.fillPath();let i=UIGraphicsGetImageFromCurrentImageContext();sub.addSubview(UIImageView(image:i))

A more readable version for anyone that is interested:

    UIGraphicsBeginImageContext(CGSize(width: 60, height: 60))
    let c = UIGraphicsGetCurrentContext()!
    
    UIColor.lightGray.setStroke()
    c.addRect(CGRect(x: 0, y: 0, width: 60, height: 60))
    c.move(to: CGPoint(x: 20, y: 0))
    c.addLine(to: CGPoint(x: 20, y: 60))
    c.move(to: CGPoint(x: 40, y: 0))
    c.addLine(to: CGPoint(x: 40, y: 60))
    c.move(to: CGPoint(x: 0, y: 20))
    c.addLine(to: CGPoint(x: 60, y: 20))
    c.move(to: CGPoint(x: 0, y: 40))
    c.addLine(to: CGPoint(x: 60, y: 40))
    c.strokePath()
    
    UIColor.black.setFill()
    c.addEllipse(in: CGRect(x: 22, y: 2, width: 16, height: 16))
    c.addEllipse(in: CGRect(x: 42, y: 22, width: 16, height: 16))
    c.addEllipse(in: CGRect(x: 2, y: 42, width: 16, height: 16))
    c.addEllipse(in: CGRect(x: 22, y: 42, width: 16, height: 16))
    c.addEllipse(in: CGRect(x: 42, y: 42, width: 16, height: 16))
    c.fillPath()
    
    let i = UIGraphicsGetImageFromCurrentImageContext()
    sub.addSubview(UIImageView(image: i))

Here is the output produced in the iOS Simulator: Output

R 313 236 bytes

l=c(1,7)
bmp('r',400,400)
plot(x=c(4,6,2,4,6),c(6,4,2,2,2),cex=14,pch=19,xlim=l,ylim=l,xlab='',ylab='',xaxs='i',yaxs='i',axes=F)
a=function(s,...){axis(s,labels=F,tck=1, col="gray",lwd=9,...)}
a(1,xaxp=c(l,3))
a(2,yaxp=c(l,3))
dev.off()

Revised Code, based mostly on comments from @user2390246 saved 77 bytes. Much appreciate the help.

Also, want to add a call-out to the shorter R solution by @mschilli. It shows an elegant way of addressing the problem of the R graphical defaults.

Output

Goes to a file names "r". Omitting and extension saved me four bytes. But then I had to edit the file extension back to "bmp" to get it to upload. So maybe I should not get credit for those four bytes.

The Hacker Logo

Commentary

I thought to myself, "That graphic's nothing but a simple graph with five dots. Should be a simple matter to implement in a language with robust data graphics capabilities. Let's try it in R." But then I had to spend on the order of 80% of the bytes just working around R's graphic defaults.

Kinda the wrong tool for the job....

I could not find a less verbose way of guaranteeing the size and aspect ratio of the graphic than by calling the bmp constructor and then dev.off(). The combination accounts for 25 bytes. If your R session is set up right, you might get a graphic that looks more or less correct without spending those bytes, but it's not reliable or consistent.

Bash + feh, 391 bytes

xxd -ps -r<<G|
425a6839314159265359e008ecc700015afa48d2582082482013004000002008010008b000f920484289880d30a069a1919310294a1a50d19a8c4e5394d2689a8b5057b493c759b1374c26136c94fae37ceb40bf7c73fdc3d07e6f95f69d8440f2040209a5281d49e9fbbcb692bc07725bcbcb62a6e106510a635089343060c630bc075b6dacd71ae32b7c6ec64b0b03e0457c912b22f31613c9305e46558c2bd589e9313b2602f6e3aff177245385090e008ecc70
G
bzcat|feh -

The hex string in the heredoc is a PNM image of the logo, compressed with BZip2 at level 9. xxd -ps -r converts it into binary data, and it is subsequently piped into bzcat (a BZip2 utility that decompresses data on STDIN and prints it on STDOUT). feh - opens the image viewer feh using data from STDIN.

feh - is two bytes shorter than the traditional ImageMagick display program.

If any bash wizards can help me figure out a way to use the raw binary data instead of having to encode it in hex (echo -ne wasn't working right), I'd be forever grateful.

Thanks to kundor for 2 bytes

CSS+HTML, 31+95=126 bytes

This is a merge of the solutions from Octopus and Uriel. I figured Uriel solution could benefit from using instead of using div, and Octopus solution could benefit from using the border attribute instead of setting it in CSS.

So, in the spirit of xkcd/927 I made another answer instead of commenting to either of them.

td{line-height:.4;font-size:3em
<table cellspacing=0 border=1px><tr><td><td>•<td><tr><td><td><td>•<tr><td>•<td>•<td>•

GLSL (fragment shader), 278 235 256 bytes

precision highp float;void main(){vec2 a=gl_FragCoord.xy/20.-.2;ivec2 b=ivec2(a);a-=vec2(b)+.5;if(b.x>2||b.y>2)discard;gl_FragColor=a.x<-.5||a.y<-.5||a.x>.3||a.y>.3?vec4(.5,.5,.5,1.):length(a+.1)<.4&&(b.x+b.y-3)*b.y==0?vec4(0.,0.,0.,1.):vec4(1.,1.,1.,1.);}

enter image description here

See it in action: http://glslsandbox.com/e#40717.2

Applesoft BASIC, 479 476 516 515 483 482 bytes

-32 by using unreadable variable names :P
-1 because Apple decided to be magical and let me use an implicit/nonexistent GOTO

Here is my own (very beatable) program for an example of an output that does not use circles:

1GR:POKE49234,0:COLOR=15:FORI=0TO39:VLIN0,47ATI:NEXT:COLOR=5:S=21:W=S:H=27:X=INT((40-W)/2):Y=INT((48-H)/2):D=INT(W/3):DX=D:C=Y+H:G=X+W:FORI=0TO3:VLINY,C ATX+I*D:NEXT:D=INT(H/3):FORI=0TO3:HLINX,G ATY+I*D:NEXT:YH=INT(D/2):Z=Y+H-YH:XH=INT(DX/2):COLOR=0:FORI=0TO2:B=Z:A=X+XH+I*DX:GOSUB5:NEXT:B=B-D:GOSUB5:B=B-D:A=A-DX:GOSUB5:K=PEEK(-16384):IFK<128THEN2:K=PEEK(-16368):TEXT:HOME:END 
5VLINB+2,B-3ATA:VLINB+2,B-3ATA-1:VLINB+2,B-3ATA+1:VLINB+2,B-3ATA+2:VLINB,B-1ATA-1:VLINB,B-1ATA+2:RETURN

Output:

Processing, 221 bytes

There must be a way to bring this down, but its not jumping out at me. Maybe I can find something with coding some of the oft-used constants to variables, like 30, 15, 25, etc. Possibly it can be done with the rectMode(CENTER) taken out, but I think the coordinates will on average get longer, canceling out the savings.

size(30,30);background(255);rectMode(CENTER);fill(0);rect(15,5,5,5);rect(15,25,5,5);rect(25,15,5,5);rect(5,25,5,5);rect(25,25,5,5);stroke(99);noFill();rect(5,15,10,30);rect(25,15,10,30);rect(15,5,30,10);rect(15,25,30,10);

Ungolfed:

//open the tiny window
size(30,30);
//set the background to white
background(255);
//all rectangle coordinates will be relative to their centers, rather than the top left corner
rectMode(CENTER);
//black
fill(0);
//5 rectangles for the glider. Rectangle because "rect" is shorter than "ellipse"
rect(15,5,5,5);
rect(15,25,5,5);
rect(25,15,5,5);
rect(5,25,5,5);
rect(25,25,5,5);
//set border color to gray. 99 because its noticeably gray without being a 3-digit number, saving a byte
stroke(99);
//rectangles will be hollow from now on
noFill();
//draw 4 boxes for the grid lines.  
//Draw a box around the left 1/3 of the window, then the right 1/3, 
//then the top 1/3, and lastly the bottom 1/3
rect(5,15,10,30);
rect(25,15,10,30);
rect(15,5,30,10);
rect(15,25,30,10);

Output: I can't do anything about the gray border in the image, that is the smallest Processing will let me open a window, but the actual image is in the center. If I were to save that frame of the image, it would only be the 30x30 bit in the middle.

tiny glider

PHP, 221+2 bytes

<?imagefill($i=imagecreatetruecolor(31,31),0,0,~0);function q($i,$x,$y,$f){imagerectangle($i,$x*=10,$y*=10,$x+10,$y+10,5e6);$f?:imagefilledellipse($i,$x+5,$y+5,8,8,0);}for($p=16;$p--;)q($i,$p&3,$p>>2,53>>$p&1);imagepng($i);

Save to file; call in browser. Should your browser display gibberish,
insert header("Content-Type:image-png"); before imagepng($i);.

output The dots aren´t very round; that´s due to the small proportions.

breakdown

function q($i,$x,$y,$f){        # function to draw quadrant:
    imagerectangle($i,$x*=10,$y*=10,$x+10,$y+10,5e6);   # draw lines in 0x4c4b40
    $f?:imagefilledellipse($i,$x+5,$y+5,8,8,0);         # if bit not set, draw dot
}

imagefill($i=
    imagecreatetruecolor(31,31) # create image
    ,0,0,~0);                   # fill with 0xffffff (white)
for($p=16;$p--;)q($i,           # loop through positions, call function
    $p&3,                           # $x=lower two bits
    $p>>2,                          # $y=upper two bits
    53>>$p&1                        # $f=one bit from %0000 0000 0011 0101
);                                      # (reversed inverted bit mask for dots)
imagepng($i);                   # output image

I think that 0x4c4b40 qualifies as approximated gray. If not, add four bytes.

Octave, 127 124 bytes

Removed 3 bytes thanks to Luis. grid is sufficient (instead of grid on).

spy([0,1,0;0,0,1;1,1,1],'.k',300),set(gca,'XTick',.5:4,'XTickLabel','','YTick',.5:4,'YTickLabel',''),axis(.5+[0,3,0,3]),grid

Outputs (after saving):

Note that the output shows grey grid lines in the plot window. They turn black when saving it (for some reason).

enter image description here

Well, that was long and messy! Had to go through a lot of modifications to make this adhere to the specs.

Explanation and hopefully some golfing coming up...

gnuplot, 158 156 bytes

se si ra-1
se xti 2
se yti 2
se st l 9 lc"gray"lt 1
se gr xt ls 9 yt ls 9
se bor ls 9
uns k
se form""
p'-'w cir fc"black"fs s
3 5 1
5 3 1
1 1 1
3 1 1
5 1 1

Because the radii are the same, I tried the following:

[... first eight lines same as above ...]
p'-'u 1:2:(1) w cir fc"black"fs s
3 5
5 3
1 1
3 1
5 1

But that lead to the same byte count.

Ungolfed with comments:

set size ratio -1                                     # make it a square.
set xtics 2                                           # vertical lines every 2 units
set ytics 2                                           # horizontal lines every 2 units
set style line 9 linecolor rgb "gray" linetype 1      # define line type 9 as solid gray
set grid xtics linestyle 9 ytics linestyle 9          # make internal lines of type 9
set border linestyle 9                                # make outside lines of type 9
unset key                                             # no legend please
set format ""                                         # no numbers next to axes please
plot '-' with circle fillcolor rgb "black" fill solid # plot black circles
3 5 1                                                 # at these locations
5 3 1
1 1 1
3 1 1
5 1 1
end

Octave 107 94 103 bytes

scatter([1:3,3,2],[1,1,1:3],1e5,zeros(5,3),'.');axis off;a=[1,7]/2;for i=.5:3.5;line(a,i);line(i,a);end

or

plot([1:3,3,2],[1,1,1:3],'k.','markersize',250);axis off;a=[1,7]/2;for i=.5:3.5;line(a,i);line(i,a);end

both solutions are 103 bytes.

C#, 333 bytes

using System.Drawing;_=>{var b=new Bitmap(31,31);var g=Graphics.FromImage(b);g.FillRectangle(Brushes.White,0,0,31,31);for(int x=0,y;x<3;++x)for(y=0;y<3;++y){g.DrawRectangle(Pens.Gray,x*10,y*10,10,10);if(x==1&y<1|x>1&y==1|y>1)g.FillEllipse(Brushes.Black,x*10+1,y*10+1,8,8);}b.Save("t.png");System.Diagnostics.Process.Start("t.png");};

Full/Formatted version:

using System.Drawing;
Action<int> a = _ =>
{
    var b = new Bitmap(31, 31);
    var g = Graphics.FromImage(b);

    g.FillRectangle(Brushes.White, 0, 0, 31, 31);

    for (int x = 0, y; x < 3; ++x)
        for (y = 0; y < 3; ++y)
        {
            g.DrawRectangle(Pens.Gray, x * 10, y * 10, 10, 10);
            if (x == 1 & y < 1 | x > 1 & y == 1 | y > 1)
                g.FillEllipse(Brushes.Black, x * 10 + 1, y * 10 + 1, 8, 8);
        }

    b.Save("t.png");
    System.Diagnostics.Process.Start("t.png");
};

Idea is simple we create a graphics object from the image and use that to make the image all white. Then loop over each square of the image drawing the bounding rectangle. If it is one of the locations for a dot we draw that too. Lastly we save the image to file and let windows decide how to open it, in my case it opens with Windows Photo Viewer.

Using a Process to show the image and saving to file is a lot shorter than creating a windows forms or WPF app because of all the different classes and extra fluff needed to create them.

Output:

Output

Tikz, 193 175 170 bytes

\documentclass[tikz]{standalone}\begin{document}\tikz{\def\a{)rectangle(}\def~{)circle(1)(}\draw(4,6\a2,0)(0,\a6,6)(0,2\a6,4);\fill(1,1~3,1~5,1~5,3~3,5~,)}\end{document}

Here is the output:

Output

Python 2.7, 214 311 309 bytes

from matplotlib.pyplot import*
f,x=subplots()
j=(0,0),(1,0),(2,0),(1,2),(2,1)
for i in j:x.add_artist(Circle((i),.4,color='k'))     
x.tick_params(labelbottom='off',labelleft='off')
for o in x.spines.values():o.set_edgecolor('gray')
for s in 'xy':exec"x.set_"+s+"ticks((.5,1.5,2.5));"+s+"lim(-.5,2.5);"
grid()

This is my first attempt here at code golf, so I'm sure this can be improved upon. I would have liked to not established the limits, but it appears that matplotlib can't detect that I plotted circles where I did. Without setting xlim() and ylim() it only shows the bottom two circles.

Output:

Edit

Edit:Fixed the color of the borders and removed the tick numbers. I must say matplotlib is very densely worded, and not too friendly with changing axis colors.

Shaved off 3 bytes thanks to @DJMcMayhem

Edit:Took off two bytes by setting my ticks as a tuple inside of set_ticks functions.

Here is my answer in Tcl/Tk 17 lines, 582 Characters:

proc box {sz x y} {return [list [expr {$x*$sz+4}] [expr {$y*$sz+4}] [expr {($x+1)*$sz+4}] [expr {($y+1)*$sz+4}]]}
proc oval {sz x y} {return [list [expr {$x*$sz+($sz*0.8)+4}] [expr {$y*$sz+($sz*0.8)+4}] [expr {($x+1)*$sz-($sz*0.8)+4}] [expr {($y+1)*$sz-($sz*0.8)+4}]]}
set SIZE 100
canvas .c -width [expr {$SIZE*3+8}] -height [expr {$SIZE*3+8}]
pack .c
set y 0
foreach row {{0 1 0} {0 0 1} {1 1 1}} {
set x 0
foreach dot $row {
.c create rectangle {*}[box $SIZE $x $y] -fill {} -outline grey -width 1
if {$dot} {
.c create oval {*}[oval $SIZE $x $y] -fill black
}
incr x
}
incr y
}

Output:

enter image description here

CSS+HTML, 56+84=140 bytes 52+84=136 bytes

Saved 4 bytes by incorporating suggestions from the comments.

td{border:1px solid#888;line-height:.4;font-size:3em
<table cellspacing=0><tr><td><td>•<td><tr><td><td><td>•<tr><td>•<td>•<td>•

This uses the UTF-8 character which is 2 bytes long and takes advantage of the graciousness of HTML syntax.