diff --git a/Book_1.ipynb b/Book_1.ipynb index b2146cc..b8e7bfa 100644 --- a/Book_1.ipynb +++ b/Book_1.ipynb @@ -18,12 +18,13 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "id": "1e6ac084-5bf9-43f7-a7a6-8c8e20066159", "metadata": {}, "outputs": [], "source": [ - "import re " + "import re \n", + "import numpy as np" ] }, { @@ -44,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 213, + "execution_count": 2, "id": "98412978-4434-4461-8255-fde982948f26", "metadata": {}, "outputs": [ @@ -54,7 +55,7 @@ "55834" ] }, - "execution_count": 213, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -79,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": 215, + "execution_count": 3, "id": "66632939-dc5e-44ba-b740-868c20cabe8c", "metadata": {}, "outputs": [ @@ -89,7 +90,7 @@ "53221" ] }, - "execution_count": 215, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -201,6 +202,122 @@ " total += max(color_dict['red']) * max(color_dict['green']) * max(color_dict['blue'])\n", "total" ] + }, + { + "cell_type": "markdown", + "id": "95831680-6f23-404b-97e6-0411c59f6bdf", + "metadata": {}, + "source": [ + "## Puzzel 3" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "3f70dc72-b4e4-4f65-87ac-d1222a01c8aa", + "metadata": {}, + "outputs": [], + "source": [ + "data = open('data/puzzle_3.txt', 'r').readlines()" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "id": "91a632d1-6262-4c28-bb17-45352c60c16e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "517021" + ] + }, + "execution_count": 113, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_list = [re.sub('\\n', '', line) for line in data]\n", + "data_list = [re.sub('[^\\d\\.]', 'X', line) for line in data_list]\n", + "total = 0\n", + "for line_number, line in enumerate(data_list):\n", + " matches = re.findall('\\d+', line)\n", + " for number in matches:\n", + " match = re.search(number, line)\n", + " surrounding_string = \"\"\n", + " start, end = match.span()\n", + " if start > 0:\n", + " start -= 1\n", + " if end <= len(line):\n", + " end += 1\n", + " if line_number != 0:\n", + " surrounding_string += data_list[line_number-1][start:end]\n", + " surrounding_string += line[start:end]\n", + " if line_number != len(data_list)-1:\n", + " surrounding_string += data_list[line_number+1][start:end]\n", + " if 'X' in surrounding_string:\n", + " total += int(match.group())\n", + " line = re.sub(match.group(), len(match.group())*'.', line, 1)\n", + " match = re.search('\\d+', line) \n", + "total" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "id": "4b239c25-3a43-459e-9669-aa9834571733", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "81296995" + ] + }, + "execution_count": 138, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_list = [re.sub('\\n', '', line) for line in data]\n", + "asterisks = []\n", + "numbers = []\n", + "for line_number, line in enumerate(data_list):\n", + " match = re.search('(\\*)|(\\d+)', line)\n", + " while match is not None:\n", + " x, y = match.span()\n", + " if match.group() == '*':\n", + " asterisks.append({'x_pos': x, 'line_number': line_number})\n", + " else:\n", + " numbers.append({'x_start':x, 'x_end': y, 'line_number': line_number, 'number': int(match.group())})\n", + " line = re.sub('(\\*)|(\\d+)', len(match.group())*'.', line, 1)\n", + " match = re.search('(\\*)|(\\d+)', line)\n", + " \n", + "for asterisk in asterisks:\n", + " asterisk_numbers = []\n", + " for number in numbers:\n", + " if number['line_number'] == asterisk['line_number']:\n", + " if number['x_end'] == asterisk['x_pos']:\n", + " asterisk_numbers.append(number['number'])\n", + " continue\n", + " if number['x_start']-1 == asterisk['x_pos']:\n", + " asterisk_numbers.append(number['number'])\n", + " continue\n", + " \n", + " if (number['line_number']+1 == asterisk['line_number']) or (number['line_number']-1 == asterisk['line_number']):\n", + " if asterisk['x_pos'] in [num for num in range(number['x_start']-1, number['x_end']+1)]:\n", + " asterisk_numbers.append(number['number'])\n", + "\n", + " asterisk['numbers'] = asterisk_numbers\n", + "total = 0\n", + "for asterisk in asterisks:\n", + " if len(asterisk['numbers']) == 2:\n", + " total+= asterisk['numbers'][0] * asterisk['numbers'][1]\n", + "total" + ] } ], "metadata": { diff --git a/pretty_read.md b/pretty_read.md index 728bda8..48785a0 100644 --- a/pretty_read.md +++ b/pretty_read.md @@ -5,6 +5,7 @@ Laten we beginnen met de imports ```python import re +import numpy as np ``` ## Puzzel 1 @@ -105,3 +106,90 @@ total 66027 + +## Puzzel 3 + + +```python +data = open('data/puzzle_3.txt', 'r').readlines() +``` + + +```python +data_list = [re.sub('\n', '', line) for line in data] +data_list = [re.sub('[^\d\.]', 'X', line) for line in data_list] +total = 0 +for line_number, line in enumerate(data_list): + matches = re.findall('\d+', line) + for number in matches: + match = re.search(number, line) + surrounding_string = "" + start, end = match.span() + if start > 0: + start -= 1 + if end <= len(line): + end += 1 + if line_number != 0: + surrounding_string += data_list[line_number-1][start:end] + surrounding_string += line[start:end] + if line_number != len(data_list)-1: + surrounding_string += data_list[line_number+1][start:end] + if 'X' in surrounding_string: + total += int(match.group()) + line = re.sub(match.group(), len(match.group())*'.', line, 1) + match = re.search('\d+', line) +total +``` + + + + + 517021 + + + + +```python +data_list = [re.sub('\n', '', line) for line in data] +asterisks = [] +numbers = [] +for line_number, line in enumerate(data_list): + match = re.search('(\*)|(\d+)', line) + while match is not None: + x, y = match.span() + if match.group() == '*': + asterisks.append({'x_pos': x, 'line_number': line_number}) + else: + numbers.append({'x_start':x, 'x_end': y, 'line_number': line_number, 'number': int(match.group())}) + line = re.sub('(\*)|(\d+)', len(match.group())*'.', line, 1) + match = re.search('(\*)|(\d+)', line) + +for asterisk in asterisks: + asterisk_numbers = [] + for number in numbers: + if number['line_number'] == asterisk['line_number']: + if number['x_end'] == asterisk['x_pos']: + asterisk_numbers.append(number['number']) + continue + if number['x_start']-1 == asterisk['x_pos']: + asterisk_numbers.append(number['number']) + continue + + if (number['line_number']+1 == asterisk['line_number']) or (number['line_number']-1 == asterisk['line_number']): + if asterisk['x_pos'] in [num for num in range(number['x_start']-1, number['x_end']+1)]: + asterisk_numbers.append(number['number']) + + asterisk['numbers'] = asterisk_numbers +total = 0 +for asterisk in asterisks: + if len(asterisk['numbers']) == 2: + total+= asterisk['numbers'][0] * asterisk['numbers'][1] +total +``` + + + + + 81296995 + +