Updated for challenge 9
[cipher-tools.git] / 2017 / picture-clue.ipynb
1 {
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 43,
6 "metadata": {},
7 "outputs": [],
8 "source": [
9 "from PIL import Image\n",
10 "import itertools"
11 ]
12 },
13 {
14 "cell_type": "code",
15 "execution_count": 3,
16 "metadata": {},
17 "outputs": [],
18 "source": [
19 "im = Image.open(\"Aquilae-Clue-6.jpg\")"
20 ]
21 },
22 {
23 "cell_type": "code",
24 "execution_count": 4,
25 "metadata": {},
26 "outputs": [
27 {
28 "data": {
29 "text/plain": [
30 "('JPEG', 'RGB', (2580, 564))"
31 ]
32 },
33 "execution_count": 4,
34 "metadata": {},
35 "output_type": "execute_result"
36 }
37 ],
38 "source": [
39 "im.format, im.mode, im.size"
40 ]
41 },
42 {
43 "cell_type": "code",
44 "execution_count": 5,
45 "metadata": {},
46 "outputs": [],
47 "source": [
48 "columns, rows = im.size"
49 ]
50 },
51 {
52 "cell_type": "code",
53 "execution_count": 6,
54 "metadata": {},
55 "outputs": [],
56 "source": [
57 "px = im.load()"
58 ]
59 },
60 {
61 "cell_type": "code",
62 "execution_count": 8,
63 "metadata": {},
64 "outputs": [
65 {
66 "data": {
67 "text/plain": [
68 "(177, 11, 11)"
69 ]
70 },
71 "execution_count": 8,
72 "metadata": {},
73 "output_type": "execute_result"
74 }
75 ],
76 "source": [
77 "px[1, 1]"
78 ]
79 },
80 {
81 "cell_type": "code",
82 "execution_count": 17,
83 "metadata": {
84 "scrolled": true
85 },
86 "outputs": [
87 {
88 "data": {
89 "text/plain": [
90 "[(252, 120, 116),\n",
91 " (168, 25, 21),\n",
92 " (185, 16, 11),\n",
93 " (187, 12, 7),\n",
94 " (182, 16, 18),\n",
95 " (200, 77, 80),\n",
96 " (255, 229, 229),\n",
97 " (255, 253, 253),\n",
98 " (255, 254, 255),\n",
99 " (255, 249, 251),\n",
100 " (255, 222, 217),\n",
101 " (166, 59, 51),\n",
102 " (175, 16, 12),\n",
103 " (195, 13, 10),\n",
104 " (189, 11, 9),\n",
105 " (160, 25, 22),\n",
106 " (250, 192, 190),\n",
107 " (255, 251, 250),\n",
108 " (255, 254, 255),\n",
109 " (255, 250, 251),\n",
110 " (255, 245, 243),\n",
111 " (215, 140, 137),\n",
112 " (164, 22, 18),\n",
113 " (187, 12, 7),\n",
114 " (186, 13, 7),\n",
115 " (171, 22, 18),\n",
116 " (162, 59, 62),\n",
117 " (255, 224, 230),\n",
118 " (255, 250, 253),\n",
119 " (254, 255, 255),\n",
120 " (255, 252, 249),\n",
121 " (255, 230, 228),\n",
122 " (176, 52, 50),\n",
123 " (185, 17, 16),\n",
124 " (190, 12, 10),\n",
125 " (182, 17, 15),\n",
126 " (161, 27, 26),\n",
127 " (255, 181, 180),\n",
128 " (255, 244, 245),\n",
129 " (255, 254, 255),\n",
130 " (255, 254, 255),\n",
131 " (255, 244, 245),\n",
132 " (255, 181, 180),\n",
133 " (161, 27, 26),\n",
134 " (182, 17, 15),\n",
135 " (190, 12, 10),\n",
136 " (185, 17, 16),\n",
137 " (176, 52, 50),\n",
138 " (255, 231, 230),\n",
139 " (255, 251, 249)]"
140 ]
141 },
142 "execution_count": 17,
143 "metadata": {},
144 "output_type": "execute_result"
145 }
146 ],
147 "source": [
148 "[px[2, c] for c in range(50)]"
149 ]
150 },
151 {
152 "cell_type": "code",
153 "execution_count": 37,
154 "metadata": {
155 "scrolled": true
156 },
157 "outputs": [
158 {
159 "data": {
160 "text/plain": [
161 "[(255, 255, 250),\n",
162 " (255, 254, 250),\n",
163 " (253, 253, 253),\n",
164 " (255, 255, 255),\n",
165 " (250, 250, 252),\n",
166 " (255, 255, 255),\n",
167 " (254, 255, 255),\n",
168 " (252, 252, 250),\n",
169 " (253, 253, 251),\n",
170 " (255, 255, 253),\n",
171 " (255, 255, 255),\n",
172 " (253, 253, 253),\n",
173 " (255, 253, 254),\n",
174 " (255, 254, 255),\n",
175 " (255, 255, 253),\n",
176 " (253, 253, 251),\n",
177 " (255, 255, 255),\n",
178 " (254, 255, 255),\n",
179 " (252, 255, 255),\n",
180 " (252, 255, 253),\n",
181 " (252, 255, 251),\n",
182 " (252, 255, 253),\n",
183 " (252, 255, 255),\n",
184 " (254, 255, 255),\n",
185 " (254, 255, 255),\n",
186 " (253, 255, 254),\n",
187 " (253, 255, 252),\n",
188 " (254, 255, 251),\n",
189 " (198, 200, 197),\n",
190 " (27, 27, 27),\n",
191 " (27, 27, 29),\n",
192 " (30, 31, 33),\n",
193 " (25, 30, 26),\n",
194 " (26, 31, 27),\n",
195 " (28, 30, 29),\n",
196 " (29, 29, 31),\n",
197 " (30, 28, 31),\n",
198 " (29, 27, 30),\n",
199 " (30, 28, 29),\n",
200 " (32, 28, 27),\n",
201 " (62, 58, 57),\n",
202 " (241, 239, 240),\n",
203 " (255, 254, 255),\n",
204 " (255, 254, 255),\n",
205 " (254, 254, 255),\n",
206 " (254, 255, 255),\n",
207 " (252, 255, 253),\n",
208 " (252, 255, 253),\n",
209 " (254, 255, 255),\n",
210 " (200, 201, 203)]"
211 ]
212 },
213 "execution_count": 37,
214 "metadata": {},
215 "output_type": "execute_result"
216 }
217 ],
218 "source": [
219 "[px[34, c] for c in range(50)]"
220 ]
221 },
222 {
223 "cell_type": "code",
224 "execution_count": 34,
225 "metadata": {
226 "scrolled": true
227 },
228 "outputs": [
229 {
230 "data": {
231 "text/plain": [
232 "[(185, 12, 6),\n",
233 " (201, 7, 5),\n",
234 " (200, 42, 41),\n",
235 " (255, 210, 214),\n",
236 " (255, 250, 253),\n",
237 " (255, 250, 250),\n",
238 " (255, 255, 255),\n",
239 " (254, 255, 255),\n",
240 " (254, 255, 255),\n",
241 " (254, 255, 255),\n",
242 " (255, 245, 240),\n",
243 " (255, 178, 174),\n",
244 " (176, 18, 15),\n",
245 " (199, 6, 9),\n",
246 " (191, 28, 33),\n",
247 " (255, 185, 186),\n",
248 " (255, 249, 250),\n",
249 " (255, 249, 255),\n",
250 " (255, 253, 255),\n",
251 " (255, 254, 249),\n",
252 " (255, 255, 248),\n",
253 " (255, 255, 255),\n",
254 " (255, 245, 247),\n",
255 " (255, 205, 209),\n",
256 " (188, 45, 47),\n",
257 " (196, 10, 11),\n",
258 " (185, 15, 15),\n",
259 " (225, 134, 131),\n",
260 " (255, 239, 237),\n",
261 " (255, 250, 250),\n",
262 " (255, 254, 253),\n",
263 " (255, 255, 250),\n",
264 " (255, 255, 250),\n",
265 " (252, 253, 255),\n",
266 " (255, 249, 251),\n",
267 " (255, 225, 226),\n",
268 " (198, 74, 72),\n",
269 " (199, 9, 9),\n",
270 " (200, 12, 11),\n",
271 " (189, 77, 75),\n",
272 " (255, 238, 236),\n",
273 " (255, 244, 244),\n",
274 " (255, 254, 251),\n",
275 " (255, 253, 250),\n",
276 " (255, 254, 253),\n",
277 " (254, 253, 255),\n",
278 " (255, 249, 253),\n",
279 " (255, 244, 241),\n",
280 " (221, 132, 126),\n",
281 " (184, 16, 15)]"
282 ]
283 },
284 "execution_count": 34,
285 "metadata": {},
286 "output_type": "execute_result"
287 }
288 ],
289 "source": [
290 "[px[r + 25, 23] for r in range(50)]"
291 ]
292 },
293 {
294 "cell_type": "code",
295 "execution_count": 39,
296 "metadata": {},
297 "outputs": [],
298 "source": [
299 "is_red = {}\n",
300 "for r in range(rows):\n",
301 " for c in range(columns):\n",
302 " rgb = px[c, r]\n",
303 " if rgb[0] > 100 and rgb[1] < 100 and rgb[2] < 100:\n",
304 " is_red[r, c] = True\n",
305 " else:\n",
306 " is_red[r, c] = False"
307 ]
308 },
309 {
310 "cell_type": "code",
311 "execution_count": 42,
312 "metadata": {},
313 "outputs": [
314 {
315 "name": "stdout",
316 "output_type": "stream",
317 "text": [
318 "....................................................................................................\n",
319 "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
320 "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
321 "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
322 "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
323 "###..........##..........##..........###..........##..........##..........##..........###..........#\n",
324 "....................................................................................................\n",
325 "....................................................................................................\n",
326 "....................................................................................................\n",
327 "....................................................................................................\n",
328 "....................................................................................................\n",
329 "###..........##..........###.........###.........###..........##..........###.........###.........##\n",
330 "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
331 "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
332 "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
333 "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
334 "....................................................................................................\n",
335 "....................................................................................................\n",
336 "....................................................................................................\n",
337 "....................................................................................................\n",
338 "....................................................................................................\n",
339 "....................................................................................................\n",
340 "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
341 "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
342 "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
343 "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
344 "###..........##..........###.........###.........###..........##..........###.........###.........##\n",
345 "....................................................................................................\n",
346 "....................................................................................................\n",
347 "....................................................................................................\n",
348 "....................................................................................................\n",
349 "....................................................................................................\n",
350 "###.........####........####.........###.........###.........####.........###.........###.........##\n",
351 "###.........####........####........####.........####........####........####.........####........##\n",
352 "###.........####........####........####.........####........####........####.........####........##\n",
353 "###.........####........####........####.........####........####........####.........###.........##\n",
354 "###.........####........####.........###.........###.........####.........###.........###.........##\n",
355 ".............##...........#...........#...........#....................................#...........#\n",
356 "....................................................................................................\n",
357 "....................................................................................................\n"
358 ]
359 }
360 ],
361 "source": [
362 "for r in range(40):\n",
363 " line = ''.join(\"#\" if is_red[r, c] else \".\" for c in range(100))\n",
364 " print(line)\n",
365 " "
366 ]
367 },
368 {
369 "cell_type": "code",
370 "execution_count": 52,
371 "metadata": {},
372 "outputs": [
373 {
374 "data": {
375 "text/plain": [
376 "211"
377 ]
378 },
379 "execution_count": 52,
380 "metadata": {},
381 "output_type": "execute_result"
382 }
383 ],
384 "source": [
385 "len([k for k, g in itertools.groupby(is_red[2, c] for c in range(columns)) if k])"
386 ]
387 },
388 {
389 "cell_type": "code",
390 "execution_count": 53,
391 "metadata": {},
392 "outputs": [
393 {
394 "data": {
395 "text/plain": [
396 "47"
397 ]
398 },
399 "execution_count": 53,
400 "metadata": {},
401 "output_type": "execute_result"
402 }
403 ],
404 "source": [
405 "len([k for k, g in itertools.groupby(is_red[2, r] for r in range(rows)) if k])"
406 ]
407 },
408 {
409 "cell_type": "code",
410 "execution_count": 54,
411 "metadata": {},
412 "outputs": [
413 {
414 "data": {
415 "text/plain": [
416 "9917"
417 ]
418 },
419 "execution_count": 54,
420 "metadata": {},
421 "output_type": "execute_result"
422 }
423 ],
424 "source": [
425 "47 * 211"
426 ]
427 },
428 {
429 "cell_type": "code",
430 "execution_count": null,
431 "metadata": {},
432 "outputs": [],
433 "source": []
434 }
435 ],
436 "metadata": {
437 "kernelspec": {
438 "display_name": "Python 3",
439 "language": "python",
440 "name": "python3"
441 },
442 "language_info": {
443 "codemirror_mode": {
444 "name": "ipython",
445 "version": 3
446 },
447 "file_extension": ".py",
448 "mimetype": "text/x-python",
449 "name": "python",
450 "nbconvert_exporter": "python",
451 "pygments_lexer": "ipython3",
452 "version": "3.5.3"
453 }
454 },
455 "nbformat": 4,
456 "nbformat_minor": 2
457 }