295 lines
29 KiB
Plaintext
295 lines
29 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"id": "xgruaa0X9m1U",
|
|
"outputId": "374ce0d2-a69a-4e08-d15e-3c85b2710ad9"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"output_type": "execute_result",
|
|
"data": {
|
|
"text/plain": [
|
|
"344"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"execution_count": 2
|
|
}
|
|
],
|
|
"source": [
|
|
"# Load the larger test file and process it using the solution\n",
|
|
"file_path = 'input'\n",
|
|
"\n",
|
|
"def process_large_file(file_path):\n",
|
|
" with open(file_path, 'r') as file:\n",
|
|
" lines = [line.rstrip('\\n') for line in file.readlines()]\n",
|
|
"\n",
|
|
" height = len(lines)\n",
|
|
" width = len(lines[0]) if height > 0 else 0\n",
|
|
"\n",
|
|
" # Identify antennas and their frequencies\n",
|
|
" freq_map = {}\n",
|
|
" for y in range(height):\n",
|
|
" for x in range(width):\n",
|
|
" c = lines[y][x]\n",
|
|
" if c != '.':\n",
|
|
" if c not in freq_map:\n",
|
|
" freq_map[c] = []\n",
|
|
" freq_map[c].append((x, y))\n",
|
|
"\n",
|
|
" # A set to hold all unique antinode locations\n",
|
|
" antinodes = set()\n",
|
|
"\n",
|
|
" # Candidate λ values based on derived equations\n",
|
|
" lambdas = [2, -1, 1/3, 2/3]\n",
|
|
"\n",
|
|
" for freq, antennas in freq_map.items():\n",
|
|
" n = len(antennas)\n",
|
|
" if n < 2:\n",
|
|
" continue\n",
|
|
"\n",
|
|
" for i in range(n):\n",
|
|
" for j in range(i+1, n):\n",
|
|
" x1, y1 = antennas[i]\n",
|
|
" x2, y2 = antennas[j]\n",
|
|
" dx = x2 - x1\n",
|
|
" dy = y2 - y1\n",
|
|
"\n",
|
|
" for lam in lambdas:\n",
|
|
" px = x1 + lam * dx\n",
|
|
" py = y1 + lam * dy\n",
|
|
"\n",
|
|
" if abs(px - round(px)) < 1e-12 and abs(py - round(py)) < 1e-12:\n",
|
|
" rx = round(px)\n",
|
|
" ry = round(py)\n",
|
|
"\n",
|
|
" if 0 <= rx < width and 0 <= ry < height:\n",
|
|
" antinodes.add((rx, ry))\n",
|
|
"\n",
|
|
" # Output the number of unique antinode locations\n",
|
|
" return len(antinodes)\n",
|
|
"\n",
|
|
"process_large_file('input')\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"id": "RvPJM8km9m1W",
|
|
"outputId": "77731738-0776-46da-e8e5-4faf9e334515"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"output_type": "execute_result",
|
|
"data": {
|
|
"text/plain": [
|
|
"1182"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"execution_count": 3
|
|
}
|
|
],
|
|
"source": [
|
|
"def process_part_two(file_path):\n",
|
|
" with open(file_path, 'r') as file:\n",
|
|
" lines = [line.rstrip('\\n') for line in file.readlines()]\n",
|
|
"\n",
|
|
" height = len(lines)\n",
|
|
" width = len(lines[0]) if height > 0 else 0\n",
|
|
"\n",
|
|
" # Identify antennas and their frequencies\n",
|
|
" freq_map = {}\n",
|
|
" for y in range(height):\n",
|
|
" for x in range(width):\n",
|
|
" c = lines[y][x]\n",
|
|
" if c != '.':\n",
|
|
" if c not in freq_map:\n",
|
|
" freq_map[c] = []\n",
|
|
" freq_map[c].append((x, y))\n",
|
|
"\n",
|
|
" # A set to hold all unique antinode locations\n",
|
|
" antinodes = set()\n",
|
|
"\n",
|
|
" # For each frequency group, consider all pairs of antennas\n",
|
|
" for freq, antennas in freq_map.items():\n",
|
|
" n = len(antennas)\n",
|
|
" if n < 2:\n",
|
|
" continue\n",
|
|
"\n",
|
|
" for i in range(n):\n",
|
|
" for j in range(i + 1, n):\n",
|
|
" x1, y1 = antennas[i]\n",
|
|
" x2, y2 = antennas[j]\n",
|
|
"\n",
|
|
" # Calculate the collinearity condition\n",
|
|
" for x in range(width):\n",
|
|
" for y in range(height):\n",
|
|
" if (x2 - x1) * (y - y1) == (y2 - y1) * (x - x1):\n",
|
|
" antinodes.add((x, y))\n",
|
|
"\n",
|
|
" # Include the positions of all antennas as antinodes\n",
|
|
" for freq, antennas in freq_map.items():\n",
|
|
" for x, y in antennas:\n",
|
|
" antinodes.add((x, y))\n",
|
|
"\n",
|
|
" # Return the number of unique antinode locations\n",
|
|
" return len(antinodes)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Process the larger test file for part two\n",
|
|
"process_part_two('input')\n"
|
|
]
|
|
},
|
|
{
|
|
"source": [
|
|
"# prompt: visualize the map\n",
|
|
"\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"# Load the larger test file and process it using the solution\n",
|
|
"file_path = 'input'\n",
|
|
"\n",
|
|
"def process_large_file(file_path):\n",
|
|
" with open(file_path, 'r') as file:\n",
|
|
" lines = [line.rstrip('\\n') for line in file.readlines()]\n",
|
|
"\n",
|
|
" height = len(lines)\n",
|
|
" width = len(lines[0]) if height > 0 else 0\n",
|
|
"\n",
|
|
" # Identify antennas and their frequencies\n",
|
|
" freq_map = {}\n",
|
|
" for y in range(height):\n",
|
|
" for x in range(width):\n",
|
|
" c = lines[y][x]\n",
|
|
" if c != '.':\n",
|
|
" if c not in freq_map:\n",
|
|
" freq_map[c] = []\n",
|
|
" freq_map[c].append((x, y))\n",
|
|
"\n",
|
|
" # A set to hold all unique antinode locations\n",
|
|
" antinodes = set()\n",
|
|
"\n",
|
|
" # Candidate λ values based on derived equations\n",
|
|
" lambdas = [2, -1, 1/3, 2/3]\n",
|
|
"\n",
|
|
" for freq, antennas in freq_map.items():\n",
|
|
" n = len(antennas)\n",
|
|
" if n < 2:\n",
|
|
" continue\n",
|
|
"\n",
|
|
" for i in range(n):\n",
|
|
" for j in range(i+1, n):\n",
|
|
" x1, y1 = antennas[i]\n",
|
|
" x2, y2 = antennas[j]\n",
|
|
" dx = x2 - x1\n",
|
|
" dy = y2 - y1\n",
|
|
"\n",
|
|
" for lam in lambdas:\n",
|
|
" px = x1 + lam * dx\n",
|
|
" py = y1 + lam * dy\n",
|
|
"\n",
|
|
" if abs(px - round(px)) < 1e-12 and abs(py - round(py)) < 1e-12:\n",
|
|
" rx = round(px)\n",
|
|
" ry = round(py)\n",
|
|
"\n",
|
|
" if 0 <= rx < width and 0 <= ry < height:\n",
|
|
" antinodes.add((rx, ry))\n",
|
|
" # The line below was previously commented out and caused the error\n",
|
|
" # because the variable 'antinodes' was not defined.\n",
|
|
" # It has been uncommented and restored to its original functionality.\n",
|
|
" return antinodes, width, height, lines # Return antinodes and dimensions\n",
|
|
"\n",
|
|
"\n",
|
|
"def visualize_map(antinodes, width, height, lines):\n",
|
|
" # Create a 2D array to represent the map\n",
|
|
" map_array = [['.' for _ in range(width)] for _ in range(height)]\n",
|
|
"\n",
|
|
" # Place antennas on the map\n",
|
|
" for y in range(height):\n",
|
|
" for x in range(width):\n",
|
|
" map_array[y][x] = lines[y][x]\n",
|
|
"\n",
|
|
" # Mark antinodes on the map\n",
|
|
" for x, y in antinodes:\n",
|
|
" map_array[y][x] = '#'\n",
|
|
"\n",
|
|
" # Display the map using matplotlib\n",
|
|
" plt.figure(figsize=(10, 10)) # Adjust figure size as needed\n",
|
|
" plt.imshow([[ord(c) for c in row] for row in map_array], cmap='viridis')\n",
|
|
" plt.colorbar()\n",
|
|
" plt.show()\n",
|
|
"\n",
|
|
"\n",
|
|
"# Call the function and get the results\n",
|
|
"antinodes, width, height, lines = process_large_file('testinput')\n",
|
|
"visualize_map(antinodes, width, height, lines)"
|
|
],
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 821
|
|
},
|
|
"id": "TbsEuRwx-giw",
|
|
"outputId": "2b2f61ab-c2b5-40e5-bddc-2c191f6529aa"
|
|
},
|
|
"execution_count": null,
|
|
"outputs": [
|
|
{
|
|
"output_type": "display_data",
|
|
"data": {
|
|
"text/plain": [
|
|
"<Figure size 1000x1000 with 2 Axes>"
|
|
],
|
|
"image/png": "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2jEm1B6dAQAAKJQwAAAAhTImBABA7bRajbQqNpZTtXoSnQEAACiWMAAAAIUyJgQAQO0000gz1RrLqVo9ic4AAAAUSxgAAIBCGRMCAKB23HSsPToDAABQKGEAAAAKZUwIAIDacdOx9ugMAABAoYQBAAAolDEhAABqx25C7dEZAACAQgkDAABQKGEAAIDaeWc3oaqtdl1++eVpNBoD1kEHHdT//AknnLDF81/84he3+evkmgEAAKigQw89NA8++GD/4512Gvij+7nnnpsrr7yy//Guu+66zecQBgAAoIJ22mmnjBkz5j2f33XXXX/j8+0wJgQAQO203t5NqErrnTGh3t7eAWvTpk1b/Wd44YUXMm7cuHz0ox/NjBkz8vLLLw94/q677sree++diRMnZu7cuXnjjTe2+eukMwAAADtQT0/PgMfz5s3L5ZdfPuDY5MmTc+edd+bjH/94Xn311VxxxRX53d/93Tz33HMZMWJEPvvZz2b8+PEZN25cnnnmmVx00UVZsWJFfvCDH2xTLcIAAADsQKtWrUp3d3f/466uri1ec9JJJ/X/edKkSZk8eXLGjx+f733ve/nCF76Q8847r//5ww47LGPHjs2JJ56YF198MQcccEDbtQgDAADUTitJq9XpKgZ6p5zu7u4BYaAde+yxRz72sY9l5cqVW31+8uTJSZKVK1duUxhwzQAAAFTc+vXr8+KLL2bs2LFbfX758uVJ8p7PvxedAQAAqJivfvWrOfXUUzN+/Pi88sormTdvXoYOHZrPfOYzefHFF7No0aJ8+tOfzqhRo/LMM89k9uzZOf744zNp0qRtOo8wAABA7TTTSCPt3+RrR2huQz0///nP85nPfCa/+tWvss8+++S4447L0qVLs88++2Tjxo158MEHs2DBgmzYsCE9PT0544wzcskll2xzTcIAAABUzN133/2ez/X09GTJkiWDch7XDAAAQKF0BgAAqJ3Wv7vJV1VUrZ5EZwAAAIolDAAAQKGMCQEAUDvNViONio3lNCtWT6IzAAAAxRIGAACgUMaEAAConVZr86qSqtWT6AwAAECxhAEAACiUMSEAAGrHTcfaozMAAACFEgYAAKBQxoQAAKgdY0Lt0RkAAIBCCQMAAFAoY0IAANROs9VIo2JjOc2K1ZPoDAAAQLF0Btgmay44ttMl8Bts2qPTFQyurtc6XQHvxWdTbaNvfLTTJQwa/92B7UsYAACgdlqtzatKqlZPYkwIAACKJQwAAEChjAkBAFA7m8eEqrV7jzEhAACgMoQBAAAolDEhAABqp9VqVHBMqFr1JDoDAABQLGEAAAAKZUwIAIDaab29qqRq9SQ6AwAAUCxhAAAACmVMCACA2rGbUHt0BgAAoFDCAAAAFMqYEAAA9WM7obboDAAAQKGEAQAAKJQxIQAA6qeCuwmlavVEZwAAAIolDAAAQKG2exi49tpr02g0MmvWrO19KgAASJK0WtVcVbNdw8CyZcty6623ZtKkSdvzNAAAwPuw3cLA+vXrM2PGjNx+++3Zc889t9dpAACA92m7hYGZM2fm5JNPzrRp037j6zZt2pTe3t4BCwAAPojW27sJVW1VzXbZWvTuu+/O008/nWXLlv2Hr50/f36uuOKK7VEGAADwGwx6Z2DVqlW58MILc9ddd2XYsGH/4evnzp2bdevW9a9Vq1YNdkkAAMBWDHpn4KmnnsratWtz5JFH9h/r6+vLww8/nJtuuimbNm3K0KFD+5/r6upKV1fXYJcBAEDJWo3q3eSravVkO4SBE088Mc8+++yAY+ecc04OOuigXHTRRQOCAAAA0DmDHgZGjBiRiRMnDji22267ZdSoUVscBwAAOme7XEAMAACdVMWbfFWtnmQHhYGHHnpoR5wGAADYBtv1DsQAAEB1GRMCAKB+Wm+vKqlaPdEZAACAYgkDAABQKGNCAADUTqvVSKtiN/mqWj2JzgAAABRLGAAAgEIZEwIAoJ4quHtP1egMAABAoYQBAAAolDEhAABqx25C7dEZAACAQgkDAABQKGNCAADUTyvV202oavVEZwAAAIolDAAAQKGMCQEAUEONt1eVVK0enQEAACiWMAAAAIUyJrQDjL7x0U6XMGjWXHBsp0vgN+h6rdMV8F7q9H0g8b2g6nw+ELsJtUlnAAAACiUMAABAoYwJAQBQP8aE2qIzAAAAhRIGAACgUMaEAACon1Zj86qSqtUTnQEAACiWMAAAAIUyJgQAQO20WptXlVStnkRnAAAAiiUMAABAoYwJAQBQP2461hadAQAAKJQwAAAAhTImBABA/bjpWFt0BgAAoFDCAAAAFMqYEAAAtdNobV5VUrV6Ep0BAAAoljAAAACFMiYEAED9uOlYW3QGAACgUMIAAAAUypgQAAD146ZjbdEZAACAQgkDAABQKGNCAADUj92E2qIzAAAAhRIGAACgUMaEAACoH2NCbdEZAACAQgkDAABQKGNCAADUjzGhtugMAABAoYQBAAAolDEhAADqp9XYvKqkavVEZwAAAIolDAAAQKGMCQEAUDuN1uZVJVWrJ9EZAACAYgkDAABQKGNCAADUj5uOtUVnAAAACiUMAABAoYQBAAAolDAAAACFEgYAAKBiLr/88jQajQHroIMO6n9+48aNmTlzZkaNGpXdd989Z5xxRtasWbPN5xEGAAConUb+343HKrO28Z/h0EMPzauvvtq/Hnnkkf7nZs+enb/927/N3/zN32TJkiV55ZVX8od/+Ifb/HWytSgAAFTQTjvtlDFjxmxxfN26dfn2t7+dRYsW5fd+7/eSJHfccUcOPvjgLF26NL/zO7/T9jl0BgAAoIJeeOGFjBs3Lh/96EczY8aMvPzyy0mSp556Km+99VamTZvW/9qDDjoo+++/fx577LFtOofOwA6w5oJjO10C72H0jY92uoRB5d+16vLZAPCO3t7eAY+7urrS1dU14NjkyZNz55135uMf/3heffXVXHHFFfnd3/3dPPfcc1m9enV22WWX7LHHHgP+zujRo7N69eptqkUYAACgflqNzatK3q6np6dnwOF58+bl8ssvH3DspJNO6v/zpEmTMnny5IwfPz7f+973Mnz48EErSRgAAIAdaNWqVenu7u5//O6uwNbsscce+djHPpaVK1fm93//9/Pmm2/mtddeG9AdWLNmzVavMfhNXDMAAAA7UHd394DVThhYv359XnzxxYwdOzZHHXVUdt555yxevLj/+RUrVuTll1/OlClTtqkWnQEAAOqn9faqkm2o56tf/WpOPfXUjB8/Pq+88krmzZuXoUOH5jOf+UxGjhyZL3zhC5kzZ0722muvdHd35ytf+UqmTJmyTTsJJcIAAABUzs9//vN85jOfya9+9avss88+Oe6447J06dLss88+SZK/+Iu/yJAhQ3LGGWdk06ZNmT59er71rW9t83mEAQAAqJi77777Nz4/bNiw3Hzzzbn55ps/0HmEAQAA6udDPia0o7iAGAAACiUMAABAoYwJAQBQO43W5lUlVasn0RkAAIBiCQMAAFAoY0IAANSP3YTaojMAAACFEgYAAKBQxoQAAKgfY0Jt0RkAAIBCCQMAAFAoY0IAANSOm461R2cAAAAKJQwAAEChtksY+MUvfpHPfe5zGTVqVIYPH57DDjssTz755PY4FQAAbKnVqOaqmEG/ZuDXv/51pk6dmk9+8pO59957s88+++SFF17InnvuOdinAgAAPoBBDwPXXXddenp6cscdd/QfmzBhwmCfBgAA+IAGfUzoxz/+cY4++uiceeaZ2XfffXPEEUfk9ttvf8/Xb9q0Kb29vQMWAAB8IK2KrooZ9DDws5/9LLfccksOPPDA3H///fnSl76UCy64IN/5zne2+vr58+dn5MiR/aunp2ewSwIAALZi0MNAs9nMkUcemWuuuSZHHHFEzjvvvJx77rlZuHDhVl8/d+7crFu3rn+tWrVqsEsCAAC2YtCvGRg7dmwOOeSQAccOPvjgfP/739/q67u6utLV1TXYZQAAUDA3HWvPoHcGpk6dmhUrVgw49vzzz2f8+PGDfSoAAOADGPQwMHv27CxdujTXXHNNVq5cmUWLFuW2227LzJkzB/tUAADABzDoYeCYY47JPffck7/+67/OxIkT841vfCMLFizIjBkzBvtUAACwdZ3eNehDspvQoF8zkCSnnHJKTjnllO3x1gAAwCAZ9M4AAADw4bBdOgMAANBRFdxNqIpjQjoDAABQKGEAAAAKZUwIAID6qeLuPVWrJzoDAABQLGEAAAAKZUwIAID6MSbUFp0BAAAolDAAAACFMiYEAEDtNCp407Gq1ZPoDAAAQLGEAQAAKJQwAAAAhRIGAACgUMIAAAAUym5CAADUj5uOtUVnAAAACiUMAABAoSo7JrTvwsezU2PnTpcxKNZccGynS+A9+Gzg/Rl946OdLmFQ+V4A9eOmY+3RGQAAgEIJAwAAUKjKjgkBAMAHUsGxnKrRGQAAgEIJAwAAUChjQgAA1I+bjrVFZwAAAAolDAAAQKGMCQEAUDtuOtYenQEAACiUMAAAAIUyJgQAQP3YTagtOgMAAFAoYQAAAAplTAgAgNqxm1B7dAYAAKBQwgAAABTKmBAAAPVjN6G26AwAAEChhAEAACiUMSEAAOrHmFBbdAYAAKBQwgAAABTKmBAAALXjpmPt0RkAAIBCCQMAAFAoY0IAANSP3YTaojMAAACFEgYAAKBQxoQAAKgfY0Jt0RkAAIBCCQMAAFAoY0IAANSOm461R2cAAAAKJQwAAEChjAkBAFA/dhNqi84AAAAUShgAAIBCGRMCAKB27CbUHp0BAAAolDAAAACFMiYEAED92E2oLToDAABQKGEAAAAKZUwIAID6MSbUFp0BAAAolDAAAACFMiYEAEDtNN5eVVK1ehKdAQAAKJYwAAAAhTImBABA/dhNqC2VDQNrvzg5Q7uGdboMALZizQXHdrqEQbX84m91uoRBdfi1X+50CcCHhDEhAAAoVGU7AwAA8H41WptXlVStnkRnAAAAiiUMAABAoYwJAQBQP3YTaovOAAAAFEoYAACAQhkTAgCgnio4llM1OgMAAFAoYQAAAAplTAgAgNpx07H26AwAAEChhAEAACiUMSEAAOrHTcfaojMAAACFEgYAAKBQxoQAAKgduwm1R2cAAAAKJQwAAEChhAEAAOqnVdH1Pl177bVpNBqZNWtW/7ETTjghjUZjwPriF7+4Te876GGgr68vl156aSZMmJDhw4fngAMOyDe+8Y20WhUckgIAgIpbtmxZbr311kyaNGmL584999y8+uqr/ev666/fpvce9AuIr7vuutxyyy35zne+k0MPPTRPPvlkzjnnnIwcOTIXXHDBYJ8OAABqa/369ZkxY0Zuv/32XHXVVVs8v+uuu2bMmDHv+/0HvTPw6KOP5rTTTsvJJ5+cj3zkI/kv/+W/5FOf+lSeeOKJwT4VAABs1Tu7CVVtbauZM2fm5JNPzrRp07b6/F133ZW99947EydOzNy5c/PGG29s0/sPemfg2GOPzW233Zbnn38+H/vYx/JP//RPeeSRR3LDDTcM9qkAAOBDp7e3d8Djrq6udHV1bfG6u+++O08//XSWLVu21ff57Gc/m/Hjx2fcuHF55plnctFFF2XFihX5wQ9+0HYtgx4GLr744vT29uaggw7K0KFD09fXl6uvvjozZszY6us3bdqUTZs29T9+9xcHAADqpKenZ8DjefPm5fLLLx9wbNWqVbnwwgvzwAMPZNiwYVt9n/POO6//z4cddljGjh2bE088MS+++GIOOOCAtmoZ9DDwve99L3fddVcWLVqUQw89NMuXL8+sWbMybty4nH322Vu8fv78+bniiisGuwwAAEr2AXfv2S7ermfVqlXp7u7uP7y1rsBTTz2VtWvX5sgjj+w/1tfXl4cffjg33XRTNm3alKFDhw74O5MnT06SrFy5snNh4Gtf+1ouvvjinHXWWUk2p5R/+Zd/yfz587caBubOnZs5c+b0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Xn/99STJir+8ssOVAACd9tNOFzDYFv6o0xUMqtdffz0jR47sdBl8AJULA+PGjcuqVasyYsSINBqN7Xae3t7e9PT0ZNWqVenu7t5u5+H98flUl8+munw21ebzqS6fzbZrtVp5/fXXM27cuE6XwgdUuTAwZMiQ7LfffjvsfN3d3f6PX2E+n+ry2VSXz6bafD7V5bPZNpXvCDRbqdzuPc2K1RMXEAMAQLGEAQAAKFTlxoR2lK6ursybNy9dXV2dLoWt8PlUl8+munw21ebzqS6fTU21mptXlVStniSNVqX3hAIAgPb19vZm5MiRmbb/l7PTkGoFvH9rbsqDL38r69atq8z1KcaEAACgUMWOCQEAUGNuOtYWnQEAAChUsWHg5ptvzkc+8pEMGzYskydPzhNPPNHpkoo3f/78HHPMMRkxYkT23XffnH766VmxYkWny2Irrr322jQajcyaNavTpfC2X/ziF/nc5z6XUaNGZfjw4TnssMPy5JNPdrqs4vX19eXSSy/NhAkTMnz48BxwwAH5xje+EZfrdcbDDz+cU089NePGjUuj0cgPf/jDAc+3Wq1cdtllGTt2bIYPH55p06blhRde6EyxsIMUGQa++93vZs6cOZk3b16efvrpfOITn8j06dOzdu3aTpdWtCVLlmTmzJlZunRpHnjggbz11lv51Kc+lQ0bNnS6NP6dZcuW5dZbb82kSZM6XQpv+/Wvf52pU6dm5513zr333puf/vSn+fM///PsueeenS6teNddd11uueWW3HTTTfk//+f/5Lrrrsv111+fb37zm50urUgbNmzIJz7xidx8881bff7666/PjTfemIULF+bxxx/PbrvtlunTp2fjxo07uFIGRbNVzVUxRe4mNHny5BxzzDG56aabkiTNZjM9PT35yle+kosvvrjD1fGOX/7yl9l3332zZMmSHH/88Z0uhyTr16/PkUcemW9961u56qqrcvjhh2fBggWdLqt4F198cf73//7f+cd//MdOl8K7nHLKKRk9enS+/e1v9x8744wzMnz48PzP//k/O1gZjUYj99xzT04//fQkm7sC48aNy3//7/89X/3qV5Mk69aty+jRo3PnnXfmrLPO6mC1bIv+3YR+64vV3E3oFwvtJtRJb775Zp566qlMmzat/9iQIUMybdq0PPbYYx2sjHdbt25dkmSvvfbqcCW8Y+bMmTn55JMH/P+Hzvvxj3+co48+OmeeeWb23XffHHHEEbn99ts7XRZJjj322CxevDjPP/98kuSf/umf8sgjj+Skk07qcGW820svvZTVq1cP+P42cuTITJ482c8H1Fpxuwn967/+a/r6+jJ69OgBx0ePHp3/+3//b4eq4t2azWZmzZqVqVOnZuLEiZ0uhyR33313nn766SxbtqzTpfAuP/vZz3LLLbdkzpw5+bM/+7MsW7YsF1xwQXbZZZecffbZnS6vaBdffHF6e3tz0EEHZejQoenr68vVV1+dGTNmdLo03mX16tVJstWfD955jg8Zuwm1pbgwwIfDzJkz89xzz+WRRx7pdCkkWbVqVS688MI88MADGTZsWKfL4V2azWaOPvroXHPNNUmSI444Is8991wWLlwoDHTY9773vdx1111ZtGhRDj300CxfvjyzZs3KuHHjfDZAJRQ3JrT33ntn6NChWbNmzYDja9asyZgxYzpUFf/e+eefn7/7u7/LP/zDP2S//fbrdDkkeeqpp7J27doceeSR2WmnnbLTTjtlyZIlufHGG7PTTjulr6+v0yUWbezYsTnkkEMGHDv44IPz8ssvd6gi3vG1r30tF198cc4666wcdthh+a//9b9m9uzZmT9/fqdL413e+RnAzweUprgwsMsuu+Soo47K4sWL+481m80sXrw4U6ZM6WBltFqtnH/++bnnnnvy93//95kwYUKnS+JtJ554Yp599tksX768fx199NGZMWNGli9fnqFDh3a6xKJNnTp1i214n3/++YwfP75DFfGON954I0OGDPxP7dChQ9NsNjtUEe9lwoQJGTNmzICfD3p7e/P444/7+eDDqpX/NypUmdXpL8qWihwTmjNnTs4+++wcffTR+e3f/u0sWLAgGzZsyDnnnNPp0oo2c+bMLFq0KD/60Y8yYsSI/hnNkSNHZvjw4R2urmwjRozY4tqN3XbbLaNGjXJNRwXMnj07xx57bK655pr80R/9UZ544oncdtttue222zpdWvFOPfXUXH311dl///1z6KGH5ic/+UluuOGGfP7zn+90aUVav359Vq5c2f/4pZdeyvLly7PXXntl//33z6xZs3LVVVflwAMPzIQJE3LppZdm3Lhx/TsOQR0VGQb++I//OL/85S9z2WWXZfXq1Tn88MNz3333bXHREDvWLbfckiQ54YQTBhy/44478id/8ic7viD4kDjmmGNyzz33ZO7cubnyyiszYcKELFiwwEWqFfDNb34zl156ab785S9n7dq1GTduXP70T/80l112WadLK9KTTz6ZT37yk/2P58yZkyQ5++yzc+edd+brX/96NmzYkPPOOy+vvfZajjvuuNx3332ulaLWirzPAAAA9dR/n4Ex52WnIbt0upwB/q35Zh5cfZv7DAAAAJ0nDAAAQKGKvGYAAICaazaTVGznrgruJKYzAAAAhRIGAACgUMaEAACon3du9FUlVasnOgMAAFAsYQAAAAplTAgAgPoxJtQWnQEAACiUMAAAAIUyJgQAQP00W0kqNpbTrFg90RkAAIBiCQMAAFAoY0IAANROq9VMq9XsdBkDVK2eRGcAAACKJQwAAEChjAkBAFA/rVb1du9x0zEAAKAqhAEAACiUMSEAAOqnVcGbjhkTAgAAqkIYAACAQhkTAgCgfprNpFGxm3y56RgAAFAVwgAAABTKmBAAAPVjN6G26AwAAEChhAEAACiUMSEAAGqn1WymVbHdhFp2EwIAAKpCGAAAgEIZEwIAoH7sJtQWnQEAACiUMAAAAIUyJgQAQP00W0mjYmM5xoQAAICqEAYAAKBQxoQAAKifVitJxW7yZUwIAACoCmEAAAAKZUwIAIDaaTVbaVVsN6GWMSEAAKAqhAEAACiUMSEAAOqn1Uz1dhOqWD3RGQAAgGIJAwAAUChjQgAA1I7dhNqjMwAAAIUSBgAAoGJuueWWTJo0Kd3d3enu7s6UKVNy77339j9/wgknpNFoDFhf/OIXt/k8xoQAAKifD/luQvvtt1+uvfbaHHjggWm1WvnOd76T0047LT/5yU9y6KGHJknOPffcXHnllf1/Z9ddd93mkoQBAAComFNPPXXA46uvvjq33HJLli5d2h8Gdt1114wZM+YDnceYEAAAVFhfX1/uvvvubNiwIVOmTOk/ftddd2XvvffOxIkTM3fu3Lzxxhvb/N46AwAA1M6/5a2kYpv3/FveSpL09vYOON7V1ZWurq4tXv/ss89mypQp2bhxY3bffffcc889OeSQQ5Ikn/3sZzN+/PiMGzcuzzzzTC666KKsWLEiP/jBD7appkarinscAQDA+7Bx48ZMmDAhq1ev7nQpW7X77rtn/fr1A47Nmzcvl19++RavffPNN/Pyyy9n3bp1+V//63/lf/yP/5ElS5b0B4J/7+///u9z4oknZuXKlTnggAParkcYAACgVjZu3Jg333yz02VsVavVSqPRGHDsvToD7zZt2rQccMABufXWW7d4bsOGDdl9991z3333Zfr06W3XY0wIAIBaGTZsWIYNG9bpMgZds9nMpk2btvrc8uXLkyRjx47dpvcUBgAAoGLmzp2bk046Kfvvv39ef/31LFq0KA899FDuv//+vPjii1m0aFE+/elPZ9SoUXnmmWcye/bsHH/88Zk0adI2nUcYAACAilm7dm3+23/7b3n11VczcuTITJo0Kffff39+//d/P6tWrcqDDz6YBQsWZMOGDenp6ckZZ5yRSy65ZJvP45oBAAAolPsMAABAoYQBAAAolDAAAACFEgYAAKBQwgAAABRKGAAAgEIJAwAAUChhAAAACiUMAABAoYQBAAAolDAAAACFEgYAAKBQ/z+V9ERWvibhgQAAAABJRU5ErkJggg==\n"
|
|
},
|
|
"metadata": {}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [],
|
|
"metadata": {
|
|
"id": "yqLLsSep_F_j"
|
|
},
|
|
"execution_count": null,
|
|
"outputs": []
|
|
}
|
|
],
|
|
"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.12.8"
|
|
},
|
|
"colab": {
|
|
"provenance": []
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 0
|
|
} |