day 25 optimize and improve heuristics
[aoc_eblake.git] / ocr.m4
blobdc6e1f3bddcbd7abb7c1ab5b568e5ef280e1c431
1 divert(-1)dnl -*- m4 -*-
2 # Optical Character Recognition of AOC fonts, using maps learned at
3 # https://hackage.haskell.org/package/advent-of-code-ocr-0.1.2.0/docs/src/Advent.OCR.LetterMap.html
4 # assumes common.m4 is already loaded
6 define(`_ocr', `pushdef(`ocr_', ``$2',``$1''')')
7 # small font: 2016d8, 2019d8, 2019d11, 2021d13, 2022d10
8 _ocr(`A',
9 ` XX  'dnl
10 `X  X 'dnl
11 `X  X 'dnl
12 `XXXX 'dnl
13 `X  X 'dnl
14 `X  X ')
15 _ocr(`B',
16 `XXX  'dnl
17 `X  X 'dnl
18 `XXX  'dnl
19 `X  X 'dnl
20 `X  X 'dnl
21 `XXX  ')
22 _ocr(`C',
23 ` XX  'dnl
24 `X  X 'dnl
25 `X    'dnl
26 `X    'dnl
27 `X  X 'dnl
28 ` XX  ')
29 _ocr(`E',
30 `XXXX 'dnl
31 `X    'dnl
32 `XXX  'dnl
33 `X    'dnl
34 `X    'dnl
35 `XXXX ')
36 _ocr(`F',
37 `XXXX 'dnl
38 `X    'dnl
39 `XXX  'dnl
40 `X    'dnl
41 `X    'dnl
42 `X    ')
43 _ocr(`G',
44 ` XX  'dnl
45 `X  X 'dnl
46 `X    'dnl
47 `X XX 'dnl
48 `X  X 'dnl
49 ` XXX ')
50 _ocr(`H',
51 `X  X 'dnl
52 `X  X 'dnl
53 `XXXX 'dnl
54 `X  X 'dnl
55 `X  X 'dnl
56 `X  X ')
57 _ocr(`I',
58 `XXX  'dnl
59 ` X   'dnl
60 ` X   'dnl
61 ` X   'dnl
62 ` X   'dnl
63 `XXX  ')
64 _ocr(`J',
65 `  XX 'dnl
66 `   X 'dnl
67 `   X 'dnl
68 `   X 'dnl
69 `X  X 'dnl
70 ` XX  ')
71 _ocr(`K',
72 `X  X 'dnl
73 `X X  'dnl
74 `XX   'dnl
75 `X X  'dnl
76 `X X  'dnl
77 `X  X ')
78 _ocr(`L',
79 `X    'dnl
80 `X    'dnl
81 `X    'dnl
82 `X    'dnl
83 `X    'dnl
84 `XXXX ')
85 _ocr(`O',
86 ` XX  'dnl
87 `X  X 'dnl
88 `X  X 'dnl
89 `X  X 'dnl
90 `X  X 'dnl
91 ` XX  ')
92 _ocr(`P',
93 `XXX  'dnl
94 `X  X 'dnl
95 `X  X 'dnl
96 `XXX  'dnl
97 `X    'dnl
98 `X    ')
99 _ocr(`R',
100 `XXX  'dnl
101 `X  X 'dnl
102 `X  X 'dnl
103 `XXX  'dnl
104 `X X  'dnl
105 `X  X ')
106 _ocr(`S',
107 ` XXX 'dnl
108 `X    'dnl
109 `X    'dnl
110 ` XX  'dnl
111 `   X 'dnl
112 `XXX  ')
113 _ocr(`U',
114 `X  X 'dnl
115 `X  X 'dnl
116 `X  X 'dnl
117 `X  X 'dnl
118 `X  X 'dnl
119 ` XX  ')
120 _ocr(`Y',
121 `X   X'dnl
122 `X   X'dnl
123 ` X X 'dnl
124 `  X  'dnl
125 `  X  'dnl
126 `  X  ')
127 _ocr(`Z',
128 `XXXX 'dnl
129 `   X 'dnl
130 `  X  'dnl
131 ` X   'dnl
132 `X    'dnl
133 `XXXX ')
135 # large font: 2018d10
136 _ocr(`A',
137 `  XX   'dnl
138 ` X  X  'dnl
139 `X    X 'dnl
140 `X    X 'dnl
141 `X    X 'dnl
142 `XXXXXX 'dnl
143 `X    X 'dnl
144 `X    X 'dnl
145 `X    X 'dnl
146 `X    X ')
147 _ocr(`B',
148 `XXXXX  'dnl
149 `X    X 'dnl
150 `X    X 'dnl
151 `X    X 'dnl
152 `XXXXX  'dnl
153 `X    X 'dnl
154 `X    X 'dnl
155 `X    X 'dnl
156 `X    X 'dnl
157 `XXXXX  ')
158 _ocr(`C',
159 ` XXXX  'dnl
160 `X    X 'dnl
161 `X      'dnl
162 `X      'dnl
163 `X      'dnl
164 `X      'dnl
165 `X      'dnl
166 `X      'dnl
167 `X    X 'dnl
168 ` XXXX  ')
169 _ocr(`E',
170 `XXXXXX 'dnl
171 `X      'dnl
172 `X      'dnl
173 `X      'dnl
174 `XXXXX  'dnl
175 `X      'dnl
176 `X      'dnl
177 `X      'dnl
178 `X      'dnl
179 `XXXXXX ')
180 _ocr(`F',
181 `XXXXXX 'dnl
182 `X      'dnl
183 `X      'dnl
184 `X      'dnl
185 `XXXXX  'dnl
186 `X      'dnl
187 `X      'dnl
188 `X      'dnl
189 `X      'dnl
190 `X      ')
191 _ocr(`G',
192 ` XXXX  'dnl
193 `X    X 'dnl
194 `X      'dnl
195 `X      'dnl
196 `X      'dnl
197 `X  XXX 'dnl
198 `X    X 'dnl
199 `X    X 'dnl
200 `X   XX 'dnl
201 ` XXX X ')
202 _ocr(`H',
203 `X    X 'dnl
204 `X    X 'dnl
205 `X    X 'dnl
206 `X    X 'dnl
207 `XXXXXX 'dnl
208 `X    X 'dnl
209 `X    X 'dnl
210 `X    X 'dnl
211 `X    X 'dnl
212 `X    X ')
213 _ocr(`J',
214 `   XXX 'dnl
215 `    X  'dnl
216 `    X  'dnl
217 `    X  'dnl
218 `    X  'dnl
219 `    X  'dnl
220 `    X  'dnl
221 `X   X  'dnl
222 `X   X  'dnl
223 ` XXX   ')
224 _ocr(`K',
225 `X    X 'dnl
226 `X   X  'dnl
227 `X  X   'dnl
228 `X X    'dnl
229 `XX     'dnl
230 `XX     'dnl
231 `X X    'dnl
232 `X  X   'dnl
233 `X   X  'dnl
234 `X    X ')
235 _ocr(`L',
236 `X      'dnl
237 `X      'dnl
238 `X      'dnl
239 `X      'dnl
240 `X      'dnl
241 `X      'dnl
242 `X      'dnl
243 `X      'dnl
244 `X      'dnl
245 `XXXXXX ')
246 _ocr(`N',
247 `X    X 'dnl
248 `XX   X 'dnl
249 `XX   X 'dnl
250 `X X  X 'dnl
251 `X X  X 'dnl
252 `X  X X 'dnl
253 `X  X X 'dnl
254 `X   XX 'dnl
255 `X   XX 'dnl
256 `X    X ')
257 _ocr(`P',
258 `XXXXX  'dnl
259 `X    X 'dnl
260 `X    X 'dnl
261 `X    X 'dnl
262 `XXXXX  'dnl
263 `X      'dnl
264 `X      'dnl
265 `X      'dnl
266 `X      'dnl
267 `X      ')
268 _ocr(`R',
269 `XXXXX  'dnl
270 `X    X 'dnl
271 `X    X 'dnl
272 `X    X 'dnl
273 `XXXXX  'dnl
274 `X  X   'dnl
275 `X   X  'dnl
276 `X   X  'dnl
277 `X    X 'dnl
278 `X    X ')
279 _ocr(`X',
280 `X    X 'dnl
281 `X    X 'dnl
282 ` X  X  'dnl
283 ` X  X  'dnl
284 `  XX   'dnl
285 `  XX   'dnl
286 ` X  X  'dnl
287 ` X  X  'dnl
288 `X    X 'dnl
289 `X    X ')
290 _ocr(`Z',
291 `XXXXXX 'dnl
292 `     X 'dnl
293 `     X 'dnl
294 `    X  'dnl
295 `   X   'dnl
296 `  X    'dnl
297 ` X     'dnl
298 `X      'dnl
299 `X      'dnl
300 `XXXXXX ')
302 define(`ocr_l', `ifelse(`$1',$2)')
303 define(`_ocr', `ifelse(len(`$1'), 1, ``$1'',
304   `errprintn(`ocr map incomplete')forloop(0, $3, `nl`'substr(`$2', eval(',
305   `*$4), $4)`'')')')
306 define(`ocr', `_$0(_stack_foreach(`$0_', `ocr_l(`$1',', `)', `t'), `$1',
307   ifelse(len(`$1'), 30, `6,5', `10,6'))')