From 118e11df8ce80618974577afdadaeddcfcd1ca19 Mon Sep 17 00:00:00 2001 From: Tobias Kessels Date: Thu, 12 Dec 2024 16:35:02 +0100 Subject: [PATCH] Add 12 Part 1 --- 12/12.ipynb | 922 +++++++++++++++++++++++++++++++++++++++++++++++++++ 12/input | 140 ++++++++ 12/testinput | 10 + 3 files changed, 1072 insertions(+) create mode 100644 12/12.ipynb create mode 100644 12/input create mode 100644 12/testinput diff --git a/12/12.ipynb b/12/12.ipynb new file mode 100644 index 0000000..2f34a04 --- /dev/null +++ b/12/12.ipynb @@ -0,0 +1,922 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 126, + "metadata": {}, + "outputs": [], + "source": [ + "with open('testinput','r') as infile:\n", + " data=[list(line.strip()) for line in infile.readlines()]" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from scipy.ndimage import label\n", + "\n", + "def find_clusters_matrix(grid):\n", + " grid = np.array(grid)\n", + " unique_types = np.unique(grid)\n", + " clusters = []\n", + " \n", + " for char in unique_types:\n", + " # Binary mask for current character\n", + " binary_map = (grid == char)\n", + " \n", + " # Label connected components\n", + " labeled_map, num_features = label(binary_map)\n", + " \n", + " for cluster_id in range(1, num_features + 1):\n", + " # Cluster size\n", + " cluster_mask = (labeled_map == cluster_id)\n", + " size = cluster_mask.sum()\n", + " \n", + " # Border length\n", + " border_length = 0\n", + " for x, y in zip(*np.where(cluster_mask)):\n", + " for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:\n", + " nx, ny = x + dx, y + dy\n", + " if nx < 0 or nx >= grid.shape[0] or ny < 0 or ny >= grid.shape[1] or grid[nx, ny] != char:\n", + " border_length += 1\n", + " \n", + " clusters.append({\"type\": char, \"size\": size, \"border_length\": border_length})\n", + " \n", + " return clusters\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'type': 'C', 'size': 14, 'border_length': 28}, {'type': 'C', 'size': 1, 'border_length': 4}, {'type': 'E', 'size': 13, 'border_length': 18}, {'type': 'F', 'size': 10, 'border_length': 18}, {'type': 'I', 'size': 4, 'border_length': 8}, {'type': 'I', 'size': 14, 'border_length': 22}, {'type': 'J', 'size': 11, 'border_length': 20}, {'type': 'M', 'size': 5, 'border_length': 12}, {'type': 'R', 'size': 12, 'border_length': 18}, {'type': 'S', 'size': 3, 'border_length': 8}, {'type': 'V', 'size': 13, 'border_length': 20}]\n" + ] + } + ], + "source": [ + "clusters = find_clusters_matrix(data)\n", + "print(clusters)" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1930" + ] + }, + "execution_count": 129, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum(cluster['size']*cluster['border_length'] for cluster in clusters)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Part 2" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": {}, + "outputs": [], + "source": [ + "directions = [\n", + " (1, -1, 0),\n", + " (2, 1, 0),\n", + " (4, 0, -1),\n", + " (8, 0, 1),\n", + "]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from scipy.ndimage import label\n", + "\n", + "def find_clusters_matrix(grid):\n", + " grid = np.array(grid)\n", + " unique_types = np.unique(grid)\n", + " clusters = []\n", + " \n", + " for char in unique_types:\n", + " # Binary mask for current character\n", + " binary_map = (grid == char)\n", + " \n", + " # Label connected components\n", + " labeled_map, num_features = label(binary_map)\n", + " \n", + " for cluster_id in range(1, num_features + 1):\n", + " # Cluster size\n", + " cluster_mask = (labeled_map == cluster_id)\n", + " size = cluster_mask.sum()\n", + " bordermaps = np.zeros(grid.shape,dtype=int)\n", + "\n", + " # Border length\n", + " for x, y in zip(*np.where(cluster_mask)):\n", + " for direction, dx, dy in directions:\n", + " nx, ny = x + dx, y + dy\n", + " if nx < 0 or nx >= grid.shape[0] or ny < 0 or ny >= grid.shape[1] or grid[nx, ny] != char:\n", + " bordermaps[x][y] |= direction\n", + " print(bordermaps)\n", + " border_length = 0\n", + " border_sides = 0\n", + " for direction,dx,dy in directions:\n", + " map = (bordermaps & direction) != 0\n", + " border_length += np.sum(map)\n", + " map2, sides = label(binary_map)\n", + " print(map2)\n", + " border_sides += sides\n", + "\n", + " clusters.append({\"type\": char, \"size\": size, \"border_length\": border_length, \"border_sides\":border_sides})\n", + " \n", + " return clusters\n" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 0 0 0 0 0 5 9 0 0]\n", + " [ 0 0 0 0 0 0 4 2 11 0]\n", + " [ 0 0 0 0 0 5 10 0 0 0]\n", + " [ 0 0 0 7 1 10 0 0 0 0]\n", + " [ 0 0 0 0 12 0 0 0 0 0]\n", + " [ 0 0 0 0 6 9 0 0 0 0]\n", + " [ 0 0 0 0 0 14 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 1 0]\n", + " [0 0 0 0 0 1 1 0 0 0]\n", + " [0 0 0 1 1 1 0 0 0 0]\n", + " [0 0 0 0 1 0 0 2 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 1 0]\n", + " [0 0 0 0 0 1 1 0 0 0]\n", + " [0 0 0 1 1 1 0 0 0 0]\n", + " [0 0 0 0 1 0 0 2 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 1 0]\n", + " [0 0 0 0 0 1 1 0 0 0]\n", + " [0 0 0 1 1 1 0 0 0 0]\n", + " [0 0 0 0 1 0 0 2 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 1 0]\n", + " [0 0 0 0 0 1 1 0 0 0]\n", + " [0 0 0 1 1 1 0 0 0 0]\n", + " [0 0 0 0 1 0 0 2 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 15 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 1 0]\n", + " [0 0 0 0 0 1 1 0 0 0]\n", + " [0 0 0 1 1 1 0 0 0 0]\n", + " [0 0 0 0 1 0 0 2 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 1 0]\n", + " [0 0 0 0 0 1 1 0 0 0]\n", + " [0 0 0 1 1 1 0 0 0 0]\n", + " [0 0 0 0 1 0 0 2 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 1 0]\n", + " [0 0 0 0 0 1 1 0 0 0]\n", + " [0 0 0 1 1 1 0 0 0 0]\n", + " [0 0 0 0 1 0 0 2 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 1 0]\n", + " [0 0 0 0 0 1 1 0 0 0]\n", + " [0 0 0 1 1 1 0 0 0 0]\n", + " [0 0 0 0 1 0 0 2 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 13]\n", + " [ 0 0 0 0 0 0 0 0 5 8]\n", + " [ 0 0 0 0 0 0 0 0 4 8]\n", + " [ 0 0 0 0 0 0 0 0 4 8]\n", + " [ 0 0 0 0 0 0 0 5 0 8]\n", + " [ 0 0 0 0 0 0 0 6 2 10]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 1]\n", + " [0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 1 1 1]\n", + " [0 0 0 0 0 0 0 1 1 1]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 1]\n", + " [0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 1 1 1]\n", + " [0 0 0 0 0 0 0 1 1 1]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 1]\n", + " [0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 1 1 1]\n", + " [0 0 0 0 0 0 0 1 1 1]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 1]\n", + " [0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 1 1 1]\n", + " [0 0 0 0 0 0 0 1 1 1]]\n", + "[[ 0 0 0 0 0 0 0 0 7 9]\n", + " [ 0 0 0 0 0 0 0 0 0 12]\n", + " [ 0 0 0 0 0 0 0 5 1 8]\n", + " [ 0 0 0 0 0 0 0 6 0 10]\n", + " [ 0 0 0 0 0 0 0 0 14 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 0 0 1]\n", + " [0 0 0 0 0 0 0 1 1 1]\n", + " [0 0 0 0 0 0 0 1 1 1]\n", + " [0 0 0 0 0 0 0 0 1 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 0 0 1]\n", + " [0 0 0 0 0 0 0 1 1 1]\n", + " [0 0 0 0 0 0 0 1 1 1]\n", + " [0 0 0 0 0 0 0 0 1 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 0 0 1]\n", + " [0 0 0 0 0 0 0 1 1 1]\n", + " [0 0 0 0 0 0 0 1 1 1]\n", + " [0 0 0 0 0 0 0 0 1 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 1 1]\n", + " [0 0 0 0 0 0 0 0 0 1]\n", + " [0 0 0 0 0 0 0 1 1 1]\n", + " [0 0 0 0 0 0 0 1 1 1]\n", + " [0 0 0 0 0 0 0 0 1 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[ 0 0 0 0 5 9 0 0 0 0]\n", + " [ 0 0 0 0 6 10 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 2 0 0 0 0 0 0 0]\n", + " [0 0 2 2 2 0 0 0 0 0]\n", + " [0 2 2 2 2 2 0 0 0 0]\n", + " [0 2 2 2 0 2 0 0 0 0]\n", + " [0 0 0 2 0 0 0 0 0 0]]\n", + "[[0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 2 0 0 0 0 0 0 0]\n", + " [0 0 2 2 2 0 0 0 0 0]\n", + " [0 2 2 2 2 2 0 0 0 0]\n", + " [0 2 2 2 0 2 0 0 0 0]\n", + " [0 0 0 2 0 0 0 0 0 0]]\n", + "[[0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 2 0 0 0 0 0 0 0]\n", + " [0 0 2 2 2 0 0 0 0 0]\n", + " [0 2 2 2 2 2 0 0 0 0]\n", + " [0 2 2 2 0 2 0 0 0 0]\n", + " [0 0 0 2 0 0 0 0 0 0]]\n", + "[[0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 2 0 0 0 0 0 0 0]\n", + " [0 0 2 2 2 0 0 0 0 0]\n", + " [0 2 2 2 2 2 0 0 0 0]\n", + " [0 2 2 2 0 2 0 0 0 0]\n", + " [0 0 0 2 0 0 0 0 0 0]]\n", + "[[ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 13 0 0 0 0 0 0 0]\n", + " [ 0 0 4 1 9 0 0 0 0 0]\n", + " [ 0 5 0 0 2 9 0 0 0 0]\n", + " [ 0 6 2 8 0 14 0 0 0 0]\n", + " [ 0 0 0 14 0 0 0 0 0 0]]\n", + "[[0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 2 0 0 0 0 0 0 0]\n", + " [0 0 2 2 2 0 0 0 0 0]\n", + " [0 2 2 2 2 2 0 0 0 0]\n", + " [0 2 2 2 0 2 0 0 0 0]\n", + " [0 0 0 2 0 0 0 0 0 0]]\n", + "[[0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 2 0 0 0 0 0 0 0]\n", + " [0 0 2 2 2 0 0 0 0 0]\n", + " [0 2 2 2 2 2 0 0 0 0]\n", + " [0 2 2 2 0 2 0 0 0 0]\n", + " [0 0 0 2 0 0 0 0 0 0]]\n", + "[[0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 2 0 0 0 0 0 0 0]\n", + " [0 0 2 2 2 0 0 0 0 0]\n", + " [0 2 2 2 2 2 0 0 0 0]\n", + " [0 2 2 2 0 2 0 0 0 0]\n", + " [0 0 0 2 0 0 0 0 0 0]]\n", + "[[0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 2 0 0 0 0 0 0 0]\n", + " [0 0 2 2 2 0 0 0 0 0]\n", + " [0 2 2 2 2 2 0 0 0 0]\n", + " [0 2 2 2 0 2 0 0 0 0]\n", + " [0 0 0 2 0 0 0 0 0 0]]\n", + "[[ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 13 0 0 0]\n", + " [ 0 0 0 0 0 7 8 0 0 0]\n", + " [ 0 0 0 0 0 0 4 9 0 0]\n", + " [ 0 0 0 0 0 0 4 8 0 0]\n", + " [ 0 0 0 0 0 0 4 10 0 0]\n", + " [ 0 0 0 0 0 0 12 0 0 0]\n", + " [ 0 0 0 0 0 0 14 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 1 0 0 0]\n", + " [0 0 0 0 0 1 1 0 0 0]\n", + " [0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 0 0 0]\n", + " [0 0 0 0 0 0 1 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 1 0 0 0]\n", + " [0 0 0 0 0 1 1 0 0 0]\n", + " [0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 0 0 0]\n", + " [0 0 0 0 0 0 1 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 1 0 0 0]\n", + " [0 0 0 0 0 1 1 0 0 0]\n", + " [0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 0 0 0]\n", + " [0 0 0 0 0 0 1 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 1 0 0 0]\n", + " [0 0 0 0 0 1 1 0 0 0]\n", + " [0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 1 0 0]\n", + " [0 0 0 0 0 0 1 0 0 0]\n", + " [0 0 0 0 0 0 1 0 0 0]]\n", + "[[ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [13 0 0 0 0 0 0 0 0 0]\n", + " [12 0 0 0 0 0 0 0 0 0]\n", + " [ 6 3 11 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [1 0 0 0 0 0 0 0 0 0]\n", + " [1 0 0 0 0 0 0 0 0 0]\n", + " [1 1 1 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [1 0 0 0 0 0 0 0 0 0]\n", + " [1 0 0 0 0 0 0 0 0 0]\n", + " [1 1 1 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [1 0 0 0 0 0 0 0 0 0]\n", + " [1 0 0 0 0 0 0 0 0 0]\n", + " [1 1 1 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [1 0 0 0 0 0 0 0 0 0]\n", + " [1 0 0 0 0 0 0 0 0 0]\n", + " [1 1 1 0 0 0 0 0 0 0]]\n", + "[[ 5 1 1 9 0 0 0 0 0 0]\n", + " [ 6 2 0 8 0 0 0 0 0 0]\n", + " [ 0 0 4 2 11 0 0 0 0 0]\n", + " [ 0 0 14 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]]\n", + "[[1 1 1 1 0 0 0 0 0 0]\n", + " [1 1 1 1 0 0 0 0 0 0]\n", + " [0 0 1 1 1 0 0 0 0 0]\n", + " [0 0 1 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[1 1 1 1 0 0 0 0 0 0]\n", + " [1 1 1 1 0 0 0 0 0 0]\n", + " [0 0 1 1 1 0 0 0 0 0]\n", + " [0 0 1 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[1 1 1 1 0 0 0 0 0 0]\n", + " [1 1 1 1 0 0 0 0 0 0]\n", + " [0 0 1 1 1 0 0 0 0 0]\n", + " [0 0 1 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[1 1 1 1 0 0 0 0 0 0]\n", + " [1 1 1 1 0 0 0 0 0 0]\n", + " [0 0 1 1 1 0 0 0 0 0]\n", + " [0 0 1 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 13 0 0 0 0 0]\n", + " [ 0 0 0 0 6 11 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 1 0 0 0 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 1 0 0 0 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 1 0 0 0 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 1 0 0 0 0 0]\n", + " [0 0 0 0 1 1 0 0 0 0]]\n", + "[[ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 5 9 0 0 0 0 0 0 0 0]\n", + " [ 4 8 0 0 0 0 0 0 0 0]\n", + " [ 4 0 3 9 0 0 0 0 0 0]\n", + " [ 4 8 0 14 0 0 0 0 0 0]\n", + " [ 6 10 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]\n", + " [ 0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [1 1 0 0 0 0 0 0 0 0]\n", + " [1 1 0 0 0 0 0 0 0 0]\n", + " [1 1 1 1 0 0 0 0 0 0]\n", + " [1 1 0 1 0 0 0 0 0 0]\n", + " [1 1 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [1 1 0 0 0 0 0 0 0 0]\n", + " [1 1 0 0 0 0 0 0 0 0]\n", + " [1 1 1 1 0 0 0 0 0 0]\n", + " [1 1 0 1 0 0 0 0 0 0]\n", + " [1 1 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [1 1 0 0 0 0 0 0 0 0]\n", + " [1 1 0 0 0 0 0 0 0 0]\n", + " [1 1 1 1 0 0 0 0 0 0]\n", + " [1 1 0 1 0 0 0 0 0 0]\n", + " [1 1 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[[0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [1 1 0 0 0 0 0 0 0 0]\n", + " [1 1 0 0 0 0 0 0 0 0]\n", + " [1 1 1 1 0 0 0 0 0 0]\n", + " [1 1 0 1 0 0 0 0 0 0]\n", + " [1 1 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]\n", + " [0 0 0 0 0 0 0 0 0 0]]\n", + "[{'type': 'C', 'size': 14, 'border_length': 28, 'border_sides': 8}, {'type': 'C', 'size': 1, 'border_length': 4, 'border_sides': 8}, {'type': 'E', 'size': 13, 'border_length': 18, 'border_sides': 4}, {'type': 'F', 'size': 10, 'border_length': 18, 'border_sides': 4}, {'type': 'I', 'size': 4, 'border_length': 8, 'border_sides': 8}, {'type': 'I', 'size': 14, 'border_length': 22, 'border_sides': 8}, {'type': 'J', 'size': 11, 'border_length': 20, 'border_sides': 4}, {'type': 'M', 'size': 5, 'border_length': 12, 'border_sides': 4}, {'type': 'R', 'size': 12, 'border_length': 18, 'border_sides': 4}, {'type': 'S', 'size': 3, 'border_length': 8, 'border_sides': 4}, {'type': 'V', 'size': 13, 'border_length': 20, 'border_sides': 4}]\n" + ] + } + ], + "source": [ + "clusters = find_clusters_matrix(data)\n", + "print(clusters)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "532" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum(cluster['size']*cluster['border_sides'] for cluster in clusters)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'type': 'C', 'size': 14, 'border_length': 28, 'border_sides': 8},\n", + " {'type': 'C', 'size': 1, 'border_length': 4, 'border_sides': 8},\n", + " {'type': 'E', 'size': 13, 'border_length': 18, 'border_sides': 4},\n", + " {'type': 'F', 'size': 10, 'border_length': 18, 'border_sides': 4},\n", + " {'type': 'I', 'size': 4, 'border_length': 8, 'border_sides': 8},\n", + " {'type': 'I', 'size': 14, 'border_length': 22, 'border_sides': 8},\n", + " {'type': 'J', 'size': 11, 'border_length': 20, 'border_sides': 4},\n", + " {'type': 'M', 'size': 5, 'border_length': 12, 'border_sides': 4},\n", + " {'type': 'R', 'size': 12, 'border_length': 18, 'border_sides': 4},\n", + " {'type': 'S', 'size': 3, 'border_length': 8, 'border_sides': 4},\n", + " {'type': 'V', 'size': 13, 'border_length': 20, 'border_sides': 4}]" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clusters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = np.full((3,3),'',dtype=object)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([['', '', ''],\n", + " ['', '', ''],\n", + " ['', '', '']], dtype=object)" + ] + }, + "execution_count": 98, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a[:] = 'up'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a[1][2]='down'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([['up', 'up', 'up'],\n", + " ['up', 'up', 'down'],\n", + " ['up', 'up', 'up']], dtype=object)" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ True, True, True],\n", + " [ True, True, False],\n", + " [ True, True, True]])" + ] + }, + "execution_count": 101, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a=='up'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([['up', 'up', 'up'],\n", + " ['up', 'up', 'down'],\n", + " ['up', 'up', 'up']], dtype=object)" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a" + ] + }, + { + "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.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/12/input b/12/input new file mode 100644 index 0000000..aad0948 --- /dev/null +++ b/12/input @@ -0,0 +1,140 @@ +QQQQQQQQQQQQQQQQQQQWWWWWWWWRYYYYYYYYYYOOOOMOYYYYBBYYYYBBBGGGGGVVVVVNNNNPPOOOOOOOOOOOOOGGGGGGGGGGKTTTTTTTVVVVKKKKKKKKKKKKKKKKPDPBBBBBBBBBBBBB +QQAQAQQQQQQQQQQQQMMWWWWWWWWRRRYRYOOYOOOOOOOOHHHYBBBYBBBBBGGGVGVVVVVNPPPPPPOOOOOOOOOOOGGQGGGGGGGGGTTTTTTTVVKKKKKKKKKKKKKKKKKKPPPPPBBBBBBBBBBB +QQAAAQQQQQQQQQQQMMMWWWWMMWRRRRYRRROOOOOOOOOHSHIBBBBBBBBBBVGGVVVVVVRPKKPPPPOOOOPPPOOOOGGGGGGGGGGGGTTTTTTTVVVKKKKKKKKKKKKKJJKKPPPBBBBBBBBBBBBB +QAAAAAUQJQQQQQQQQMMMMWMMMMRRRRRRRRROOOOOOOOHHHBBBBBBBBBBBVVVVVVVVVVPPPPPPPPPPOPPOOOOOGTTTTTTTTTTTTTTTTTTVVVKKKKRRKKKKKKKKJPPPBBBBBBBFFFBBBBB +AAAAAAUUJQQQQQQQQMMMMWMMMMRRRRRRRRROOOOOOOOHHHHBBBBBBBBBBVVVVVVVVVVVVPPPPPPPPPAPPPPGGGTTTTTTTTTTTTTTTTVVVVVVKKKKRKRKKRKJJJPPBBBBBBFFFFBBBBBB +AAAAAAAAJQQQQQQMMMMMMMMMMMRRRRRRRRROOOOOOOOHHHDDDDDBDBBBBBVVVVVVVVVPPPPPPPPPPPPPPPPGGGTTTTTTTTTTTTTTTTVVVVVVVKKRRRRRKRRJJJJBBBBBBBBFFFFFBFBB +AAAAAAJJJJQQQQQQRAMMMMMMMMRRRRRRRRROOOUOOOHHHHDDDDDDDDBBBBVVVVVVVVVVPPPPPPPPPPPPPPPGGGGGGGGGGGTTTTTTTTVVVAAVMRRRRRRRRRRJJJJJJBBBBBFFFFFFFFFS +AAAAAJJJJJQQQQQAAAAMMMMMMZZRNRRRRRRRRRUOOOHHDDDDDDDDDDDBBBBBBVVVVVVPPPPPPPPPPPPGGGUGGGGGGGGGGGTTTTTTTTVVVARRRRRRRRRRRRRJJJJJBBBBBBFFFFFFFFFS +JAAAJJJJJJQQQQQAAAAAAMAAZZZRRRRRRRRRRRUOOHHHHHDDDDDDDHHBBBHBBUUUUVVVPPPPPPPPPPPPGGUGGGGGGGGGGGTTTTTTTTAVVARRRRRRRRRRRRJJJJJJBBBBFFFFFFFFFUUS +JAAJJJJJJJJQJLAAAAAAAAAAAZURUUURRRRRRRRRRHHHHHHHHDHDHHHHHHHBBHUUUUUVPPPPPPPPPPPGGGGGGGGGGGGGGGGGXGGAAAAAAARRRRRRRRRRRRRJJJJJBBJBFFFFFFFFFFFS +JJJJJJJEJJJJJAAAAAAAAAAAAUUVUUUURRRRRRRRRRHHHHHHHHHDHHHHHHHBHHUUUUUUPPPPPPPPPPPPGGGGGGGGGGGGGGGGGGGGAAAAAARRRRRRRRRRRRRRVJJJJBJJJFFFFSSSSSSS +JJJJJJJEEEEEEAAAAAAAAAAAAUUUUUUUURRRRRRRNRRHHHHHHHHHHHHHHHHHHHUUUUUUUPPPPPPPPPPPGGGGGGGGGGGGPGGGGGGGGGAAAAARRRRRRRRRRRRRVJJJJJJJSSFFFSSSSSSS +JJJJJEEEEEEEEEAIIIIIIAAAFFUUUUUUUUZRRRRRNPPHHHHHHHHHHHHHHHHHHHHUUUUPPPPFPPFPPPPPPBBGGGBGGGGGGGGGGGGGGGAAAAAAAAARRRRRRRRYVJJJJJJSSSSSSSSSSSSS +JJJJJJEIIIIIIIIIIIIIIAAAFFFUUUUUUURRRRNNNPPPPHHHHHHHHHHHHHHHHHUUUUUPPFFFFFFFPBBBBBBBBBBBBBGGGGGGGGGGGGGAAAAAAAAMRRRRRRRRVVVVJJSSSSSSSSSSSSSS +JJJJJJJIIIIIIIIIIIIIIAAFFFFUUUUUUUUHUNNPPZPPPYHHHYHHHHHIHHHHHHHUUUUUOFFFFFFFBBBBBBBBBBBBBBBBGGGGGGGGGGGGGAAAAARRRRRRVVVVVVVVVJSSSSSSSSSSSSSS +JJJJJJJIIIIIIIIIIIIIIAAFFFFFUUUUUUUUUPPPPPPPPYYYYYHHHHHHRHHHHHHUUUUUOOFFFFFFBBBBBBBBBBFFBBBBBGGGGGGUUGGUAAAAAAARRRRRRVVVVVVVASSSSSSSSSSSSSSS +JJJJEJJIIIIIIIIIIIIIIFFFFFFFFUUUUUUUUUUUPVPPPYYYYYHHHHRRRHHHHHHRROOOOFFFFFXBBBBBBBBBBFFFFBBBGGGGUUUUUUUUAAAVVVVRRRRRVVVVVVVVAASSSSSSSSSSSSSS +JJJJEEEIIIIIIIIIIIIIIFFFFFFFFFFUUUUUUUVUKVPPPYYYXXHHPHRRRRRRRRRRROOOOOOFFFFBBBBBBBBBBFFFFBBBBGGGUUUUUUURAAAVVVVJJRVVVVVVVVVVVASIVGSSSSSMSSSS +VJJJHEEIIIIIIIIIIIIIIFFFFFFFFFFUUUUUVVVKKVVVXXXXXQNHHHRRRRRRRRRRROOOOOFFFFSBBBBBBBBBBFFFFBBBIGGUUUUUUUNUUEEVVVVVVVVVVVVVVVVVVSSVVSSSSSSMMMSS +VJJJJTTIIIIIIIIIIIIIIFFFFFFFFFFUUUUUVVVVVVVVXXQQQQQHHRRRRRRRRRRRRROOOOOOOFSBBBBJJBBBJFFFFFIBIGUUUUUUUUUUUUUVVVVVVVVVVVVVVVVVVVVVVSSSSSSSMMSS +VVVJTTEEEIIIIIIIIIIFFFFFFFFAFUUUVVVUVVVVVVVVXXXXQQQQHRRRGGRRRRRRRROLOOOOOOBBBJJJJJJJJFFFFFIIIIIUUUUUUUUUUUUVVVVVVVVVVVVVQVVVVVVVWWWSWWMMMMSS +VVVTTTTEEIIIIIIIIIIFFFFFFFFFFUUUUVVVVVVVVVVXXXXQQQQQQRRGGGRRNRRRRROLOOLLOOBBBEEJJJJJJJJOFFIIIIUUUUUUUUUUUUUAVVVVVVVQQQQQQQQQVVVWWWWWWWMKKMMM +VVVTEEEEEIIIIIIIIIIFFFFFFFFFFUUUVVVVVVVVVVVXXXXXQQQQQQQGGGGNNRNNNRRLLOOLOOOLBEEJJJJJOOOOFFFIIIUUUUUUUUUUUUUQVQQQVVVQQQQQQQQQQQQWWWWWWWMMMMMM +VVVVVEEEEIIIIIIIIIIFFFFFFFFUUUUVVVVVVVVVVXXXXXXXQQQQQLLLGLLNNNNNNNNLLLLLLLLLBBZZZJJJJOOIFFIIIIIUUUUUUUUUUUUQQQQQQQVQQQQQQQQQQQQWWWWWWWMMMMMM +VVVVEEEEEIIIIIIIIIIMFFFFFUFUUVUVVVVVVVVVVVVVXXQQQQQQQLLLGLNNNNNNNNNNLLLLLLLLZZZZZZZZIIIIIFIIIIIIIUUUUUUUUUQQQQQQQQQQQQQQQYQYYWWWWWWMMMMMMMMM +VHVHPEEIIIIIIIIIIIIMMMMFUUUUUVVVVVVVVVVVVVVVXXXQQQQMQMLLLLLNNNNNNNNNNLLLLLLLZZZZZZZZZIIIIIIIIIIIUUUUUUUUUUUQQQQQQQQQQQQQQQQQYWWNNNWWWMMMMMMM +VHHHHHHHIIIIIIIIIIIMMMMFFUUUUVVVVVVVVVVVVVXXXXXQQMQMNMMMMLLNNNIINNNNLLLLLLLLLZZZZZZZZPIIIIIIIIUUUUURRRUUUUQQQQQQQQQQQQQQQSSQWWWZNNNWWMMMMMMM +VHHHHHHIIIIIIIMMMMMMMMMUUUUUVVVVVVVVVVVVVVVXXXXXXMMMMMMMIIIIIIIINNNLLLLLLLLLLZZZZZZZZIIIIIIIIIUUUUURRRUUUWQQQQQQQQQQQQQQSSSSWWSZNNNWMMMMMMMM +HHHHHHHHIIIIIIMMMMMMMMMSUMUUUULVYVVVVVVLVVBEEXXXXMMMMMMMIIIIIIINNLLLLLLLLLLLLLZZZZZZZGIIIIIIIIUUUURRRRRSUUUQQQQQQQSSSSSSSSSSSSSSSNWWWMMMMMMM +HHHHHHGGGIVVMMMMMMMMSMSSSUUUUULVYVVVVVVLEEEEEEEEEEMMMMMMMIIIIIIIILLLLLLLLLLLLLLLZZZGGGIIIIIIIIRRURRRRRRRRQQQQQQQQQQSSSSSSSSSSLOOOOOOOMMMMMMM +HHHHHHHHHHHHHPMMMMMMSSSSSUUUUULSSHVVVVVSSFFFEEEEEEMMMMMIIIIIIIRRRRLLLLLLLLLLLLLLZZZCGGIIIIIIIIRRRRRRRRRRRRQRRQQQQQTSYSSSSSSSSLOOOOOOOMMMMMMM +HHHHHHHHUHHHHPPPMMMMMSSSSUUUULLSSHVVVVVSSSFSEEEEEEEMMMIIIIIIIIRRRRRRLLLLLLLLLLLLCZCCGIIIIIIIIIIRRRRRRRRRRRRRRRQTTTTYYSSSSSSSSSOOOOOOOSSMMMMM +HHHHHHHUUUHHHHPPMMMBBJSJJJJKULLSSSSSSSSSSSSSEEEEEEMMMMEEIIIIIIRRRRRRLLLLLLLLLLLLCCCCGIIIIIIIIYRRRRRRRRRRRRRRRRQITTTYSSSSSSGSSSOOOOOOOSSMMMRR +HHHHHHHHUHHHPPPPPPMJJJJJJKKKULSSSSSSSSSSSSSSEEEEEEEEEEEEIIIIIIRRRRRLLLLLLLLGGPPGGCGGGIIIIIIIYYYRRRRRRRRRRRRRRRRTTTTTSSXXXSGSSSOOOOOOOSSSSSRR +HHHHHHHHUHHHHPPPPPPPJJJJJKKKULLSSSSSSSSSSSSSEEEEEEEEEEEIIRIIIIRRRRRRLLLLLLJGGGGGGGGGGIMIIIIYYRRRRRRRRRRRRRRRRRRRTTTXXPXXXXXXBSSSOOOOOSSSSSSS +HHHHHHHHHHHHPPPPPPJJJJJJJKKKKSSSSSSSSSSSSSSSEEEEEEEEEEESIRRRRRRRRRRRRRRLLLJGGGGGGGGGGMMIIXYYYRRRRRRRRRRRRRRRRRRTTTXXXXXXOOOOOOOOOOOOOSSSSSSZ +HHHHHHHHHHPPPPPPPPPJJJJJJKKKKSSSSSSSSSSSSSSEEEEEEEEECCECRRRRRRRRRRRRRRRRLLJGGGGGGGGGGMMIIXYYYYRRRRRQRRRRRRRRRTTTTTXXXXXXOOOOOOOOOOOOOSSSSSSZ +HHHHHHHZZXZPPPPPPJPPJJJJJKKKSSSSSSSSSSSSSSSSEEECECCCCCCCCRRRRRRRRRRRRRRRGGGGGGGGGGGGGXMXXXYXKKKKRRKQQQRRRTTFRTTTTTXXXXXXOOOOOOOOOOOOOSSSSSSZ +HHHHHHZZZZZZZPPPPJJJJJJJJLLKSSSZZSSSSSSSSSEEEEECCCCCCCCCCRRRRRRRBRRRHHRRRGGGGGGGGGUUUXXXXXXXXKKKXKKRRRROROTTTTTTTXXXXXXBOOOOOOOOOOOOOSSSSSSS +HHHHHHHZZZZZZZZPPJJJJJJJJLLLOOSZZZTTSSSWSSEEEEEECCCCCCCCRRRRRRRRBRRHHRRGGGGGGGGGGGUUUXXXXXXXXXKKKKOOOOOOOOTTTTTTTXXXXXBBOOOOOOOOOOOFFSSSSSSS +HHHHHHZZZZZZZZZPPPPPJJJJJLLLOZZZZZZZSSSSEEEEEEEEECCCCCCCRRRRRBBBBBRRHHGGGGGGGGGGGGGGUXXXXXXXXKKKKKOOOOOOOOOTTTTTTXXXXXXBOOOOOOOOOTTFFSSSSSSN +HHHHHHZZZZZZZZPPPPPPPJJKLLLZZZZZZZZZZJSESSSSSSSSSSCCCCCCRRBBRBBBBBRTHHHHGGGGGGGGGGGGUUXXXXXXKKKKKKKOOOOOOOOTTTTTTXXXXXXXOOOOOOOOOTTFDSSSSSSN +HHHHHZZZZZZZZZZZPPPPPJJJLLLZZZZZZZZUZCSESSSSSSSSSSCCCCCCRRBBBBBBBBHHHHHHGGGGGGGGGGGGGUXXXXXXKKKKKKKOOOOOOOOTTOTTTTVXXXXUUUUUUVBFTTTSSSSSNNNN +HHZZZZZZZZZZZZZZPPPPPPJJLLLLZZZZZZZSSSSSSSSSSSSSSSCCCCCCCRBBBBBBBBHHHHHZGGGGGGGGGDGGGGXXXXXXKKKKKKKKOOOOOOOTTOOUUUUUXUUUVVUVVVVVVTTTTSNNNNNN +HHZZZZZZZZZZZZZPPPPPPILLLLLLLZZZZZMSSSSSSSSSSSSSSSIIIICRRRBBBBBBBHHHHHHGGGGGDDDDDDFFGGGXXXXXXKKKKKKOOOOOOOOOOOUUUUUUXUUUVVCVVVVVVVVTTTVNNNNN +HHHZZZZZZZZZZZZZZZZZPIILLLLLLZZZCCCSSSSSSSSSSSSSSSITTTCRRRRBBBBBBBHHHHHHHHGGDNNDDDFFGXXXXXXXKKKXXOOOOOOOOOOHOOUUUUUUXUUUUVVVVVVVVVVTTTVVNVNN +HHHZZZZZZZZZZZZZZZZZIILLLLLLLLLCCCCSSSSSSSSSSSSSSSITTTTZZRBBBBBBBHHHHHHHHHHHDDDDDDDDDXXXXXXXKKXXXOOOOOHOOHOHHHUUUUUUUUUUUXXVVVVVVVVVVVVVVVNN +HHHHHZZZZZZZZZZZZZZZIIIIILLLLLCCCCCSSSSSSSSSSSSSSSQDTTTZZRZBBBBBHHHHHHHHHHHDDDDDDDDDDDXXXXXXKKKXXOOOOOHOOHHHHHUUUUUUUUUUUXXXVVVVVVVVVVVVVVVV +HHHHHZZZZZZZZZZZZZZIIIIIILLLLLCCCCCSSSSSSSSSSSSSSSQTTNNZZZZFFFHHHHHHHHQQQHQPPPPDDDDDDDDDXXXXXXXXXOZOZOHHHHHHHHHHHUUUUUUUUXXVVVVVVVVVVVVVVVVV +HHHHHZZZZZZZZZZZZZZIIIIILLLLLLCCCCCSSSSSSSSSSSSSSSWTTTZZZZZZZHHHHHHQHHQQQQQQQDDDDDDDDDDDXXXXXXXXOOZZZOHHHHHHHHHHUUUUUUUUUUXVVVVVVVVVVVVVVVVV +HHHHHZZZZZHZZZZZZZZZIIVZMLLLLCCCCCCCCCCCSSSSSSSSSSWWTWPZZZZZZHHHHHHQQQQQQQQQQJQQQDDDDDDDXXXXXXXXXZZZZHHHHHHHHHHHUUUUUUUUUUXVVXVVVVVVVVVVNNVP +HHHHHHZZZZHZYZZZZZZZIIZZZLLECCCLCCCCCCCCCGSSSSSSSSSSPPPZZZZZZZHZPHHQQQQQQQQQQQQQDDDDDDDDDXXXXXXXZTZZZZHHHHHHHHHUUUUUUUUXUXXXXXVVVPVVVPPPPPPP +HHHHHHHHHHHZZZZZZZZZZZZZZBLLCCCCSCCCCCCCQQSSSSSSSSSSPZZZZZZZZZZZPDDQQQQQQQQQQQQQQQDDDDDDEEXXXMMZZZZZZZZZHHHHHHHUUUUUUUUXXXXXXXVVVPPPPPPSPPPP +HHHHHHHHHHNDDZZZZZZZZZZZZBBCCCCSSCCCSCCCQQSSSSSSSSSSPZZZZZZZZZZZPPDDDQQQQQQQQQQQUQDDDDDDEDXMMMZZMZZZZZZZHHHHHHUUUUUUUXXXXXXXXXVVPPPPPPPPPPPP +HHHHHHHHHHNDNZZZZZZZZZZZZCCCCSCSSCCSSSQQQQSSSSSSSSSSPPPZZZZZZZZZPPPQQQQQQQQQQQQQQDDDDDDDDDMMMMZZMZZZZZZZZZZHHUUBBUXXXXXXXXXXXVVVPPPPPPPPPPPP +HHHHHHHHHHNNNZZZZZZZZZZZZCMMCSSSSSSSSSSQQSSSSSSSSSSSPPPPOZZZZZZPPPPQQQQQQQQQQQQSSSSSDDDDDMMMMMMZMZZZZZZZZZZHHUUBBAAXXXXXXXXXXVVVPPPPPPPPPPPP +HHHHHHHHHHNNNZZZZZZZZZWZZCCCSSSSSSSSSSSSQSSSSSSSSSSSDPPPOZZZZZPPPPPPQQQQQQQQQQDSSSSSDDDDDDMMCCMMMZZZZZZZZZHHHBBBBABBBXXXXXXXXXVVPPPPPPPPPPPP +HHHHHHHHHHNNNZZZZNZZZZZDCCCCCSSSSSSSSSHHQSSSSSSSSSSSDPPPOZZZZZPPPPPPQQBQQQQQQVDSSSSSDDDHHHHHCCCCMMMZZZZZEEEEBBBBBBBXXXXXXXXXXXVVVVPPPBPVPPPP +HQHHHHHHNNNNNNNNNNZDDDDDCCCCCCSSSHHHHHHHHSSSSSSSSSSSDPPOOOZZXPPPPPPPPPPPQDQQNQKSSSSSDHHHHHHCCCCCCMUUZZUUBBBBBBBBBBBBBXXXXXXXRRVVVVVPPPPPPPPP +QQQHQHNNNNNNNNNNNNNNCCCCCCCCCSSSSSSHHHHHHSSSSSHDDDDDMDPOMOOPPVPPPPPPPPPPDDDQQQQSSSSSDDHHHHHHJJJCCUUUZZUUUBTBBBBBBBBBJJYXXXPPRRVVVVVPPPPPPPPP +QQQQQQNNNNNNNNNNNNNNCCCCCCCCVCSSSSSHHHHHHSSSSSHHDDDMMMPOMMOOPPPPPPPPPPDDDDDDDDDSSSSSYYHHHHHJJJJJUUUUUUUUUBBBBBBBBBBBJBYYYYPPPPPVVVTPPPPPPPPP +QQQQQQNNNQNNNNNNNNNNCCCCCCCCCCCCSHHHHHHHHSSSSSHDDDMMMMMMMMOPPPPPPPPPPPPDDDDDDDDDDDHHHHHHHHHJJJJJUUUUUUUUUBBBBBBBBBBBBBYYYPPPPPPPBPPPPPPPPPPP +QQQQQQQQQQNNNNNNNNOOOCCCCCCCCCCCCHHHHHHHHSSSSSHHMMMMMMMMMMBBPPPPPPPPDDPDDDDDDDDDDDHHHHHHHHHJJJJJJUJUUUUUBBBBBBBBBBBBBBBYYYPPPPPPPDPPPPPPPPPP +QQQQQQQQQOONNNNNNNNOCCCCCCCCCCCCCPPHHHHHHSSSSSHHMMMMMMMMMMBBBPPPPPPPDDDDDDDDDDDDDDHHHHHHHHHJJJJJJJJJUUUBBBBBBBBBBBBBBBBYYYPPPPPPPPPPPPPPPPPP +QQQQQQQQQOONNNNLNNNOCCCCCCCCCCCCCCPHHHHHHSSSSSHHMMMMMMMMMMBBBPOOPPOPDDDDDDDDDDDDDDHHHHHHHHHHJJJJJJJJUUJJJBBBBBBBBBBBBYYYYYYPPPPPPPPPPPPPPPPP +QQQQQQQQQOOONNNLNOOOOCCCCCCCCCCCCCPHHHHPPPHHHHHHHMMMMMMMMMBBBPOOOOODDDDDDDDDDDDDDDDDUHHHHHHJJJJJJJJJJJJJJDBBBBBBBBBYYYYYYYYMPPPSPAAPPPPQQPPU +QQQQQQQQQOOONNNNOOOOCCCCCCCCCCCJCWPPPHPPPPHHHOOMMMMMMMMMMMMOOOOTOOOODDDDDDDDDDNNDDNNHHHHHHHJJJJJJJJZZZZZDBBBBBBIYYBYYYYYYYYYYYYPPAAAPPPQQQPP +QQQQQQQQOOOONNOOOOOORCCCCCCCCCCCCWPPPPPPPPPPHGMMMMMMMMMMMMMMOOTTOOTTDDDDDDDNNNNNNDDNHHHHHHHHJJJJJJZZZZZZDLTBBBBIYYYYYYYYYYYYYLYUPAAAPPQQQQQQ +QQQQQQQQQOOOOOOOOOORRWWCCCCCCCWWWWWPPPPPPGGGGGFGMMMMMMMMXMZZTTTTTTTTTDDDDDDNNNNNNNNNNHHHHHJJZZZJZZZZZZZZDLLBBBBIIIYYIKYYYYYYYLPPPPPPNPQQQQQQ +QQQQQQQQOOOOOOOORROORWWWWWWWWWWWWWWPPPPPPGGGGGGGMMMMMMMMMMTTTTTTTTTTTDDDDDNNNNNNNNNHHHHHZHHJZZZZZZZZZZZZDLLLALBBIIYIIIYYYYYYYPPPPPPPPPQQQQQQ +QQQQQNQQQQOOOORRRRRRRRWWWWWWWWWWWWWPPPPPGGGGGGGGGMMMMMMMMTTTTTTTTTTTTTDDDDNNNNNNNNNNNNNHHHJJZZZZZZZZZZZZDLLLLLBBIIYIYYYYYYRYYYPPPPPPPQQQQQQQ +QQQQQQAAOOOOOOOORZZRRRRWWWWWWWWWWWWWPPPPGGGGGGGGGMMMMMMMMTTTTTTTTTTTTDDDNNNNNNNNNNNNNNNEEHJJZZZZZZZZZDDDDLLLLLLIIIIIYYYYYYRPPPPPPPPPPPQQQQQQ +QQQQQQAAAAOOOOOORRZZRRRWWWWWWWWWWWWWPPPPGGGGGGGGMMMMTTMMNTTTTTTTTTTTTTDNCNNNNNNNNNNNNNNEEPJJZZZZZZZZZDDDLLLZLIIIIITITTYYNNPPPPPPPPPPAQQQQQQQ +QQQQQQAAAAAAOOZZZZZZRRRWWWWWWWWWWWWPPPGGGGGHHHHGGGMITTTTTTTTTTTTTTTTNNNNCCNNNNNNNENNENEEJJJJZZZZZZZZZDDDLLLLLIIIIITTTTTTNNPPPPPPPPPPAQQQQQQQ +AAQQAAAAAAAAAOZZZZZZRRRRWWWWWWWWWPPPPPGGGGGHHHHGIVVIPTITTTTTTTTTTTTTENONCCNNNNNNEEEEEEEEEEYTZZZZZZZZZDDDDDDRLIIIITLTTTTTTNPPPPPPPPPPAAAQQQQQ +AAAQAAAAAAAAZZZZZZZZZZYWWWWWWWWWWWPPPPPGGGHHHHHGIVVIIQITTTTTTTTTTTTYNNNNNNNNNNNNEEEEEEEEEEETZZZZZZZZZFFFZDDRRIIIITTTTTTYYPPPTPPPPPPPAAAAAAAA +AAAAAAAAAAAXXXZZZZZZZZYWWWWWWWWWLLPPPPPGGGHHHHHIIVVIIIIITTTTTTTTTTTYYNNNYNNNNNNHYEEEEEEEEEZZZZZZZZZZZFFFZZZRRRRRITTTTTTTTTTTTTPPPPPAAAAAAAAA +AAAAAAAAAAAZZZZZZZZZZZYYWWYWWWWLLLPPPPRRGGHHHHHIIIVIIIIITTTTTTTWTTTYYNONNNNNNNNHYEEEEEEEEEZZZZZZZZFFFFFFZZRRRRRRTTTTTTTTTTTTTTTPPPPYAAAAAAAA +AAAAAAAAAAAYYZZZZZZZWWYYYYYYWWWWPPPPPPPRRRHHHHHIIIIIIIILLTLTTTTWTTYYYYNNYYNHNNNHHEEEEEEEEEEZZZFZZZFFFFFFZZRUURRRTTTTTTTTTTTTTTTPPPPPAAAAAAAA +AAAAAAAAAYYYYZBBWWWZWWYYYYYYYWWWHPPPPPHHHHHHHHHIIIIIIIILLLLLTTWWWTTYYYYYYHHHHHHHHHHHEEEEEEEZZZFZZZFFFFFFZZUUUUPRTTTTTTTTTRRTTTTPPPAAAAAAAAAA +AAAAAAAAYYYYHHBBWWWWWWYYYYYYYWWWHPPPPPHHHHHHHHHIIIIIIIIILLLLWWWWWWWYYYYYYHHHHHHHHHHHBEEEEEEEEZFZZZFFFFFFZZUUUUPRTTTTTTTTTRRRTTTTTAFAAAAAAAAA +AAAAAAAYYYYHHHHWWWWWWWWYYYYYYHCHHPPPPPHHHHHHHHHIIIIIIIILLLLWWWWWWWWYYYYYHHHHHHHHHHHHBEEEEEEZZZFFFFFFFFFFFZUUUUUSEMMMTTTRRRRRTTTAAAAAAAAAAAAA +AAAAAAYYYYYHHHHHWWWWWWTYYHHHHHHHHHPPPPHHHHHHHHHISSIIIIILLLLLWWWWWWHKKYYHHHHHHHHHHHHHXXXXXEXXZZFFFFFFFFFFFZUUUUUEEEEMERRRRRRRTTTAAAAAAAAAAAAA +AIIIIAYYHHHHHHHWWWWWWYYYYHTHHHHHHHHPPPHHHHHHHHSSSSSSIILLLLWLWWWBBBBBBBBHHHHHHHHHHHHXXXXXXXXXZXFFFFFFFFFFFUUUUUEEEEEEERRRRRRRTTTTAAAAAAAAAAAA +IIIIIAHYHHHHHHHHWWWWWWYYHHHHHHHHHHHHPPBPRRRRRRSSSSSRRSLLLLWWWWWBBBBBBBBBHHHHHHHHHHHHXXXXXXXXXXXFFFFFFFFFFUUUUUEEEEEEEEVRRRRRRTTTAAAAAAAAAAAB +IIIIIHHHHHHHHHHHWWWWWHFYYHHHHHHHHHHHPPBPPRBRRSSSSSSSSSSLLLWWWWWBBBBBBBBBHHHHHHHHHHTHHXXXXXXXXXFFFFFFFFFFFUUUUUUEEEEEEERRRRRRTTTAAAAAAAAAAAAA +IIIIIIHHHHHHHHHHHWWWWHFHHHHHHHHHHHHHHBBBPPBRVSSSSSSSSSLLLLLWWWWBBBBBBBBBHHHHHHHHHHTHXXXXXXXXXXFFFFFFFFFFFUUUUEEEEEEEEEERRRRRTTTCACCAAAAAAAAB +RIIRIHHHHHHHHHHHHHWWWHHHHHHHHHHHHHHHHBBBBBBBSSSSSSSSSSLLLLLWWWWBBBBBBBBBHHHHHHHTTTTTXXXXXXXXXXFFFFFFFFUUUUUUUEEEEEEEEEEEERRRTTTCCCCACCACCCAB +RIRRIHHHHHHHHHHHWWWWWWYYHHHHHHHHHHBHHBBBBBBBSSSSSSSSGGLLLLWWWWWWWWBBBBBMMMMJHHHRRRTTTXXXXXXXXXFFFFFFFFUUUUUUUUEEEEEEEEEEERRRTTTCCCCCCCACCCAA +RRRRHHHHHHHHHHHHWWWWWYYYYHHHHHHHHBBHBBBBBQQQSSSSSSSSSGGWWWWWWWWWWWBMMMMMMMMZZZZZRRTTTXXXXXXXXFFFFFFFFUUUUUUUUUEEEEEEEEEEERRRRTTTTTTTCCCCYYAE +RRRRRHHHHHHHHHHWWWWWWYYYYYEHLHHLHHBBBBBBBQQQBBBSSSSSSHHSWWWWWWWZWWBMMMMMMMMMMZZZRRTTTTWTXXXFFFFFFFFUUUUUUUUUUUEEEEEEEUUEERRRXTTTTTTTCCCCYYYE +KRRRRHHHHHHHHHHWWWWWYYYYVYYZLLLLBBBBBBBBBQQQBBBSSSSSSHHHHEWWWWWWWWBMMMMMMMMMMZZZXXXTXWWWVXXXFIFFFFFUFUUUUUUUUUUUUUECEUUUUAAATTTTTTTTCCCCYYYE +KRRVVHHHHHHHHHHWWWWWWYYYLLLLLLLLBBBBBBBBBQQQBBBSSSSSSHHHHEEWWWBWWWBMMMMMMMMMMXXXXXXXXWWWWXXWWFFFFFFFFUWUUUUUUUUUAUUUUUUUUUAAATTTTTTTTTCYYYYE +KKVVHHHHHHHHHHHHWWWWYYYYLLOLLLLLLLBBBBBBBQQQBBBSSSSSSHHEEEWWWBBWWWWMMMMMMMMMMZXXXXXXXWWWWXXWWWFFFTFFFFWUHHUUUUUUAUUUUUUUUUATTTTTTTTTTCCYYYYE +VKVVFFHHHHHHHWWWWWWWWYYYLLLLLLLLLLNBBBBBBBBBBNWWSWSPHHHHHHHHHWWWWWWMMMMMMMMMMXXXXXXXXHWWWWWWWWWWFTWFFFWUUCCUCUUUUFUUUUUUUAAABBTTTTTTTTCYEEEE +VVVVVVVHHHHWHWWWWWTWTYYNLLLLLLLLLNNBBBBBBBBNNNWWWWWWWHHHHHHHYWMMMMMMMMMMMMMMMXXXXXXXXHHWWWWWWWWWFFWFFWWWCCCCCCUUBBBUUBBBBBBBBBTTTTTTTTTEEEEE +VVVVVVVVVWWWWWWTWTTWTYYNTLLLLLLLLNNNNNNNNNBNNWWWWWWWWWWHHHSSWWMMMMMMMMMMMMMMMXXXXXXXXXXXXXXWWWWWWWWWWWWCCCCCCCUUBBUUUUBBBBBBBBTTTTTTTTEEEEEE +VVVVVVVVWWWWWWWTTTTTTTTTTTTLLLLLLNNNNNNNNNBNWWWWWWWWWWWHSSSSWWMMMMMMMMMMMMMMMZXXXXXXXXXXXXWWWWWWWWWWWWWCCCCCCCCCCBBBBBBBBBBBBBTTTTTTEEEEEEEE +VVVVVVVBWWWWWWWTTTTTTTTTPLLLLLLLLNNNNMMMMMMMMWWWWWWWWWWWSSSSSSMMMMMMMMMMMMMMMZMXXXXXXAXXMWWWWWWWWWWWWWWCCCCCCCCCCBBBBBBBBBBBBBBTTTTTTEEEEEEE +VVVVVVVVWWWWWWTTBTTTTTTTPLLLLLLLLLLLNMMMMMMMMWWWWWWWWWWWSSSSSWMMMMMMMMMMMMMMMNNNXXXXAAAQQQQQWQWWWWWWWWWWCCCCCCCCBBBBBBBBBBBBBBBTTTTTTEEEEEEE +VVVVVVDXWWWWWWWTTTTTTTTTTLLLLLLALLAANMMMMMMMMWWWWWWWWWWSSSSSSSMMMMMMMMZZZGGGGNNNNNNNAAAQQQQQQQWWWWWWWRRWWRCCCCCCBBBBBBBBBBBBBBBTTTTTEEEEEEEE +VVVVVVVXWWWWWNNTTHTTTTTTTTLLLLLAAAAANNIIMMMMMXWWWWWWSSWSSSSSSSMMMMMMMMZZZGGGGGGGNNNNNAAQQQQQQQWTWWXRRRRRRRRCCCCCCCCCBBBBBBBBBBBTTYTTEEEEEEEE +TVVVVVXXWWWWWNNNHHHTTTTTTTTLLLLAAAAAMMMMMMMMMWWBBWIWSSSSSBMMMMMMMMMMMMBZZGGGGGGGNNNAAAAQQQQQQQTTWWRRRRRRRRRCCCCCCCCCBBBBBBBBBBBBTTTEEEEEEEEE +TVWVVVXXXXXONNNHHHNNTTTTTTTLLLLAAAAAMMMMMMMMMWWBBWWXSXSSSSMMMMMMMMMMMMBBBGGGGGGGNNNNAAAQQQQQTTTTTTTRRRRRRRRCCCCCCCCBBBBBBBBBBBBBGTSSEEEEEEEE +TTVVIIXXXXOOOONNHNNNTTTTXATLAAAAAMMMMMMMMMMMMBBBXYXXSXSXSSMMMMMMMBBBWBBBBGGGGGGGNNNNNAAQQQQTTTTTTBBBTRRRRRRRCCCCCCCRBBBBBBBCBBBGGSSSSEEEEEEE +TTTLLXXXLXLLOONGNNNNNTNNAAAAAAAAAMMMMMMMMMMMMBBBXXXXSXXXSSMMMMMMMBBBBBBKBGGGGGGGGGGGNAAAAAQTTTTTTTTTTRRRRRRRRRCCCCRRSBBBBBBSSBBSSSSSEEEEEEEE +TTLLLLLLLXLLLONNNNNNTNNNNAAAAAAAAMMMMMMMMMMMMBBXXXXXXXXSSSSBBBBBBBBBBRRRNGGGGGGGGGGGAAAAAAATTTTTTTTTTTRRRRRRRRRRCRRBBBBBBSSSSSSSSSSEEEEEEEEE +TTLLLLLLLLLLNNNNNNNNNNNNNNNNAAAAAMMMMMMMMMMMMBBBBXXXXXXXXXSSBBBBBBBBBBRRRNGGGGGGGGGGNAAAAAAATTTTTTTRRRRRRRRRRRMMYYRBYYEBBBSSSSSSSSSSEEESSSEE +TLLLLILLLLLLNKNNNNNNNNNNNNNAAAAAAAAJMMMMMMMMMBBBBBXXXXXXXXXSSBBBBBBBBBBRRRGGGGGGGGGGNNNAAAATTTTTTTTTTRRRRRRRRRRRYYYYYYEBSSSSSSSSSSSSSSESSSEE +TLLLLLLLLLLLLLINNNNNNNNNNNNNAAAAAAAJMMMMMMMXBBBBBXXXXXXXXXSSSBBBBBBBBBBBRNGGGGGGGGGGNANAAAATTTTTTTTTTTRRRRRRRRRYYYYYYYSSSSSSSSSSSSSSSSSSSEEE +TLLLLLLLLLLLLLIVNNNONNNNNNNAAAAAAAAAMMMMMMMXFFFBBXXXXXXXXSSSSSBBBBBBBBBBNNNGGGGGGGGGAAAAAATTTTTTTTTTRRRRRRRRRRRYYYYYYSSQSSSSSSSSSSSSSSSSSESS +LLLLLLLLLLLLLLLVVNNONNNNNNNAAAAAAAAYMMMMMMMXFFFBFFXXXXXHHHHSSSSBBBBBBBBBGNNNNNNNANNNAAAAAATTTTTTTTHHRRRRRRRRRRRRYYYYYYSSSSSSSSSSSAAASSSSSSSS +LLLLLLLLLLLLLLXVVNNONNNNNNNHWWAUUAYYYYXXXXXXFFFBFFFFXXXXXHHHSBBBBBBBBBBCNNNNNAANAAAAAAAACCTTTTTTTHHHRRRRRRRRRRRRYYYYYYSSSSSSSSSTSSSSSSSSSSSS +YYLLLLLLLLLLLLHHHHHHHHHHNHHHWAAAZZYYYYYYXXXFFFFFFFFFXXXXXHSSSSBBBWBKKKBBBRNNAAAAAAACAACCCCCCCTTTTHHHRRRRRRKRRRRRRYYYYYSSSSSSSSTTTSSSSSSSSSSS +YLLLLLLLLSSLLLHHHHHHHHHHHHHHHAARZZZYYYYYXFFFFFFFFFFFFXXXHHHSHSSBBWWKKKBBAANAAAAAAAACCCCCCCCCCTHHHHHHHDDDOOKKKRRRRRYYYYSSSSSSSTTTTTSSVSSSSSSS +YYLLSSSLLSSLLLHHHHHHHHHHHHHHHRRRZZZZZYYYXMXXFFFFFFFFFHHHHHHHHSSSSLLKKKBBANNAAAAAAACCCCCCCCCCCTCCHHHHHDDDDKKKKRKKCYYYYSSSSSSSSTTTTTTSVVVVSSSS +YYYLSSSLLSVLLLHHHHHHHHHHHHHHHRRRCCCCCCCCGMMXXFFFFFFFFHHHHHHHHSSLSLLKKKBBAAAAAAAAAACCCCCCCCCCCCCCCHHHHDDDDKKKKKKKKTTYYYYSSSSSTTTTTSSBBBVSSSMS +YYYYSYSSSSVVVVHHHHHHHHHHHHHHHHRRCCCCCCCKMMPMXFFFFOOFFBBHHHHHHSSLLLLKKKAAAAAAAACCCACCCCCCCCCCCCCCCHHHHHDDDDKKKKKKKKTYYYYSSTSTTTTSSSBBBBVSSBBD +YYYYYYSSSSVVVVHHHHHHHHHHHHHHRRRRCCCCCCMMMMMMMMFFFFOFFBBBBHHHHHSSLPPKKKAAVAACCCCCCCCCCCCCCCCCCCCCCCHHDDDDDKKKKKKKKKTTTYYSSTSTTSTSSSBBBBSSBBBD +YYYYYSSSSSVVVVHHHHHHHHHHHHHHRRRRRRCCCCCMMMMMMMFVVVKBBBBBBDDDDDDPLPPLLLAAAAAACCCCCCCCCCCCCCCCCCCCCCCHDDDDKKKKKKKKKTTTYYYTTTTTSSSSSSTBBBBBBBBB +YYYYYYYSSSVVVVHHHHHHHHHHHHHHRRRRCCCCCCCCCMMMMMMMKKKKKKKKDDDDDDBPPPPPPPPPAAAACCCCCCCCCCCCCCCCCCCCCCCHDDDDDKKKCKKKKTTTTTTTTTTTSSSSSDSSBBBBBBBB +YYYYYYSSSSSVVOHHHHHHHHHHHHHHMRRRRCCCCCCCCMMMMMMMKKKKKKKKDRRKDBBPPPPPPPPPAAAAACCCCCCCCCCCICCCCCCCCCCHDDDDDKCCCKKKKKTTTTTTTTTTSSSSSSSSBBBBBBBB +BYYYSSSSSNSSSOOVVHHHHHHHHHHHRRRRCCCCCCCCCMMMMMMMKKKKKKKKRRRRDDPPPPPPPPPPAAAAAACCCCCCCCCIIICCCCCCCCCDDDDSSSCCCKKKKTTTTTTTTTTTSSSSSSSSSBBBBBBB +BBBBSSSSSNNNNOOVVHHHHHHTMMMMRRMMMMCCCCCCCCMMMMMMKKYKKKKKRRRRDPPPPPPPPPPPPAAARACCCCCCCCIIIICCCCCCCCCCXXDSSSSCCCKTKTTTTTTTTTTUSSSSSSSSBBFBBBBB +BBBBBBBSOOOOOOOVVHHHHHHTMMMMMMCMMACMMCCCCCCMMKMMKKKKKKKKRRRRRPPPPPPPPPPPPPAAAAABBCCCCCIIIIICCCCCCCXXXXOSSSSSTTTTKTTTTTTTTTTSSSSSSSSSSFFBBBBB +BBBBBBBBBOWOOOOOOOHHTTTTMMMMMMMMMMMMMCCCCCCMMKKKKKKKKKKKRRRRRQPPPPPPQQPPPEAAAABBBBCCCIIIIIIICICCCCXXSSSSSSSSTTTTTTTTTTTTTTQSQSSSSSSSSFBBBBBB +BBBBBBBBBBOOOOOOOOTTTTTTMMMMMMMMMMMMWCMCCCCCCKKKKKKKKKKKRRRRRQQQQQQQQQQPPPAAPCBBBBBMCZZZZZZZZZZXXXXXSSSSSSSSTTTTTTTTTTTTTTQQQSSQFSSSSFBBBBBB +BBBBBBBBBBOOOOOTOTTTTTTTTMMMMMMMMMMMMMMMCCCCCKKKKKKKKKKRRRRRRQQQQQQQQQQPPPPPPBBBBBBMMZZZZZZZZZZIXXXXSSSSSSSSSSSTTTTTTTTTTTQQQQQQFFFSFFFBBBBB +BBBBBBBBBBOOOOOOOTTTTTTTMMMMMMMMMMMMMMMMMCCCCCTKFKKKKKKKKKKRRHQQQQQQQQQPPPPPBBBBBBBMMZZZZZZZZZZXXXXXXSSSSSSSSSSSTTTTTTTTTTQQFQQFFFSSFFFBBBBB +BBBBBBBBBBBOOOOOOTTTTTTTMMMMMMMMMMMMMMZCCCCCCTTKKKKKKKKKKKKKQQQQQQQQQQQPPPPPPGBBDBBMMZZZZZZZZZZXXXXXXXXSSSSSSSSTTTTTTTTTTVVVFFFFFFFFFFKBEBBE +BBBBBBBBBBOOOOOPPPPTTTTMMMMMMMMMMMMMMZZCCCCCCCTTTKKKKKKKKKKQQQQQQQQQQQPPPPPPPPPPDMMMDZZZZZZZZZZXXXXXXXSSSSSSSSSSTOTTTTTTTVVFFFFFFFFFFFFFEEBE +BBBBBBBBIIIUOOPPPPPPTTTTTMMMMMMMMMMMMZTCCCCCCCTTTTTKKKKKKKKQQQQQQQQQQQPPPPPPPPPPDMMDDDYYZZZZZZIXXXXXSSSSSSSSSSSSOOOTTTVVTVVVVVFFFFFFFFFFFEEE +BBBBBBIIIIIIIPPPPPPTTTTTTMMMMMMMMMMMZZTTTTCCCCTTTTKKKKKKKAAQQQQQQQQRQQPPPPPPPPPDDDMDDDDDZZZZZZXXXXXXSSSSSSSSSSSOOOOTTTTVVVVVVFFFFFFFFFFFFEEE +QBBBBQQIIIIIIIIPPPPTTTTTTMMMMMTTTTTTZZTTTTTCTTTTTTTKKKKAAAAQQQQQQQQQQPPPPPPPPPPDDDDDDDDZZZZZZZXXXXXSSSSSSSSSSSOOOOOOTTTVVVVVFFFFFFFFFFFFFEEE +QQQQQQISIIIIIIIIFTTTTTTTTMMMMMTTTTTTTZTTTTTTTTTTTTTTTTKKAAAAAQQQQQQQPPPPPPPVVPVDDDDDDDDZZZZZZZXXXXSSSSSSSSSSSSOOOOOOOVVVVVVVFFFFFFFFFFFFEEEE +QQQQQIIIIIIIIFFFFFTTTTTTTTMMMMMTTTTTTTTTTTTTTIIIITTIIIIAAAAAAQQQQQQQPPPPPVVVVVVVDDDDDDDZZZZZZZXXXXXXXXXSSSSSSOOOOOOOOVVVVVVVVVFFFFFFFFFFFEEE +QQQQQQQQQIIQFFFFFFTGTTTTTTMVTMMTTTTTTTTTTTTIIIIIIIIIIIIAAAAAAQSQQQQPPPPPPVVVVVVVDDDDDDDZZZZZZZXXXXXXXXXXSSSSOOOOOOOOOOVVVVVVVFFNNNNFFFFFFNNE +QQQQQQQQQQQQFFFFFFTTTTTTTTMVTTTTTTTTTTTTTTTTIIIIIIIIIIIIAAAAPPPPQQQQPPPPPPVVVVVVDDDDDDDZZZZZZZXXXXXXXOOOOOSOOOOOOOOOVVVVVVVVVVVNNNNNNNNFNNNN +QQQQQQQQQQQQFFFFFFFFTTTTTTTTTTTTTTTTTTTTTTTTIIIIIIIIIIIAAAAAPPPPPPPPPPPPPPVVVVVDDDDDDDDZZZZZZZXXXXXOOOOOOOSOOOOOOOOOVVVVVVVVVVVVNNNNNNNNNDDD +QQQQQQQQQQQFFFFFFFFFFFTTTTPPPTTTTTTTTTTTTTTIIIIIIIIIIIIIIAAAPPPPPPPPPPPPPPPPVVDDDDDDDDDZZZZZZZXXXXXXXXOOOOOOOOOOOOOQVLLVEVLVVVVVNNNNNNNNDDDD diff --git a/12/testinput b/12/testinput new file mode 100644 index 0000000..0b328f1 --- /dev/null +++ b/12/testinput @@ -0,0 +1,10 @@ +RRRRIICCFF +RRRRIICCCF +VVRRRCCFFF +VVRCCCJFFF +VVVVCJJCFE +VVIVCCJJEE +VVIIICJJEE +MIIIIIJJEE +MIIISIJEEE +MMMISSJEEE \ No newline at end of file