Created
March 1, 2019 14:55
-
-
Save NoFishLikeIan/5ede37996735fdf6a7a121aa2ba40313 to your computer and use it in GitHub Desktop.
hashcode_2019_accurat
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Accurat failed attempt at the google code challenge" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 57, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"import pandas as pd\n", | |
"import matplotlib.pyplot as plt\n", | |
"\n", | |
"import random\n", | |
"import types" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 58, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import os\n", | |
"\n", | |
"possible_urls = []\n", | |
"\n", | |
"for file in os.listdir('data'):\n", | |
" if file.endswith('.txt'):\n", | |
" possible_urls.append(file)\n", | |
" " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 80, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def read_data(url):\n", | |
" '''\n", | |
" A function that takes the url and returns the data in pretty format, sorry for the description\n", | |
" '''\n", | |
" with open(f'data/{url}', 'r') as file:\n", | |
" s = file.read().split('\\n')\n", | |
"\n", | |
" n_images = s[0]\n", | |
" data = []\n", | |
" for n, block in enumerate(s[1:-1]):\n", | |
" [orientation, n_tags, *tags] = block.split(' ')\n", | |
" if len(orientation) != 0:\n", | |
" datum = {'orient': orientation, 'tags': tags, 'n_tags': n_tags, 'id': n}\n", | |
" data.append(datum)\n", | |
"\n", | |
" \n", | |
" return data, n_images" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 81, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"flatten = lambda l: [item for sublist in l for item in sublist]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## First look at the data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 82, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"c_memorable_moments.txt d_pet_pictures.txt\n" | |
] | |
} | |
], | |
"source": [ | |
"small_dataset = possible_urls[1]\n", | |
"\n", | |
"big_dataset = possible_urls[3]\n", | |
"\n", | |
"print(small_dataset, big_dataset)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 83, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"({'orient': 'V',\n", | |
" 'tags': ['tw52', 't17', 'tmz1', 't1l', 't8b1', 'tg6', 'tjb1'],\n", | |
" 'n_tags': '7',\n", | |
" 'id': 0},\n", | |
" '1000')" | |
] | |
}, | |
"execution_count": 83, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"data, n_images = read_data(small_dataset)\n", | |
"\n", | |
"data[0], n_images" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 84, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"tags = flatten(datum['tags'] for datum in data)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 85, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"uniq, counts = np.unique(tags, return_counts=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 86, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"20" | |
] | |
}, | |
"execution_count": 86, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"max(counts)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Maximum two tags so there is a \"optimum\" solution! No prob approach, maybe..." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## The appropriate data structures, as usual." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 87, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class Slide:\n", | |
" def __init__(self, photos_array):\n", | |
" if not isinstance(photos_array, (list, tuple)):\n", | |
" self.tags = set(photos_array['tags'])\n", | |
" self.ids = [photos_array['id']]\n", | |
" \n", | |
" elif len(photos_array) == 2:\n", | |
" assert photos_array[0]['orient'] == 'V'\n", | |
" assert photos_array[1]['orient'] == 'V'\n", | |
" \n", | |
" self.tags = set(photos_array[0]['tags'] + photos_array[1]['tags'])\n", | |
" self.ids = [photos_array[0]['id'], photos_array[1]['id']]\n", | |
" else:\n", | |
" self.tags = set(photos_array[0]['tags'])\n", | |
" self.ids = [photos_array[0]['id']]\n", | |
" \n", | |
" self.connected_slides = []\n", | |
" self.visited = False\n", | |
" \n", | |
" def __add__(self, other) -> int:\n", | |
" '''\n", | |
" We can redefine add to mach the scoring of the problem\n", | |
" '''\n", | |
" \n", | |
" common = len(self.tags & other.tags) # intersection of two sets\n", | |
" if common == 0:\n", | |
" return 0\n", | |
" \n", | |
" first = len(self.tags - other.tags)\n", | |
" if first == 0:\n", | |
" return 0\n", | |
" \n", | |
" second = len(other.tags - self.tags)\n", | |
" if second == 0:\n", | |
" return 0\n", | |
" \n", | |
" return min(common, first, second)\n", | |
" \n", | |
" def __radd__(self, other):\n", | |
" return self.__add__(other)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Example, to see if this works:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 88, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"['tw52', 't17', 'tmz1', 't1l', 't8b1', 'tg6', 'tjb1'] \n", | |
" ['twt1', 'tzb1', 'trn', 't6c', 't81', 'tgr', 'tc51']\n" | |
] | |
} | |
], | |
"source": [ | |
"print(data[0]['tags'],'\\n', data[1]['tags'])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 89, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"We expect the first score to be the minimum between 1, 7, 13\n" | |
] | |
} | |
], | |
"source": [ | |
"n, m = 2, 88\n", | |
"\n", | |
"_ = len(set(data[n]['tags']) & set(data[m]['tags']))\n", | |
"__ = len(set(data[n]['tags']) - set(data[m]['tags']))\n", | |
"___ = len(set(data[m]['tags']) - set(data[n]['tags']))\n", | |
"print(f'We expect the first score to be the minimum between {_}, {__}, {___}')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 90, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"one, two = Slide(data[n]), Slide(data[m])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 91, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"1 olè!\n" | |
] | |
} | |
], | |
"source": [ | |
"print(one + two, 'olè!')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## The brute force approach approach" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 92, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import itertools" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 93, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"all_vertical_photos =[datum for datum in data if datum['orient'] == 'V']" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 94, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"possible_combinations_of_v = itertools.combinations(all_vertical_photos, 2)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 95, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"possible_slides_v = (Slide(i) for i in possible_combinations_of_v)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 96, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"possible_slides_h = (Slide(i) for i in (datum for datum in data if datum['orient'] == 'H'))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 97, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"all_slides = itertools.chain(possible_slides_v, possible_slides_h)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Etc., you get the gimmick...\n", | |
"Not gonna work" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Greedy search, what we ended up using" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Matching a priori the vertical images\n", | |
"\n", | |
"Why? Sounds cooler.\n", | |
"\n", | |
"The function below simply takes the possible vertical pictures and computes a simple heuristic of preference in order to determine the best couples. We are gonna borrow an implementation of the stable roomate problem from Sir. [milkypostman](https://github.com/CoeCS/tacklebox/tree/master/stableroomate)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 98, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def match_v(vs_iter):\n", | |
" preferences = {} \n", | |
" \n", | |
" permutations = itertools.permutations(vs_iter, r=2)\n", | |
" \n", | |
" for vertical, other_vertical in permutations:\n", | |
"\n", | |
"\n", | |
" common_tags = len(set(vertical['tags']) & set(other_vertical['tags']))\n", | |
" score = 2 if common_tags == 0 else 1 / common_tags\n", | |
" \n", | |
" \n", | |
" if vertical['id'] not in preferences:\n", | |
" preferences[vertical['id']] = {vertical['id']: 0}\n", | |
" if other_vertical['id'] not in preferences:\n", | |
" preferences[other_vertical['id']] = {other_vertical['id']: 0}\n", | |
"\n", | |
" preferences[vertical['id']][other_vertical['id']] = score\n", | |
" preferences[other_vertical['id']][vertical['id']] = score \n", | |
" \n", | |
" \n", | |
"\n", | |
" return preferences" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 99, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"preferences = match_v([datum for datum in data if datum['orient'] == 'V'])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 100, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 720x720 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"df = pd.DataFrame(preferences)\n", | |
"\n", | |
"plt.figure(figsize=(10,10))\n", | |
"plt.imshow(df.values, cmap='coolwarm')\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 101, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"vertical_ids = dict(enumerate(df.columns))\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Milky steps in" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 102, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import random\n", | |
"\n", | |
"\n", | |
"def fillin(prefs):\n", | |
" \"\"\"\n", | |
" some choices may not include everyone.\n", | |
" fill in the rest by rearranging the others available at random.\n", | |
" \"\"\"\n", | |
"\n", | |
" names = set(prefs.keys())\n", | |
"\n", | |
" for name, choices in prefs.items():\n", | |
"\n", | |
" left = set(names).difference([name]).difference(choices)\n", | |
"\n", | |
"\n", | |
" if len(left) > 0:\n", | |
" left = list(left)\n", | |
" random.shuffle(list(left))\n", | |
" choices.extend(list(left))\n", | |
"\n", | |
"def checkprefs(prefs):\n", | |
" \"\"\"\n", | |
" - `prefs`: preferences dict, name key, list of names as choices in order\n", | |
" \"\"\"\n", | |
"\n", | |
" names = set(prefs.keys())\n", | |
"\n", | |
"\n", | |
"def verify_ranks(ranks, prefs):\n", | |
" \"\"\"\n", | |
" check that ranks and prefs correspond\n", | |
" Arguments:\n", | |
" - `ranks`: dict mapping name to rank index\n", | |
" - `prefs`: preferences dict, name key, list of names as choices in order\n", | |
" \"\"\"\n", | |
"\n", | |
" for n in ranks:\n", | |
" for m in ranks[n]:\n", | |
" idx = ranks[n][m]\n", | |
" try:\n", | |
" assert m == prefs[n][idx]\n", | |
" except AssertionError(e):\n", | |
" raise AssertionError(e)\n", | |
"\n", | |
"\n", | |
"def reject(prefs, ranks, holds):\n", | |
" \"\"\"\n", | |
" This does a reduction of the ranks if either of the following conditions\n", | |
" holds.\n", | |
" (i)\n", | |
" (ii)\n", | |
" \"\"\"\n", | |
"\n", | |
" for y in holds:\n", | |
"\n", | |
" # n holds holds[n]\n", | |
" i = 0\n", | |
" x = holds[y]\n", | |
" while i < len(prefs[y]):\n", | |
" yi = prefs[y][i]\n", | |
"\n", | |
" if yi == x:\n", | |
" prefs[y] = prefs[y][:i+1]\n", | |
"\n", | |
" # lower rank is better\n", | |
" elif ranks[yi][holds[yi]] < ranks[yi][y]:\n", | |
" prefs[y].pop(i)\n", | |
" continue\n", | |
" i += 1\n", | |
"\n", | |
"\n", | |
"\n", | |
"def find_all_or_nothing(prefs, ranks, holds):\n", | |
" \"\"\"\n", | |
" Find an all or nothing cycle.\n", | |
" Arguments:\n", | |
" - `prefs`:\n", | |
" - `ranks`:\n", | |
" - `holds`:\n", | |
" \"\"\"\n", | |
" p = []\n", | |
" q = []\n", | |
"\n", | |
" # first find a key that has more than one pref left\n", | |
" for x in sorted(prefs):\n", | |
" if len(prefs[x]) > 1:\n", | |
" cur = x\n", | |
" break\n", | |
" else:\n", | |
" return None\n", | |
"\n", | |
"\n", | |
" # trace through\n", | |
" while cur not in p:\n", | |
" # q_i = second person in p_i's list\n", | |
" q.append( prefs[cur][1] )\n", | |
"\n", | |
" # p_{i+1} = q_i' last person\n", | |
" p.append(cur)\n", | |
" cur = prefs[q[-1]][-1]\n", | |
"\n", | |
" a = p[p.index(cur):]\n", | |
" b = [prefs[n][0] for n in a]\n", | |
"\n", | |
" return a\n", | |
"\n", | |
"\n", | |
"\n", | |
"def phase1(prefs, ranks, curpref=None, debug=False):\n", | |
" \"\"\"\n", | |
" perform phase 1 of the stable roomates problem.\n", | |
" Arguments:\n", | |
" - `prefs`: preferences dict, name key, list of names as choices in order\n", | |
" - `ranks`: dict mapping name to rank index\n", | |
" \"\"\"\n", | |
"\n", | |
" # holds\n", | |
" holds = dict( (name,None) for name in prefs.keys() )\n", | |
"\n", | |
" if curpref is None:\n", | |
" curpref = dict( (name, 0) for name in prefs.keys() )\n", | |
"\n", | |
" people = prefs.keys()\n", | |
" random.shuffle(list(people))\n", | |
"\n", | |
" proposed_to = set()\n", | |
"\n", | |
"\n", | |
"\n", | |
" for person in people:\n", | |
" poser = person\n", | |
"\n", | |
" while (1):\n", | |
" # find poser someone\n", | |
" while curpref[poser] < len(prefs[poser]):\n", | |
" # person poser is proposing to\n", | |
" nchoice = prefs[poser][curpref[poser]]\n", | |
" curpref[poser] += 1\n", | |
"\n", | |
" # person poser is holding\n", | |
" cchoice = holds[nchoice]\n", | |
"\n", | |
"\n", | |
" # lower ranking is better\n", | |
" if cchoice is None or \\\n", | |
" ranks[nchoice][poser] < ranks[nchoice][cchoice]:\n", | |
" break\n", | |
"\n", | |
"\n", | |
" holds[nchoice] = poser\n", | |
"\n", | |
" if nchoice not in proposed_to:\n", | |
" assert cchoice is None\n", | |
" break\n", | |
"\n", | |
" poser = cchoice\n", | |
"\n", | |
" proposed_to.add(nchoice)\n", | |
"\n", | |
" return holds\n", | |
"\n", | |
"\n", | |
"\n", | |
"def stableroomate(prefs, debug=False):\n", | |
" \"\"\"\n", | |
" find a stable roomate matching\n", | |
" \"\"\"\n", | |
"\n", | |
" # make sure everyone has the same number of choices\n", | |
" fillin(prefs)\n", | |
"\n", | |
" # validate that names are correct\n", | |
" checkprefs(prefs)\n", | |
"\n", | |
" # generate a dictionary of rank values for each name\n", | |
" ranks = dict( (idx, dict(zip(val,range(len(val)) )))\n", | |
" for idx,val in prefs.items() )\n", | |
"\n", | |
" # validate the ranks correspond to the proper indices\n", | |
" verify_ranks(ranks, prefs)\n", | |
"\n", | |
" # phase1\n", | |
" holds = phase1(prefs, ranks)\n", | |
" reject(prefs, ranks, holds)\n", | |
"\n", | |
" cycle = find_all_or_nothing(prefs, ranks, holds)\n", | |
"\n", | |
" if cycle is not None and len(cycle) == 3:\n", | |
" print( \"no solution exists\")\n", | |
" return\n", | |
"\n", | |
" ## phase 2\n", | |
" while cycle is not None:\n", | |
" print(\"-- cycle detected -----------\")\n", | |
" print(\"{0}\".format(cycle))\n", | |
"\n", | |
" curpref = {}\n", | |
" for x in prefs:\n", | |
" if x in cycle:\n", | |
" curpref[x] = 1\n", | |
" else:\n", | |
" curpref[x] = 0\n", | |
"\n", | |
" holds = phase1(prefs, ranks, curpref)\n", | |
" reject(prefs, ranks, holds)\n", | |
"\n", | |
" cycle = find_all_or_nothing(prefs, ranks, holds)\n", | |
"\n", | |
" return holds\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 103, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"sort_by_seconds = lambda value: value[1]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 104, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Just dropping both axis in an inefficient way\n", | |
"df = df.reset_index(drop = True).T.reset_index(drop = True).T" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 105, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"new_df = df.copy()\n", | |
"\n", | |
"sorted_elements = []\n", | |
"\n", | |
"for col in df.columns:\n", | |
" sorted_columns = list(enumerate(df[col].tolist()))\n", | |
" sorted_columns.sort(key = sort_by_seconds)\n", | |
" sorted_elem = [i[0] for i in sorted_columns if i[0] != int(col)]\n", | |
" sorted_elements.append(sorted_elem)\n", | |
" \n", | |
"# This is the weird format of the algorithm\n", | |
"sorted_preference_array = pd.DataFrame(dict(zip(df.columns, sorted_elements)))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 106, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"ranked_preferences_per_v = {}\n", | |
"\n", | |
"for key, values in sorted_preference_array.to_dict().items():\n", | |
" ranked_preferences_per_v[key] = list(values.values())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 107, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"CPU times: user 69 ms, sys: 4.16 ms, total: 73.2 ms\n", | |
"Wall time: 73.3 ms\n" | |
] | |
} | |
], | |
"source": [ | |
"%%time\n", | |
"roomates = stableroomate(ranked_preferences_per_v)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 108, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"v_preferences_by_id = {}\n", | |
"\n", | |
"\n", | |
"for key, value in roomates.items():\n", | |
" \n", | |
" v_preferences_by_id[vertical_ids[key]] = vertical_ids[value]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 109, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"From index 55 to id 104\n" | |
] | |
} | |
], | |
"source": [ | |
"print(f'From index {roomates[0]} to id {v_preferences_by_id[0]}')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Graph greedy search\n", | |
"\n", | |
"Now let's bring back the horizontal image and map all of them in the Slide class" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 110, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"optimum_vertical_slides = []\n", | |
"\n", | |
"vertical_photos_map = dict([(vertical_photo['id'], vertical_photo) for vertical_photo in all_vertical_photos])\n", | |
"\n", | |
"for source_id, preference_id in v_preferences_by_id.items():\n", | |
" vertical_slide = Slide([vertical_photos_map[source_id], vertical_photos_map[preference_id]])\n", | |
" optimum_vertical_slides.append(vertical_slide)\n", | |
"\n", | |
"\n", | |
"# This has to be optimized\n", | |
"uniq_optimum_vertical_slides = []\n", | |
"\n", | |
"for slide in optimum_vertical_slides:\n", | |
" if slide.ids[0] in [slide.ids[1] for slide in uniq_optimum_vertical_slides]:\n", | |
" continue\n", | |
" else:\n", | |
" uniq_optimum_vertical_slides.append(slide)\n", | |
"\n", | |
"all_possible_slides = uniq_optimum_vertical_slides + [Slide([datum]) for datum in data if datum['orient'] == 'H']" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 111, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"750" | |
] | |
}, | |
"execution_count": 111, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"len(all_possible_slides)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"We can now map the weights of the graph as the score between two slides" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 112, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"combinations = itertools.combinations(all_possible_slides, 2)\n", | |
"for slide_1, slide_2 in combinations:\n", | |
" score = slide_1 + slide_2\n", | |
" if score == 0:\n", | |
" continue\n", | |
" \n", | |
" slide_1.connected_slides.append((score, slide_2))\n", | |
" slide_2.connected_slides.append((score, slide_1))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 113, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"sort_by_first = lambda x: x[0]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 114, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def search_algo(nodes):\n", | |
" used_slides = set()\n", | |
" total_score = 0\n", | |
" n = len(nodes)\n", | |
" \n", | |
" current_slide = nodes[random.randint(0, n)]\n", | |
" increment = 0\n", | |
" \n", | |
" # Here be Spyro\n", | |
" while True:\n", | |
" available_slides = [tuple_slide for tuple_slide in current_slide.connected_slides if tuple_slide[1] not in used_slides]\n", | |
" \n", | |
" while len(available_slides) == 0:\n", | |
" try:\n", | |
" \n", | |
" current_slide = list(set(nodes) - used_slides)[increment]\n", | |
" increment += 1\n", | |
" available_slides = [tuple_slide for tuple_slide in current_slide.connected_slides if tuple_slide[1] not in used_slides]\n", | |
"\n", | |
" if len(available_slides) == 1:\n", | |
" return used_slides\n", | |
" \n", | |
" except IndexError:\n", | |
" return used_slides\n", | |
"\n", | |
" \n", | |
" increment = 0\n", | |
" score, next_slide = max(available_slides, key=sort_by_first)\n", | |
" total_score += score\n", | |
" \n", | |
" used_slides.add(current_slide)\n", | |
" current_slide = next_slide\n", | |
" print(f'The running score is: {total_score}', end='\\r')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 115, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"The running score is: 2\r", | |
"The running score is: 5\r", | |
"The running score is: 8\r", | |
"The running score is: 12\r", | |
"The running score is: 14\r", | |
"The running score is: 17\r", | |
"The running score is: 20\r", | |
"The running score is: 22\r", | |
"The running score is: 25\r", | |
"The running score is: 28\r", | |
"The running score is: 32\r", | |
"The running score is: 35\r", | |
"The running score is: 38\r", | |
"The running score is: 41\r", | |
"The running score is: 44\r", | |
"The running score is: 46\r", | |
"The running score is: 48\r", | |
"The running score is: 50\r", | |
"The running score is: 53\r", | |
"The running score is: 56\r", | |
"The running score is: 59\r", | |
"The running score is: 62\r", | |
"The running score is: 65\r", | |
"The running score is: 68\r", | |
"The running score is: 70\r", | |
"The running score is: 73\r", | |
"The running score is: 77\r", | |
"The running score is: 80\r", | |
"The running score is: 84\r", | |
"The running score is: 87\r", | |
"The running score is: 90\r", | |
"The running score is: 93\r", | |
"The running score is: 96\r", | |
"The running score is: 99\r", | |
"The running score is: 101\r", | |
"The running score is: 103\r", | |
"The running score is: 105\r", | |
"The running score is: 107\r", | |
"The running score is: 110\r", | |
"The running score is: 113\r", | |
"The running score is: 115\r", | |
"The running score is: 117\r", | |
"The running score is: 120\r", | |
"The running score is: 122\r", | |
"The running score is: 125\r", | |
"The running score is: 128\r", | |
"The running score is: 131\r", | |
"The running score is: 134\r", | |
"The running score is: 136\r", | |
"The running score is: 138\r", | |
"The running score is: 140\r", | |
"The running score is: 143\r", | |
"The running score is: 145\r", | |
"The running score is: 147\r", | |
"The running score is: 149\r", | |
"The running score is: 152\r", | |
"The running score is: 155\r", | |
"The running score is: 158\r", | |
"The running score is: 161\r", | |
"The running score is: 164\r", | |
"The running score is: 166\r", | |
"The running score is: 168\r", | |
"The running score is: 171\r", | |
"The running score is: 173\r", | |
"The running score is: 176\r", | |
"The running score is: 178\r", | |
"The running score is: 180\r", | |
"The running score is: 183\r", | |
"The running score is: 185\r", | |
"The running score is: 187\r", | |
"The running score is: 190\r", | |
"The running score is: 193\r", | |
"The running score is: 195\r", | |
"The running score is: 198\r", | |
"The running score is: 202\r", | |
"The running score is: 205\r", | |
"The running score is: 207\r", | |
"The running score is: 210\r", | |
"The running score is: 213\r", | |
"The running score is: 216\r", | |
"The running score is: 221\r", | |
"The running score is: 224\r", | |
"The running score is: 226\r", | |
"The running score is: 229\r", | |
"The running score is: 232\r", | |
"The running score is: 235\r", | |
"The running score is: 238\r", | |
"The running score is: 241\r", | |
"The running score is: 243\r", | |
"The running score is: 246\r", | |
"The running score is: 249\r", | |
"The running score is: 251\r", | |
"The running score is: 253\r", | |
"The running score is: 255\r", | |
"The running score is: 257\r", | |
"The running score is: 259\r", | |
"The running score is: 262\r", | |
"The running score is: 264\r", | |
"The running score is: 266\r", | |
"The running score is: 268\r", | |
"The running score is: 270\r", | |
"The running score is: 272\r", | |
"The running score is: 274\r", | |
"The running score is: 276\r", | |
"The running score is: 279\r", | |
"The running score is: 282\r", | |
"The running score is: 284\r", | |
"The running score is: 286\r", | |
"The running score is: 289\r", | |
"The running score is: 292\r", | |
"The running score is: 294\r", | |
"The running score is: 297\r", | |
"The running score is: 300\r", | |
"The running score is: 302\r", | |
"The running score is: 305\r", | |
"The running score is: 308\r", | |
"The running score is: 312\r", | |
"The running score is: 316\r", | |
"The running score is: 319\r", | |
"The running score is: 322\r", | |
"The running score is: 325\r", | |
"The running score is: 327\r", | |
"The running score is: 329\r", | |
"The running score is: 331\r", | |
"The running score is: 334\r", | |
"The running score is: 336\r", | |
"The running score is: 339\r", | |
"The running score is: 342\r", | |
"The running score is: 344\r", | |
"The running score is: 347\r", | |
"The running score is: 349\r", | |
"The running score is: 352\r", | |
"The running score is: 354\r", | |
"The running score is: 356\r", | |
"The running score is: 358\r", | |
"The running score is: 361\r", | |
"The running score is: 364\r", | |
"The running score is: 366\r", | |
"The running score is: 368\r", | |
"The running score is: 370\r", | |
"The running score is: 372\r", | |
"The running score is: 374\r", | |
"The running score is: 378\r", | |
"The running score is: 381\r", | |
"The running score is: 383\r", | |
"The running score is: 386\r", | |
"The running score is: 387\r", | |
"The running score is: 390\r", | |
"The running score is: 393\r", | |
"The running score is: 395\r", | |
"The running score is: 398\r", | |
"The running score is: 400\r", | |
"The running score is: 402\r", | |
"The running score is: 404\r", | |
"The running score is: 407\r", | |
"The running score is: 409\r", | |
"The running score is: 411\r", | |
"The running score is: 414\r", | |
"The running score is: 416\r", | |
"The running score is: 418\r", | |
"The running score is: 420\r", | |
"The running score is: 422\r", | |
"The running score is: 424\r", | |
"The running score is: 426\r", | |
"The running score is: 429\r", | |
"The running score is: 431\r", | |
"The running score is: 433\r", | |
"The running score is: 435\r", | |
"The running score is: 438\r", | |
"The running score is: 440\r", | |
"The running score is: 443\r", | |
"The running score is: 446\r", | |
"The running score is: 448\r", | |
"The running score is: 451\r", | |
"The running score is: 453\r", | |
"The running score is: 455\r", | |
"The running score is: 457\r", | |
"The running score is: 459\r", | |
"The running score is: 461\r", | |
"The running score is: 463\r", | |
"The running score is: 465\r", | |
"The running score is: 468\r", | |
"The running score is: 470\r", | |
"The running score is: 472\r", | |
"The running score is: 474\r", | |
"The running score is: 476\r", | |
"The running score is: 478\r", | |
"The running score is: 481\r", | |
"The running score is: 484\r", | |
"The running score is: 486\r", | |
"The running score is: 488\r", | |
"The running score is: 490\r", | |
"The running score is: 492\r", | |
"The running score is: 494\r", | |
"The running score is: 497\r", | |
"The running score is: 500\r", | |
"The running score is: 502\r", | |
"The running score is: 504\r", | |
"The running score is: 506\r", | |
"The running score is: 508\r", | |
"The running score is: 510\r", | |
"The running score is: 513\r", | |
"The running score is: 515\r", | |
"The running score is: 517\r", | |
"The running score is: 519\r", | |
"The running score is: 521\r", | |
"The running score is: 524\r", | |
"The running score is: 527\r", | |
"The running score is: 529\r", | |
"The running score is: 531\r", | |
"The running score is: 534\r", | |
"The running score is: 536\r", | |
"The running score is: 539\r", | |
"The running score is: 541\r", | |
"The running score is: 543\r", | |
"The running score is: 545\r", | |
"The running score is: 548\r", | |
"The running score is: 550\r", | |
"The running score is: 553\r", | |
"The running score is: 556\r", | |
"The running score is: 558\r", | |
"The running score is: 560\r", | |
"The running score is: 562\r", | |
"The running score is: 564\r", | |
"The running score is: 567\r", | |
"The running score is: 569\r", | |
"The running score is: 572\r", | |
"The running score is: 573\r", | |
"The running score is: 576\r", | |
"The running score is: 578\r", | |
"The running score is: 581\r", | |
"The running score is: 584\r", | |
"The running score is: 586\r", | |
"The running score is: 588\r", | |
"The running score is: 590\r", | |
"The running score is: 592\r", | |
"The running score is: 594\r", | |
"The running score is: 596\r", | |
"The running score is: 599\r", | |
"The running score is: 601\r", | |
"The running score is: 603\r", | |
"The running score is: 605\r", | |
"The running score is: 607\r", | |
"The running score is: 608\r", | |
"The running score is: 610\r", | |
"The running score is: 612\r", | |
"The running score is: 614\r", | |
"The running score is: 617\r", | |
"The running score is: 619\r", | |
"The running score is: 621\r", | |
"The running score is: 623\r", | |
"The running score is: 625\r", | |
"The running score is: 627\r", | |
"The running score is: 629\r", | |
"The running score is: 631\r", | |
"The running score is: 633\r", | |
"The running score is: 635\r", | |
"The running score is: 637\r", | |
"The running score is: 639\r", | |
"The running score is: 640\r", | |
"The running score is: 642\r", | |
"The running score is: 644\r", | |
"The running score is: 646\r", | |
"The running score is: 648\r", | |
"The running score is: 649\r", | |
"The running score is: 651\r", | |
"The running score is: 652\r", | |
"The running score is: 654\r", | |
"The running score is: 656\r", | |
"The running score is: 658\r", | |
"The running score is: 660\r", | |
"The running score is: 662\r", | |
"The running score is: 664\r", | |
"The running score is: 666\r", | |
"The running score is: 668\r", | |
"The running score is: 669\r", | |
"The running score is: 671\r", | |
"The running score is: 673\r", | |
"The running score is: 675\r", | |
"The running score is: 677\r", | |
"The running score is: 680\r", | |
"The running score is: 682\r", | |
"The running score is: 684\r", | |
"The running score is: 686\r", | |
"The running score is: 689\r", | |
"The running score is: 691\r", | |
"The running score is: 693\r", | |
"The running score is: 695\r", | |
"The running score is: 697\r", | |
"The running score is: 699\r", | |
"The running score is: 701\r", | |
"The running score is: 703\r", | |
"The running score is: 705\r", | |
"The running score is: 707\r", | |
"The running score is: 710\r", | |
"The running score is: 712\r", | |
"The running score is: 714\r", | |
"The running score is: 716\r", | |
"The running score is: 719\r", | |
"The running score is: 721\r", | |
"The running score is: 724\r", | |
"The running score is: 726\r", | |
"The running score is: 727\r", | |
"The running score is: 729\r", | |
"The running score is: 731\r", | |
"The running score is: 733\r", | |
"The running score is: 735\r", | |
"The running score is: 737\r", | |
"The running score is: 739\r", | |
"The running score is: 741\r", | |
"The running score is: 743\r", | |
"The running score is: 745\r", | |
"The running score is: 747\r", | |
"The running score is: 748\r", | |
"The running score is: 750\r", | |
"The running score is: 752\r", | |
"The running score is: 754\r", | |
"The running score is: 755\r", | |
"The running score is: 757\r", | |
"The running score is: 759\r", | |
"The running score is: 761\r", | |
"The running score is: 762\r", | |
"The running score is: 765\r", | |
"The running score is: 767\r", | |
"The running score is: 769\r", | |
"The running score is: 771\r", | |
"The running score is: 773\r", | |
"The running score is: 775\r", | |
"The running score is: 777\r", | |
"The running score is: 779\r", | |
"The running score is: 781\r", | |
"The running score is: 783\r", | |
"The running score is: 785\r", | |
"The running score is: 787\r", | |
"The running score is: 788\r", | |
"The running score is: 790\r", | |
"The running score is: 792\r", | |
"The running score is: 794\r", | |
"The running score is: 797\r", | |
"The running score is: 799\r", | |
"The running score is: 801\r", | |
"The running score is: 803\r", | |
"The running score is: 806\r", | |
"The running score is: 808\r", | |
"The running score is: 809\r", | |
"The running score is: 811\r", | |
"The running score is: 813\r", | |
"The running score is: 815\r", | |
"The running score is: 817\r", | |
"The running score is: 819\r", | |
"The running score is: 820\r", | |
"The running score is: 822\r", | |
"The running score is: 824\r", | |
"The running score is: 826\r", | |
"The running score is: 828\r", | |
"The running score is: 829\r", | |
"The running score is: 831\r", | |
"The running score is: 833\r", | |
"The running score is: 834\r", | |
"The running score is: 837\r", | |
"The running score is: 838\r", | |
"The running score is: 840\r", | |
"The running score is: 841\r", | |
"The running score is: 843\r", | |
"The running score is: 845\r", | |
"The running score is: 846\r", | |
"The running score is: 848\r", | |
"The running score is: 851\r", | |
"The running score is: 853\r", | |
"The running score is: 855\r", | |
"The running score is: 856\r", | |
"The running score is: 857\r", | |
"The running score is: 858\r", | |
"The running score is: 860\r", | |
"The running score is: 862\r", | |
"The running score is: 865\r", | |
"The running score is: 868\r", | |
"The running score is: 870\r", | |
"The running score is: 871\r", | |
"The running score is: 874\r", | |
"The running score is: 876\r", | |
"The running score is: 878\r", | |
"The running score is: 880\r", | |
"The running score is: 882\r", | |
"The running score is: 884\r", | |
"The running score is: 886\r", | |
"The running score is: 888\r", | |
"The running score is: 890\r", | |
"The running score is: 892\r", | |
"The running score is: 895\r", | |
"The running score is: 897\r", | |
"The running score is: 899\r", | |
"The running score is: 901\r", | |
"The running score is: 903\r", | |
"The running score is: 905\r", | |
"The running score is: 906\r", | |
"The running score is: 908\r", | |
"The running score is: 909\r", | |
"The running score is: 911\r", | |
"The running score is: 913\r", | |
"The running score is: 915\r", | |
"The running score is: 918\r", | |
"The running score is: 921\r", | |
"The running score is: 922\r", | |
"The running score is: 924\r", | |
"The running score is: 927\r", | |
"The running score is: 928\r", | |
"The running score is: 930\r", | |
"The running score is: 932\r", | |
"The running score is: 933\r", | |
"The running score is: 935\r", | |
"The running score is: 936\r", | |
"The running score is: 937\r", | |
"The running score is: 939\r", | |
"The running score is: 941\r", | |
"The running score is: 943\r", | |
"The running score is: 944\r", | |
"The running score is: 945\r", | |
"The running score is: 947\r", | |
"The running score is: 948\r", | |
"The running score is: 949\r", | |
"The running score is: 951\r", | |
"The running score is: 953\r", | |
"The running score is: 955\r", | |
"The running score is: 957\r", | |
"The running score is: 959\r", | |
"The running score is: 961\r", | |
"The running score is: 963\r", | |
"The running score is: 964\r", | |
"The running score is: 965\r", | |
"The running score is: 967\r", | |
"The running score is: 969\r", | |
"The running score is: 971\r", | |
"The running score is: 973\r", | |
"The running score is: 974\r", | |
"The running score is: 975\r", | |
"The running score is: 977\r", | |
"The running score is: 978\r", | |
"The running score is: 979\r", | |
"The running score is: 980\r", | |
"The running score is: 981\r", | |
"The running score is: 982\r", | |
"The running score is: 983\r", | |
"The running score is: 985\r", | |
"The running score is: 988\r", | |
"The running score is: 990\r", | |
"The running score is: 991\r", | |
"The running score is: 993\r", | |
"The running score is: 995\r", | |
"The running score is: 997\r", | |
"The running score is: 998\r", | |
"The running score is: 1000\r", | |
"The running score is: 1001\r", | |
"The running score is: 1003\r", | |
"The running score is: 1005\r", | |
"The running score is: 1007\r", | |
"The running score is: 1009\r", | |
"The running score is: 1011\r", | |
"The running score is: 1013\r", | |
"The running score is: 1014\r", | |
"The running score is: 1015\r", | |
"The running score is: 1016\r", | |
"The running score is: 1017\r", | |
"The running score is: 1018\r", | |
"The running score is: 1020\r", | |
"The running score is: 1022\r", | |
"The running score is: 1023\r", | |
"The running score is: 1025\r", | |
"The running score is: 1027\r", | |
"The running score is: 1029\r", | |
"The running score is: 1031\r", | |
"The running score is: 1032\r", | |
"The running score is: 1034\r", | |
"The running score is: 1036\r", | |
"The running score is: 1037\r", | |
"The running score is: 1038\r", | |
"The running score is: 1039\r", | |
"The running score is: 1041\r", | |
"The running score is: 1042\r", | |
"The running score is: 1043\r", | |
"The running score is: 1044\r", | |
"The running score is: 1045\r", | |
"The running score is: 1046\r", | |
"The running score is: 1048\r", | |
"The running score is: 1050\r", | |
"The running score is: 1051\r", | |
"The running score is: 1053\r", | |
"The running score is: 1055\r", | |
"The running score is: 1057\r", | |
"The running score is: 1058\r", | |
"The running score is: 1060\r", | |
"The running score is: 1062\r", | |
"The running score is: 1064\r", | |
"The running score is: 1066\r", | |
"The running score is: 1068\r", | |
"The running score is: 1070\r", | |
"The running score is: 1073\r", | |
"The running score is: 1075\r", | |
"The running score is: 1076\r", | |
"The running score is: 1078\r", | |
"The running score is: 1080\r", | |
"The running score is: 1082\r", | |
"The running score is: 1084\r", | |
"The running score is: 1086\r", | |
"The running score is: 1088\r", | |
"The running score is: 1090\r", | |
"The running score is: 1091\r", | |
"The running score is: 1092\r", | |
"The running score is: 1094\r", | |
"The running score is: 1096\r", | |
"The running score is: 1098\r", | |
"The running score is: 1100\r", | |
"The running score is: 1101\r", | |
"The running score is: 1102\r", | |
"The running score is: 1103\r", | |
"The running score is: 1104\r", | |
"The running score is: 1105\r", | |
"The running score is: 1107\r", | |
"The running score is: 1109\r", | |
"The running score is: 1111\r", | |
"The running score is: 1112\r", | |
"The running score is: 1113\r", | |
"The running score is: 1114\r", | |
"The running score is: 1116\r", | |
"The running score is: 1117\r", | |
"The running score is: 1118\r", | |
"The running score is: 1119\r", | |
"The running score is: 1120\r", | |
"The running score is: 1121\r", | |
"The running score is: 1123\r", | |
"The running score is: 1125\r", | |
"The running score is: 1126\r", | |
"The running score is: 1128\r", | |
"The running score is: 1129\r", | |
"The running score is: 1130\r", | |
"The running score is: 1132\r", | |
"The running score is: 1133\r", | |
"The running score is: 1134\r", | |
"The running score is: 1136\r", | |
"The running score is: 1137\r", | |
"The running score is: 1138\r", | |
"The running score is: 1139\r", | |
"The running score is: 1141\r", | |
"The running score is: 1143\r", | |
"The running score is: 1145\r", | |
"The running score is: 1147\r", | |
"The running score is: 1149\r", | |
"The running score is: 1150\r", | |
"The running score is: 1153\r", | |
"The running score is: 1155\r", | |
"The running score is: 1156\r", | |
"The running score is: 1157\r", | |
"The running score is: 1158\r", | |
"The running score is: 1159\r", | |
"The running score is: 1160\r", | |
"The running score is: 1162\r", | |
"The running score is: 1164\r", | |
"The running score is: 1165\r", | |
"The running score is: 1167\r", | |
"The running score is: 1168\r", | |
"The running score is: 1169\r", | |
"The running score is: 1170\r", | |
"The running score is: 1171\r", | |
"The running score is: 1173\r", | |
"The running score is: 1174\r", | |
"The running score is: 1176\r", | |
"The running score is: 1178\r", | |
"The running score is: 1179\r", | |
"The running score is: 1180\r", | |
"The running score is: 1182\r", | |
"The running score is: 1184\r", | |
"The running score is: 1185\r", | |
"The running score is: 1186\r", | |
"The running score is: 1187\r", | |
"The running score is: 1189\r", | |
"The running score is: 1190\r", | |
"The running score is: 1191\r", | |
"The running score is: 1193\r", | |
"The running score is: 1194\r", | |
"The running score is: 1195\r", | |
"The running score is: 1196\r", | |
"The running score is: 1197\r", | |
"The running score is: 1199\r", | |
"The running score is: 1201\r", | |
"The running score is: 1203\r", | |
"The running score is: 1205\r", | |
"The running score is: 1206\r", | |
"The running score is: 1208\r", | |
"The running score is: 1209\r", | |
"The running score is: 1211\r", | |
"The running score is: 1212\r", | |
"The running score is: 1214\r", | |
"The running score is: 1216\r", | |
"The running score is: 1218\r", | |
"The running score is: 1220\r", | |
"The running score is: 1221\r", | |
"The running score is: 1223\r", | |
"The running score is: 1224\r", | |
"The running score is: 1226\r", | |
"The running score is: 1227\r", | |
"The running score is: 1228\r", | |
"The running score is: 1229\r", | |
"The running score is: 1230\r", | |
"The running score is: 1231\r", | |
"The running score is: 1232\r", | |
"The running score is: 1234\r", | |
"The running score is: 1235\r", | |
"The running score is: 1236\r", | |
"The running score is: 1237\r", | |
"The running score is: 1238\r", | |
"The running score is: 1239\r", | |
"The running score is: 1240\r", | |
"The running score is: 1241\r", | |
"The running score is: 1242\r", | |
"The running score is: 1243\r", | |
"The running score is: 1244\r", | |
"The running score is: 1245\r", | |
"The running score is: 1246\r", | |
"The running score is: 1247\r", | |
"The running score is: 1248\r", | |
"The running score is: 1250\r", | |
"The running score is: 1252\r", | |
"The running score is: 1254\r", | |
"The running score is: 1256\r", | |
"The running score is: 1257\r", | |
"The running score is: 1259\r", | |
"The running score is: 1261\r", | |
"The running score is: 1262\r", | |
"The running score is: 1263\r", | |
"The running score is: 1264\r", | |
"The running score is: 1265\r", | |
"The running score is: 1266\r", | |
"The running score is: 1267\r", | |
"The running score is: 1268\r", | |
"The running score is: 1269\r", | |
"The running score is: 1270\r", | |
"The running score is: 1271\r", | |
"The running score is: 1272\r", | |
"The running score is: 1273\r", | |
"The running score is: 1274\r", | |
"The running score is: 1275\r", | |
"The running score is: 1276\r", | |
"The running score is: 1278\r", | |
"The running score is: 1279\r", | |
"The running score is: 1280\r", | |
"The running score is: 1281\r", | |
"The running score is: 1282\r", | |
"The running score is: 1284\r", | |
"The running score is: 1285\r", | |
"The running score is: 1287\r", | |
"The running score is: 1288\r", | |
"The running score is: 1290\r", | |
"The running score is: 1291\r", | |
"The running score is: 1292\r", | |
"The running score is: 1293\r", | |
"The running score is: 1295\r", | |
"The running score is: 1296\r", | |
"The running score is: 1297\r", | |
"The running score is: 1298\r", | |
"The running score is: 1299\r", | |
"The running score is: 1301\r", | |
"The running score is: 1302\r", | |
"The running score is: 1304\r", | |
"The running score is: 1305\r", | |
"The running score is: 1306\r", | |
"The running score is: 1307\r", | |
"The running score is: 1308\r", | |
"The running score is: 1309\r", | |
"The running score is: 1310\r", | |
"The running score is: 1311\r", | |
"The running score is: 1312\r", | |
"The running score is: 1313\r", | |
"The running score is: 1314\r", | |
"The running score is: 1315\r", | |
"The running score is: 1316\r", | |
"The running score is: 1317\r", | |
"The running score is: 1319\r", | |
"The running score is: 1320\r", | |
"The running score is: 1322\r", | |
"The running score is: 1324\r", | |
"The running score is: 1325\r", | |
"The running score is: 1326\r", | |
"The running score is: 1327\r", | |
"The running score is: 1328\r", | |
"The running score is: 1329\r", | |
"The running score is: 1330\r", | |
"The running score is: 1331\r", | |
"The running score is: 1333\r", | |
"The running score is: 1334\r", | |
"The running score is: 1335\r", | |
"The running score is: 1336\r", | |
"The running score is: 1337\r", | |
"The running score is: 1338\r", | |
"The running score is: 1339\r", | |
"The running score is: 1340\r", | |
"The running score is: 1341\r", | |
"The running score is: 1342\r", | |
"The running score is: 1343\r", | |
"The running score is: 1344\r", | |
"The running score is: 1346\r", | |
"The running score is: 1347\r", | |
"The running score is: 1348\r", | |
"The running score is: 1349\r", | |
"The running score is: 1350\r", | |
"The running score is: 1351\r", | |
"The running score is: 1352\r", | |
"The running score is: 1353\r", | |
"The running score is: 1354\r", | |
"The running score is: 1355\r", | |
"The running score is: 1356\r", | |
"The running score is: 1357\r", | |
"The running score is: 1358\r", | |
"The running score is: 1359\r", | |
"The running score is: 1360\r", | |
"The running score is: 1361\r", | |
"The running score is: 1362\r", | |
"The running score is: 1363\r", | |
"The running score is: 1364\r", | |
"The running score is: 1365\r", | |
"The running score is: 1366\r", | |
"The running score is: 1367\r", | |
"The running score is: 1368\r", | |
"The running score is: 1369\r", | |
"The running score is: 1370\r", | |
"The running score is: 1371\r", | |
"CPU times: user 34.3 ms, sys: 7.95 ms, total: 42.2 ms\n", | |
"Wall time: 35.5 ms\n" | |
] | |
} | |
], | |
"source": [ | |
"%%time\n", | |
"solution = search_algo(all_possible_slides)" | |
] | |
} | |
], | |
"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.7.0" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A new version is coming with a better version hopefully. The problem data and statement is here!