Done challenge 8
[cipher-tools.git] / 2017 / picture-clue.ipynb
diff --git a/2017/picture-clue.ipynb b/2017/picture-clue.ipynb
new file mode 100644 (file)
index 0000000..4ff3565
--- /dev/null
@@ -0,0 +1,457 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 43,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from PIL import Image\n",
+    "import itertools"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "im = Image.open(\"Aquilae-Clue-6.jpg\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('JPEG', 'RGB', (2580, 564))"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "im.format, im.mode, im.size"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "columns, rows = im.size"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "px = im.load()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(177, 11, 11)"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "px[1, 1]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[(252, 120, 116),\n",
+       " (168, 25, 21),\n",
+       " (185, 16, 11),\n",
+       " (187, 12, 7),\n",
+       " (182, 16, 18),\n",
+       " (200, 77, 80),\n",
+       " (255, 229, 229),\n",
+       " (255, 253, 253),\n",
+       " (255, 254, 255),\n",
+       " (255, 249, 251),\n",
+       " (255, 222, 217),\n",
+       " (166, 59, 51),\n",
+       " (175, 16, 12),\n",
+       " (195, 13, 10),\n",
+       " (189, 11, 9),\n",
+       " (160, 25, 22),\n",
+       " (250, 192, 190),\n",
+       " (255, 251, 250),\n",
+       " (255, 254, 255),\n",
+       " (255, 250, 251),\n",
+       " (255, 245, 243),\n",
+       " (215, 140, 137),\n",
+       " (164, 22, 18),\n",
+       " (187, 12, 7),\n",
+       " (186, 13, 7),\n",
+       " (171, 22, 18),\n",
+       " (162, 59, 62),\n",
+       " (255, 224, 230),\n",
+       " (255, 250, 253),\n",
+       " (254, 255, 255),\n",
+       " (255, 252, 249),\n",
+       " (255, 230, 228),\n",
+       " (176, 52, 50),\n",
+       " (185, 17, 16),\n",
+       " (190, 12, 10),\n",
+       " (182, 17, 15),\n",
+       " (161, 27, 26),\n",
+       " (255, 181, 180),\n",
+       " (255, 244, 245),\n",
+       " (255, 254, 255),\n",
+       " (255, 254, 255),\n",
+       " (255, 244, 245),\n",
+       " (255, 181, 180),\n",
+       " (161, 27, 26),\n",
+       " (182, 17, 15),\n",
+       " (190, 12, 10),\n",
+       " (185, 17, 16),\n",
+       " (176, 52, 50),\n",
+       " (255, 231, 230),\n",
+       " (255, 251, 249)]"
+      ]
+     },
+     "execution_count": 17,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[px[2, c] for c in range(50)]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 37,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[(255, 255, 250),\n",
+       " (255, 254, 250),\n",
+       " (253, 253, 253),\n",
+       " (255, 255, 255),\n",
+       " (250, 250, 252),\n",
+       " (255, 255, 255),\n",
+       " (254, 255, 255),\n",
+       " (252, 252, 250),\n",
+       " (253, 253, 251),\n",
+       " (255, 255, 253),\n",
+       " (255, 255, 255),\n",
+       " (253, 253, 253),\n",
+       " (255, 253, 254),\n",
+       " (255, 254, 255),\n",
+       " (255, 255, 253),\n",
+       " (253, 253, 251),\n",
+       " (255, 255, 255),\n",
+       " (254, 255, 255),\n",
+       " (252, 255, 255),\n",
+       " (252, 255, 253),\n",
+       " (252, 255, 251),\n",
+       " (252, 255, 253),\n",
+       " (252, 255, 255),\n",
+       " (254, 255, 255),\n",
+       " (254, 255, 255),\n",
+       " (253, 255, 254),\n",
+       " (253, 255, 252),\n",
+       " (254, 255, 251),\n",
+       " (198, 200, 197),\n",
+       " (27, 27, 27),\n",
+       " (27, 27, 29),\n",
+       " (30, 31, 33),\n",
+       " (25, 30, 26),\n",
+       " (26, 31, 27),\n",
+       " (28, 30, 29),\n",
+       " (29, 29, 31),\n",
+       " (30, 28, 31),\n",
+       " (29, 27, 30),\n",
+       " (30, 28, 29),\n",
+       " (32, 28, 27),\n",
+       " (62, 58, 57),\n",
+       " (241, 239, 240),\n",
+       " (255, 254, 255),\n",
+       " (255, 254, 255),\n",
+       " (254, 254, 255),\n",
+       " (254, 255, 255),\n",
+       " (252, 255, 253),\n",
+       " (252, 255, 253),\n",
+       " (254, 255, 255),\n",
+       " (200, 201, 203)]"
+      ]
+     },
+     "execution_count": 37,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[px[34, c] for c in range(50)]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[(185, 12, 6),\n",
+       " (201, 7, 5),\n",
+       " (200, 42, 41),\n",
+       " (255, 210, 214),\n",
+       " (255, 250, 253),\n",
+       " (255, 250, 250),\n",
+       " (255, 255, 255),\n",
+       " (254, 255, 255),\n",
+       " (254, 255, 255),\n",
+       " (254, 255, 255),\n",
+       " (255, 245, 240),\n",
+       " (255, 178, 174),\n",
+       " (176, 18, 15),\n",
+       " (199, 6, 9),\n",
+       " (191, 28, 33),\n",
+       " (255, 185, 186),\n",
+       " (255, 249, 250),\n",
+       " (255, 249, 255),\n",
+       " (255, 253, 255),\n",
+       " (255, 254, 249),\n",
+       " (255, 255, 248),\n",
+       " (255, 255, 255),\n",
+       " (255, 245, 247),\n",
+       " (255, 205, 209),\n",
+       " (188, 45, 47),\n",
+       " (196, 10, 11),\n",
+       " (185, 15, 15),\n",
+       " (225, 134, 131),\n",
+       " (255, 239, 237),\n",
+       " (255, 250, 250),\n",
+       " (255, 254, 253),\n",
+       " (255, 255, 250),\n",
+       " (255, 255, 250),\n",
+       " (252, 253, 255),\n",
+       " (255, 249, 251),\n",
+       " (255, 225, 226),\n",
+       " (198, 74, 72),\n",
+       " (199, 9, 9),\n",
+       " (200, 12, 11),\n",
+       " (189, 77, 75),\n",
+       " (255, 238, 236),\n",
+       " (255, 244, 244),\n",
+       " (255, 254, 251),\n",
+       " (255, 253, 250),\n",
+       " (255, 254, 253),\n",
+       " (254, 253, 255),\n",
+       " (255, 249, 253),\n",
+       " (255, 244, 241),\n",
+       " (221, 132, 126),\n",
+       " (184, 16, 15)]"
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[px[r + 25, 23] for r in range(50)]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 39,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "is_red = {}\n",
+    "for r in range(rows):\n",
+    "    for c in range(columns):\n",
+    "        rgb = px[c, r]\n",
+    "        if rgb[0] > 100 and rgb[1] < 100 and rgb[2] < 100:\n",
+    "            is_red[r, c] = True\n",
+    "        else:\n",
+    "            is_red[r, c] = False"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 42,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "....................................................................................................\n",
+      "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
+      "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
+      "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
+      "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
+      "###..........##..........##..........###..........##..........##..........##..........###..........#\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n",
+      "###..........##..........###.........###.........###..........##..........###.........###.........##\n",
+      "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
+      "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
+      "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
+      "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n",
+      "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
+      "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
+      "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
+      "###.........####.........###.........###.........###.........####.........###.........###.........##\n",
+      "###..........##..........###.........###.........###..........##..........###.........###.........##\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n",
+      "###.........####........####.........###.........###.........####.........###.........###.........##\n",
+      "###.........####........####........####.........####........####........####.........####........##\n",
+      "###.........####........####........####.........####........####........####.........####........##\n",
+      "###.........####........####........####.........####........####........####.........###.........##\n",
+      "###.........####........####.........###.........###.........####.........###.........###.........##\n",
+      ".............##...........#...........#...........#....................................#...........#\n",
+      "....................................................................................................\n",
+      "....................................................................................................\n"
+     ]
+    }
+   ],
+   "source": [
+    "for r in range(40):\n",
+    "    line = ''.join(\"#\" if is_red[r, c] else \".\" for c in range(100))\n",
+    "    print(line)\n",
+    "    "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 52,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "211"
+      ]
+     },
+     "execution_count": 52,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len([k for k, g in itertools.groupby(is_red[2, c] for c in range(columns)) if k])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 53,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "47"
+      ]
+     },
+     "execution_count": 53,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len([k for k, g in itertools.groupby(is_red[2, r] for r in range(rows)) if k])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 54,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "9917"
+      ]
+     },
+     "execution_count": 54,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "47 * 211"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.5.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}