Skip to content

Instantly share code, notes, and snippets.

@NoFishLikeIan
Created March 1, 2019 14:55
Show Gist options
  • Save NoFishLikeIan/5ede37996735fdf6a7a121aa2ba40313 to your computer and use it in GitHub Desktop.
Save NoFishLikeIan/5ede37996735fdf6a7a121aa2ba40313 to your computer and use it in GitHub Desktop.
hashcode_2019_accurat
Display the source blob
Display the rendered blob
Raw
{
"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
}
@NoFishLikeIan
Copy link
Author

NoFishLikeIan commented Mar 1, 2019

A new version is coming with a better version hopefully. The problem data and statement is here!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment