905 797 677 675 629 608 Postscript
<<-1{{30 700 translate 0 0 moveto
currentfile 2{(@A1*)*}repeat exch string
3 2 roll{('BO1)*{( )(@#)*
4(,.N:;<%)*<<( ){p}/#{(1:;>%)*}0{(;,'.)*
6 -26(CE%)*}>>(IJ'B)* known not{p
0}if(LG #C)*}forall(#;*1 D%)*}repeat
p/Times-Roman 8 selectfont 99
string{('BO)*{(@)* length(#=)*{p}{(@#L)*
35(=)*{p}{cvx(GID ?'H*ID ?KHF%)*( )cvs(E)*}e}e}{showpage
exit}e}loop exit{( @#M# FMF#M)*
closepath}currentpoint stroke eq fill
mul dup token copy rmoveto sub show
neg exec add 1 index 9 get rlineto
put readline}loop}0 1 index 0 get{1
index 1 add}forall pop/*{{32 sub load
exec}forall}/e{ifelse}/p{pop}>>begin(23,?4)*<1f>*
"Readable" version:
<<-1{{
%space ! " # $ % & '( ) %* + , - . %/
30 700 translate 0 0 moveto currentfile 2{(@A1*)*}repeat exch string 3 2 roll
{('BO1)*{( )(@#)* 4(,.N:;<%)*<<( ){p}/#{(1:;>%)*}0{(;,'.)* 6 -26(CE%)*}>>(IJ'B)*
known not{p 0}if(LG #C)*}forall(#;*1 D%)*}
%0 1 2 3 4 5 6 7
repeat p /Times-Roman 8 selectfont 99 string{('BO)*{(@)* length(#=)*{p}{
(@#L)* 35(=)*{p}{cvx(GID ?'H*ID ?KHF%)*( )cvs(E)*}e}e}{showpage clear exit}e}
%8 9 : %; < = > ?
loop exit{( @#M# FMF#M)* closepath} currentpoint stroke eq fill mul
%@ A B C D E F G H I J K L M N O
dup token copy rmoveto sub show neg exec add 1 index 9 get rlineto put readline
}loop}0 1 index 0 get{1 index 1 add}forall
pop/*{{32 sub load exec}forall}/e{ifelse}/p{pop}>>begin(23,?4)*<1f>*
"Reference" version:
%!
/dx 30 def
/dy 30 def
/Times-Roman 24 selectfont
/square{dx 0 rlineto 0 dy neg rlineto dx neg 0 rlineto closepath}def
{
30 700 translate 0 0 moveto
currentfile %F
2{dup token pop exch}repeat %X Y F
exch string %X F str
3 2 roll %F str X
{ %F str
2 copy readline pop %F str st
{ %F str ch
( ) dup 0 4 3 roll put
square currentpoint stroke moveto %F str ch
<<( ){pop}
/#{pop square currentpoint fill moveto}
0{currentpoint 3 2 roll 6 -26 rmoveto show moveto}
>> 1 index 2 copy known not {pop 0} if %F str ch D key
get exec %F str
dx 0 rmoveto
} forall
0 currentpoint exch pop dy sub moveto
} repeat pop %F
/Times-Roman 8 selectfont
99 string {
2 copy readline {
dup length 0 eq {pop} {
dup 0 get 35 eq {pop} {
cvx exec
1 sub dx mul 2 add exch
1 sub dy mul 9 add neg moveto
( ) cvs show
} ifelse
} ifelse
} {showpage exit} ifelse
} loop clear
} exec
15 15
# #
# ##
## # #
# #
# #
#
# #
# #
K# # ##
## I #
L
N
S# #
#i m n figure(number), row, col
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
6 1 7
7 1 8
8 1 9
9 1 11
10 1 12
11 1 13
12 1 14
13 1 15
14 2 1
15 2 6
16 2 10
17 3 1
18 4 1
19 4 9
20 5 3
21 5 7
22 5 8
23 5 11
24 5 14
25 5 15
26 6 1
27 6 2
28 6 6
29 6 10
30 6 12
31 7 1
32 7 5
33 7 10
34 7 11
35 8 1
36 8 4
37 8 9
38 9 1
39 9 8
40 9 13
41 10 1
42 10 6
43 10 7
44 10 12
45 11 1
46 11 5
47 11 7
48 11 11
49 12 3
50 12 6
51 12 9
52 12 10
53 12 14
54 12 15
55 13 1
56 13 2
57 13 8
58 14 1
59 15 1
60 15 7
60 15 11