Skip to content

Instantly share code, notes, and snippets.

@ekzhang
Created November 8, 2019 05:42
Show Gist options
  • Save ekzhang/2eac1d84114746558a469426e4d944bf to your computer and use it in GitHub Desktop.
Save ekzhang/2eac1d84114746558a469426e4d944bf to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Datamatch Algorithm Assignment"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import numpy as np"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Problem 1\n",
"\n",
"First, let's load the dataset we're provided and take a quick peek at it."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"data = pd.read_json('responses.json').T"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>answers</th>\n",
" <th>gender</th>\n",
" <th>gender_preferences</th>\n",
" <th>year</th>\n",
" <th>f</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>[3, 3, 2, 2, 1, 3, 0, 4, 1, 2]</td>\n",
" <td>1</td>\n",
" <td>[0]</td>\n",
" <td>1</td>\n",
" <td>0.11</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>[2, 2, 1, 1, 4, 2, 1, 0, 2, 2]</td>\n",
" <td>1</td>\n",
" <td>[1]</td>\n",
" <td>3</td>\n",
" <td>0.9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>[2, 3, 3, 2, 4, 4, 0, 1, 4, 0]</td>\n",
" <td>2</td>\n",
" <td>[1, 2]</td>\n",
" <td>4</td>\n",
" <td>0.22</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>[1, 1, 2, 4, 0, 3, 0, 2, 3, 1]</td>\n",
" <td>2</td>\n",
" <td>[1, 2]</td>\n",
" <td>4</td>\n",
" <td>0.51</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>[4, 0, 4, 2, 2, 2, 0, 0, 2, 1]</td>\n",
" <td>0</td>\n",
" <td>[0, 2]</td>\n",
" <td>2</td>\n",
" <td>0.67</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>[4, 2, 3, 0, 0, 2, 4, 2, 0, 3]</td>\n",
" <td>2</td>\n",
" <td>[0]</td>\n",
" <td>1</td>\n",
" <td>0.16</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>[0, 1, 4, 1, 0, 4, 1, 4, 1, 0]</td>\n",
" <td>2</td>\n",
" <td>[2, 0]</td>\n",
" <td>4</td>\n",
" <td>0.44</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>[1, 4, 2, 1, 2, 3, 3, 0, 0, 0]</td>\n",
" <td>0</td>\n",
" <td>[0, 2]</td>\n",
" <td>2</td>\n",
" <td>0.95</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>[3, 4, 3, 1, 3, 4, 1, 0, 2, 0]</td>\n",
" <td>2</td>\n",
" <td>[1, 2]</td>\n",
" <td>2</td>\n",
" <td>0.67</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>[1, 4, 3, 1, 2, 2, 2, 3, 3, 4]</td>\n",
" <td>0</td>\n",
" <td>[0]</td>\n",
" <td>4</td>\n",
" <td>0.88</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" answers gender gender_preferences year f\n",
"0 [3, 3, 2, 2, 1, 3, 0, 4, 1, 2] 1 [0] 1 0.11\n",
"1 [2, 2, 1, 1, 4, 2, 1, 0, 2, 2] 1 [1] 3 0.9\n",
"2 [2, 3, 3, 2, 4, 4, 0, 1, 4, 0] 2 [1, 2] 4 0.22\n",
"3 [1, 1, 2, 4, 0, 3, 0, 2, 3, 1] 2 [1, 2] 4 0.51\n",
"4 [4, 0, 4, 2, 2, 2, 0, 0, 2, 1] 0 [0, 2] 2 0.67\n",
"5 [4, 2, 3, 0, 0, 2, 4, 2, 0, 3] 2 [0] 1 0.16\n",
"6 [0, 1, 4, 1, 0, 4, 1, 4, 1, 0] 2 [2, 0] 4 0.44\n",
"7 [1, 4, 2, 1, 2, 3, 3, 0, 0, 0] 0 [0, 2] 2 0.95\n",
"8 [3, 4, 3, 1, 3, 4, 1, 0, 2, 0] 2 [1, 2] 2 0.67\n",
"9 [1, 4, 3, 1, 2, 2, 2, 3, 3, 4] 0 [0] 4 0.88"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1000"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Part 1(a)\n",
"\n",
"Now we write a score function to determine the similarity between two people in the set.\n",
"\n",
"This function is kind of arbitrary but intended to still be reasonably justifiable. Because the problem set didn't really specify the desired behavior to much detail, I took some liberty in assuming what to do with the `f` and `year` data points."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def score(a, b):\n",
" \"\"\"Returns the score between two individuals (smaller is more similar).\"\"\"\n",
" res = 0.0\n",
" # not matching gender preferences is pretty bad, +20 points on either side\n",
" res += 20 if a.gender not in b.gender_preferences else 0\n",
" res += 20 if b.gender not in a.gender_preferences else 0\n",
"\n",
" # difference of 0.5 is ambivalent about similarity, 0 is different, 1 is similar\n",
" for x, y in zip(a.answers, b.answers):\n",
" if x != y:\n",
" res += a.f + b.f\n",
" else:\n",
" # we multiply this by 4 because assuming uniform distribution of answers,\n",
" # this sets the expected value of score to be invariant no matter the value of f\n",
" # (if we didn't do this, people with high values of f would be penalized)\n",
" res += 4 * ((1 - a.f) + (1 - b.f))\n",
"\n",
" res += (a.year - b.year) ** 2 # let's try not to match frosh with seniors\n",
" return res"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Part 1(b)\n",
"\n",
"Now, we can run the scores between all pairs of individuals in our dataset and plot the result distributions."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"diff = [[float('inf') for _ in range(len(data))] for __ in range(len(data))]\n",
"cross_scores = []\n",
"\n",
"for i in range(len(data)):\n",
" for j in range(i + 1, len(data)):\n",
" s = score(data.iloc[i], data.iloc[j])\n",
" cross_scores.append(s)\n",
" diff[i][j] = s\n",
" diff[j][i] = s"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we plot the distribution of all C(n, 2) pairwise scores. Note that this distribution\n",
"has multiple modes, but this is OK (and probably intentional) since we really don't want to\n",
"match someone with a person that is not in their gender preferences."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x11f8f05d0>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deZhcdZ3v8fe3qrqr973TSbrT6c5OCIRASEBUlIgGHQkqSMCFGXkGnRGdud47M3jnDo/D9c4j46jjgjqMoIggOKBMxGiUXRCadIDsW2ftJUnv1ftSVd/7R1WFSqc6Xd1d1bXk+3roJ1XnnKr+HU7yqV/9tiOqijHGmPTlSHQBjDHGxJcFvTHGpDkLemOMSXMW9MYYk+Ys6I0xJs25El2AscrKyrSmpibRxTDGmJSybdu2dlUtj7Qv6YK+pqaG+vr6RBfDGGNSiogcG2+fNd0YY0yas6A3xpg0Z0FvjDFpzoLeGGPSnAW9McakOQt6Y4xJc1EFvYisF5H9ItIgIndF2O8WkceD++tEpCa4/RMi8lbYj19ELontKRhjjDmXCYNeRJzAfcB1wHLgFhFZPuaw24EuVV0EfAu4F0BVH1HVS1T1EuBTwBFVfSuWJ2CMMebcoqnRrwEaVPWwqo4AjwEbxhyzAXgo+PgJYJ2IyJhjbgm+1hhjzAyKZmZsJdAY9rwJWDveMarqFREPUAq0hx1zM2d/QAAgIncAdwBUV1dHVXCTnh6tO37WtlvX2t8JY6ZjRjpjRWQtMKCquyLtV9X7VXW1qq4uL4+4VIMxxpgpiibom4F5Yc+rgtsiHiMiLqAQ6AjbvxH4+dSLaYwxZqqiCfqtwGIRqRWRTAKhvWnMMZuA24KPbwSe0+DNaEXEAXwca583xpiEmLCNPtjmfiewBXACD6rqbhG5B6hX1U3AA8DDItIAdBL4MAh5N9CoqodjX3xjjDETiWqZYlXdDGwes+3usMdDwE3jvPYF4IqpF9EYY8x02MxYY4xJcxb0xhiT5izojTEmzVnQG2NMmrOgN8aYNGdBb4wxac6C3hhj0pwFvTHGpDkLemOMSXMW9MYYk+Ys6I0xJs1Z0BtjTJqzoDfGmDRnQW+MMWnOgt4YY9KcBb0xxqQ5C3pjjElzFvTGGJPmLOiNMSbNWdAbY0yas6A3xpg0F1XQi8h6EdkvIg0icleE/W4ReTy4v05EasL2XSwir4rIbhHZKSJZsSu+McaYiUwY9CLiBO4DrgOWA7eIyPIxh90OdKnqIuBbwL3B17qAnwGfU9ULgfcAozErvTHGmAlFU6NfAzSo6mFVHQEeAzaMOWYD8FDw8RPAOhER4P3ADlXdDqCqHarqi03RjTHGRCOaoK8EGsOeNwW3RTxGVb2ABygFlgAqIltE5A0R+ftIv0BE7hCRehGpb2trm+w5GGOMOYd4d8a6gHcCnwj++RERWTf2IFW9X1VXq+rq8vLyOBfJGGPOL9EEfTMwL+x5VXBbxGOC7fKFQAeB2v9LqtquqgPAZuDS6RbaGGNM9KIJ+q3AYhGpFZFMYCOwacwxm4Dbgo9vBJ5TVQW2ABeJSE7wA+BqYE9sim6MMSYarokOUFWviNxJILSdwIOqultE7gHqVXUT8ADwsIg0AJ0EPgxQ1S4R+SaBDwsFNqvqb+J0LsYYYyKYMOgBVHUzgWaX8G13hz0eAm4a57U/IzDE0hhjTALYzFhjjElzFvTGGJPmLOiNMSbNWdAbY0yas6A3xpg0Z0FvjDFpzoLeGGPSnAW9McakOQt6Y4xJcxb0xhiT5izojTEmzVnQG2NMmrOgN8aYNGdBb4wxac6C3hhj0pwFvTHGpDkLemOMSXMW9MYYk+aiupWgMYmgqvQMeRNdDGNSntXoTdJ6escJvr5lH229w4kuijEpLaqgF5H1IrJfRBpE5K4I+90i8nhwf52I1AS314jIoIi8Ffz5YWyLb9LVtmOdvHq4A7/CCc9gootjTEqbsOlGRJzAfcC1QBOwVUQ2qeqesMNuB7pUdZGIbATuBW4O7jukqpfEuNwmjR3vHOCpt1oozsmga2CUjv6RRBfJmJQWTY1+DdCgqodVdQR4DNgw5pgNwEPBx08A60REYldMc77oGRrlkbpjFGS52Hh5NQAdfRb0xkxHNEFfCTSGPW8Kbot4jKp6AQ9QGtxXKyJvisiLIvKuSL9ARO4QkXoRqW9ra5vUCZj08tbxbnqHvHzyivmU57sB6OizNnpjpiPenbEngGpVXQV8CXhURArGHqSq96vqalVdXV5eHucimWTWP+LF5RDmFGbjdjlwOYROa7oxZlqiCfpmYF7Y86rgtojHiIgLKAQ6VHVYVTsAVHUbcAhYMt1Cm/Q1OOIjO9MJgIiQ63bRbk03xkxLNEG/FVgsIrUikglsBDaNOWYTcFvw8Y3Ac6qqIlIe7MxFRBYAi4HDsSm6SUeDoz6yM5ynn+e6nXT2W9ONMdMx4agbVfWKyJ3AFsAJPKiqu0XkHqBeVTcBDwAPi0gD0EngwwDg3cA9IjIK+IHPqWpnPE7EpIeBsBo9QJ7bZaNujJmmqGbGqupmYPOYbXeHPR4CborwuieBJ6dZRnMeGRr1UZSdcfp5bqaLVpswZcy02MxYk1QCNfq36x+5bhcd/cOoagJLZUxqs6A3SWVwxEd2xtt/LfPcLoZG/QyM+BJYKmNSmwW9SRojXj8jPv+YGn2gvd6GWBozdRb0Jml4BkcBzuiMzXUHQr/dJk0ZM2UW9CZphII+J3x4ZbB2bzV6Y6bOgt4kDc9gIMzHDq8EW+/GmOmwoDdJo3sg2HSTEaHpxiZNGTNlFvQmaZxuugmr0We6HGRnOOm0Gr0xU2ZBb5JGpBo9QGleps2ONWYaLOhN0gjV6LMyxwR9rgW9MdNhQW+ShmdwlKwMB44x96wpzXPbmvTGTIMFvUka3QMjZzXbAJTkZtrwSmOmwYLeJA3P4Cg5mWevs1eal0lH34itd2PMFFnQm6TRPTgasUZflutmxOend9ibgFIZk/os6E3S8AyOnjFZKqQkNxPAhlgaM0UW9CZpeAYiB31pXiDoO2zSlDFTYkFvkoKqjtt0U5rrBmwZBGOmyoLeJIX+ER8+v54xKzbk7Rq9Bb0xU2FBb5JC90BwQbNxhleCrWBpzFRZ0JukEGkt+pCsDCd5bpetSW/MFFnQm6TgGRg/6OHtsfTGmMmLKuhFZL2I7BeRBhG5K8J+t4g8HtxfJyI1Y/ZXi0ifiPyv2BTbpJvuwcgLmoXY7Fhjpu7saYhjiIgTuA+4FmgCtorIJlXdE3bY7UCXqi4SkY3AvcDNYfu/Cfw2dsU26ebtJYoj/5UszXXT1DVwxrZH645HPPbWtdWxLZwxKS6aGv0aoEFVD6vqCPAYsGHMMRuAh4KPnwDWiQRWphKRG4AjwO7YFNmko/GWKA4py7MavTFTFU3QVwKNYc+bgtsiHqOqXsADlIpIHvAPwD+f6xeIyB0iUi8i9W1tbdGW3aQRz+AomU4HGU6JuD/UdOP323o3xkxWvDtjvwJ8S1X7znWQqt6vqqtVdXV5eXmci2SSkWdwhMKcDEQiB31pnhuvX+kZGp3hkhmT+iZsoweagXlhz6uC2yId0yQiLqAQ6ADWAjeKyL8CRYBfRIZU9XvTLrlJK90DoxRmZ4y7vzQ4lr69b4SinMyZKpYxaSGaoN8KLBaRWgKBvhG4dcwxm4DbgFeBG4HnNLCm7LtCB4jIV4A+C3kTiWdwlKJzBP2iWXkA7GjqPv3YGBOdCZtugm3udwJbgL3AL1R1t4jcIyLXBw97gECbfAPwJeCsIZjGnMtENfrlcwooy3Pzwn7rwzFmsqKp0aOqm4HNY7bdHfZ4CLhpgvf4yhTKZ84TnsFRls3JH3e/wyG8e0kZz+9rxedXnI7IbfnGmLPZzFiTFAJNN+due796STldA6PsbPbMUKmMSQ8W9CbhRn1++oa952y6AXj34nJE4EVrvjFmUizoTcL1BGfFFuWcO+iLczNZWVXECwdaZ6JYxqQNC3qTcKF1biaq0UOg+WZ7YzddNkvWmKhZ0JuEC61zUzhBjR7g6qXl+BVebmiPd7GMSRtRjboxySHSIl7psIBXaIniouwMTnQPnfPYlVVFFOVk8OKBNi6tLp6J4hmT8qxGbxKuezDQDBNN043TIbxrcTkvHmjDr7bujTHRsKA3CXe6Rh/l0gZXLymnrXeY5/e1Muz1xbNoxqQFC3qTcKHO2IKs6FoSr1sxm3XLZvHsvla+vmU/L+5vtdq9MedgbfQm4Tr7RyjIcuFyRlfvyHW7eODPL+fe3+7jmb2n2LLnFCV5bi6qLIxzSWPDbphiZprV6E3CneoZoqIga9Kvm1eSwyevmA9gNw435hws6E3CtfYOM6vAPaXXZjgd5LlddA/YuHpjxmNBbxKutWeYWfmTr9GHFOVk0DVgNyQxZjwW9CahVJW23mFm5U+tRg9QnJNpM2WNOQcLepNQnsFRRnx+Zk2hjT6kKCcDz+CojbwxZhwW9CahTvUEOlGnW6P3+pW+YW+simVMWrGgNwnV2htY8mA6QR9a9bLb2umNiciC3iRUa6hGP42mm+LgjNouG3ljTEQW9CahWnun33RjNXpjzs2C3iRUa+8QuZlOct1Tn6TtdjnJyXRajd6YcUQV9CKyXkT2i0iDiNwVYb9bRB4P7q8TkZrg9jUi8lbwZ7uIfCS2xTeprrVneEqzYscqzsm0SVPGjGPCoBcRJ3AfcB2wHLhFRJaPOex2oEtVFwHfAu4Nbt8FrFbVS4D1wH+IiK2vY05r7R2ifBrNNiE2acqY8UVTo18DNKjqYVUdAR4DNow5ZgPwUPDxE8A6ERFVHVDV0Ji3LMAGOpszBJY/iF2NXm0svTFniSboK4HGsOdNwW0RjwkGuwcoBRCRtSKyG9gJfC4s+E8TkTtEpF5E6tva2iZ/FiYlqWpw+YPY1OhHfUr/iK1Pb8xYce+MVdU6Vb0QuBz4soicVX1T1ftVdbWqri4vL493kUyS6Bv2Mjjqi0nQh4ZYWju9MWeLJuibgXlhz6uC2yIeE2yDLwQ6wg9Q1b1AH7BiqoU16SU0KzYWnbGhIZbWTm/M2aIJ+q3AYhGpFZFMYCOwacwxm4Dbgo9vBJ5TVQ2+xgUgIvOBZcDRmJTcpLxYzIoNsRq9MeObcASMqnpF5E5gC+AEHlTV3SJyD1CvqpuAB4CHRaQB6CTwYQDwTuAuERkF/MBfq2p7PE7EpJ620GSpKa5FHy4rw0lWhsPG0hsTQVRDHVV1M7B5zLa7wx4PATdFeN3DwMPTLKNJU6HlD8qnsRZ9uMDIG2u6MWYsmxlrEqa1dwi3yxH1TcEnUpSTaTV6YyKwoDcJ09obmBUrIjF5v+LgpCkbS2/MmSzoTcKc6hmKSUdsSFFOJiNeP55Ba74xJpwFfQra0dTNwVO9iS7GtE3npuCRFAeHWDZ1DcbsPY1JBxb0KaZ3aJQntjXxzN5TiS7KtLVN86bgY4WGWFrQG3MmC/oU80pDB16/cqp3OKXvkTo44qN32BuTBc1CQkHf2DkQs/c0Jh1Y0KeQwREfdUc6cLscgbboFB5KGJosFYtZsSHZmYF16Q+398fsPePFr8qvt7ews9mT6KKY84AFfQp57UgHw14/H7hwNhDozExVsbgpeCRleW6OtPfF9D3joXtglFcPd/Dz14/z210nUvrbmUl+FvQpYmDEyysN7SytyOeSeUVAagf96eUPYtgZC6GgT/4afXtf4INuQXkufzzYzk/+dDSlv6GZ5GZBnyIee72RgREf71laTlaGk8LsDE4FlxBIRadvCh7DzliAsrxMTvUM0z981mrYSSW0/MPGy6v56KpKDrf18YMXDyW4VCZdWdCniEfqjjG/NIf5pbkAVBS4OelJ5Rr9MBlOOT0kMlbK8gLfEJK9Vt/eN0xWhoPcTCera0qYU5jN7hZrrzfxYUGfArw+P0c7BqgNhjzA7IIs2vqGGfX5E1iyqTvS3kdlUXbMZsWGpFLQl+e5T59/RYGb/SdTf26ESU4W9CnghGcIn18pzs08va2iIAufXznWkdyBFomqsvVoF5fNL4n5e5fmBf4fJX/Qj5z+UILA9WztHaar39bqMbFnQZ8CQuPCQ+PE4e1hiftPJv8Ik7EOtfXR2T/C2trYB32G00FlUXZSB31omYay/DODHuBAGsx4NsnHgj4FNHYFgr4krEZfnu9GgP0pGAyvH+kCYE0cgh6gtiw3qcfSh0bcjK3RgwW9iQ8L+hTQ2DmI0yEUZr/dcZnhdFCa52b/yZ4ElmxqXj/SQXm+m/mlOXF5/9qyXI609SXtKpZtwaAvDwv6giwXBVku9lk7vYkDC/oU0Ng1wJzCLJyOMzsuKwrcHDiVWk03qkrdkU7W1JbEvCM2pLYsl54hL51J2t7d3juM8HZ/AoCIsHR2vtXoTVzE5o4PJq4aOweYV3x27beiIIvn97cyNOojK8OZgJJNXlPXICc8QzhEeLTueFx+R215YHTSkfZ+SvNiOyErFtr6hinKySDDeWY9a0lFPr/e3oKqxu1D0JyfLOhTQGPXIO9dWn7W9oqCLFShobWPFZWFCSjZ5G092glwxlDRiUz2A2FBWeC9D7f3s7rm7X6ASO9z69rqSb13LHSMGXETsnR2Po/UeTnVM8zswthOJDPnN2u6SXJDoz7aeocj1uhnnx55kzpf918/0klhdkbMlz4IV1mUTYZTknLkjarS1jccMeiXVOQDqdnBbpKbBX2SawqOuJlXcnbQl+RmkulypFQwvH6kk8trinHEsWnC5XRQXZLDkbbkC/rW3mFGvP4zhlaGLA0FfQp2sJvkFlXQi8h6EdkvIg0icleE/W4ReTy4v05EaoLbrxWRbSKyM/jnNbEtfvo73hkK+uyz9jkdwqLyPPaeSI1gaOsd5nB7f9yGVYarLctLyhr9obZA53l5hBp9cW4ms/LdKTk3wiS3CdvoRcQJ3AdcCzQBW0Vkk6ruCTvsdqBLVReJyEbgXuBmoB34sKq2iMgKYAtQGeuTSGeNnYG7Jc0ryYkYAGsXlPDIa8fpHhihKGxC1Xjt2olokw4Jtc+vqS1lT0t8P5wWlOfy0sE2/H7F4Uiejs3DwW8ZZWEjbsLZyBsTD9F0xq4BGlT1MICIPAZsAMKDfgPwleDjJ4DviYio6pthx+wGskXEraqpu+ziDGvsHCArwxGxBgjwsUur+PErR/n19hY+dWXNzBZukl4/0kl2hpML5xbEPehry3IZ8fpp8QxSFaF/I1EOt/WT4RQKsiMv5rakIp9H6o7h8ytOx/gjkxL5gW1STzRNN5VAY9jzJs6ulZ8+RlW9gAcoHXPMx4A3IoW8iNwhIvUiUt/W1hZt2c8LjV0DVBXnjDvc7sK5BSybnc8T25pmuGSTo6o8u+8UaxeUnDWsMB5qy94eYplMjrT3UZbnHrePYmlFPkOjfrsdoompGemMFZELCTTnfDbSflW9X1VXq+rq8vKzhxGezxo7B5lXfHb7fIiIcONlVWxv8nAwCb/yP1p3nEfrjvON3x+gsXOQkpzMuI2fDxcaYnkwySaUHW7vjzjiJmTJ7ECHrM2QNbEUTdA3A/PCnlcFt0U8RkRcQCHQEXxeBfwK+LSq2p0VJqmxayDiiJtwN6yqxOUQnngjeWv1u5o9OASWzymYkd9Xnu9maUU+P/rjYfqS5CYkw14fjZ0D5wz6xbPygNQaMmuSXzRBvxVYLCK1IpIJbAQ2jTlmE3Bb8PGNwHOqqiJSBPwGuEtVX4lVoc8XnoFReoe8EcfQhyvLc/OepeX86o1mvEm4Pr2qsqvFQ21ZLjnumZmjJyL8y0cv4kTPEP+2Zf8Z+072DNE7NPO37TvS3o9fAx9C48l1u7iospCHXj3K8Q5rvjGxMWHQB9vc7yQwYmYv8AtV3S0i94jI9cHDHgBKRaQB+BIQGoJ5J7AIuFtE3gr+zIr5WaSpxq7xh1aOdeNlVbT2DvPHhnYgsBTusNcX1/JF61TvMO19IzM+e/ey+cV86or5PPTqUd483oWq8tKBNr777EEe29o44etjLdQBPWeCWa/fuWUVPr/ymYe2MjSaHNfQpLaoqlequhnYPGbb3WGPh4CbIrzuq8BXp1nG81ZoDH00o0auWVZBcU4G//TULlwO4VjHAAXZGfzdB5bGdXJSNHY3exBmrtkm3N99YCm/332KL/9yJ5kuBzuaPJTkZnKkvZ+W7sEZLcvulh7cLsc5m24g0JH8w09exqceqOPnrx/n01fWnLWgnTGTYTNjk1ho5EV1FMv5ZrocfPbqhbhdDi6YU8CKykI8g6M0d81smEWyu6WH+aU55GfF9v6w0cjPyuD/3rCCfSd72dnk4QPLK/j8exaR6XTwp0PtM1qWPS09LJtTEFVoX7mwlP/3kRUcbO3jqbea8SfpkssmNdiiZkmssWuAwuwMCqIMyM9dvZDPXb0QgP986TC7mj3sP9U7YWduPLX3DnOyZ4g/u3jOjP3OSKN6rl85l7I8N4uCnZ2rqouoP9ZFW+/wOdvMY0VV2XOihw9eFP3/h5svr2bL7lM8t68Vv1/52GVVCf92ZlKT1eiTWGPnYFTt85Hkul1UFWcnfJblrhYPABfOTezqmlcsKD0d8gDvWFiGz68zMtQToMUzhGdwlOVzJ9d89b4LKnjfBRW82djN41sb8fmtZm8mz4I+iTV2RV6HPlpLKvJp7hqkP4HDC3e1eJhXnH3G3bGSQXm+myUVeTz82rEZ6bQOdcROpZ/immWzWH/hbHY2e3h6R0usi2bOAxb0SWrE66epc5D5k1i3fawlFfkocLA1MZOGGjsHaOkeStq18q9aWEZ73zC/2XEi7r9rd4sHEbhgTv6UXv/uJeWsrCpkZ7MnaW+RaJKXBX2S2neyhxGfn4urph6SlcXZ5GQ6E9Z889tdgQBNdLPNeBbNymNBWS6/fGPs/L/Y29PSE5hHkDn1brEF5XkMjPhO33PWmGhZ0Cep7Y3dANMKeocIi2flcfBUb0JGbWzeeZLKomxKciOv1JhoIsKVC0vZ3tiNP85t33tO9Ex7eGnoZuo2kcpMlgV9knqr0UNZXiaVRVPrjA1ZUpFP/4hvxseMt3QP8lZjNxdOsvNxpq2sKqJ32MvRjvgtfuYZHKWpa3DSHbFjlee5ycl0ctSC3kySBX2S2tHUzcVVRdO+SfTiinyEmb893e92nQRgRZI224RcFPzGtKPJE7ffEboxzHRr9CLC/JIcjsXxQ8mkJwv6JNQ7NEpDWx8rq4qm/V55bheVxdkcmOFFsn676wTLZudHvGVeMlk8K4+sDAfbm7rj9jt2B0fcxKKvYn5pLh39I7RbO72ZBAv6JBQYWQEr58WmNrykIp+mrkEGZmiYZWvPEPXHuiY1OShRXE4HK+YWxrVGv6elh/J8d0wmZoXa6euPdk37vcz5w4I+CYVC5+IY1OghcDOLmRxmuWX3SVThuhWzZ+T3TdfFVUXsbvHEbeXPWHTEhlQWZeNyCNuOdcbk/cz5wYI+CW1v7Ka6JCdmo1VCwyxnqp1+886TLJqVx+KKqY0Zn2kr5xUyNOrnQBxuUjLi9dPQ2jvtjtgQl9NBZVE29cesRm+iZ0GfhHY0eVg5Lza1eQgMs1xSEbjpdLyHEbb2DPHakY6UaLYJuSg4oWtnc+zb6bce7WTUpzHtlJ5fmsuuZo8tYWyiZkGfZFp7h2juHmTlNMbPR7KkIp+BER87muPXFg2weecJVOHDM7iI2XTVlOaSn+Vie4zb6VWVb/3hABUFbtZdELvbMMwvzWHUp6fnWhgzEQv6JLOjMRA2sazRAyyZlYcAz+9rjen7hnu07jgPvnKU2QVZbD3aNWMLhk2XwyFcXFXIjhiPvHnhQBv1x7q485rFZGU4Y/a+84OrkVrzjYmWBX2S2dHUjUOI+USjnOBqli8caIvp+4brHhjheOfAtGbzJsrFVUXsO9Ebs+YQVeUbv99PVXE2N6+eN/ELJiHH7WLRrDzqj1qHrImOrUefZN5q8rCkIn9aa6KMZ+nsfJ7d10pH3zClY+5yFKn2feva6km9/85gs9BFSbqI2blcXFmI16/sPdHDquriab/f73adZFdzDzdeVsUT22J/0/YrFpTw5LZmBkd8ZGfG7tuCSU9Wo08iPr+yo6mbS2LcbBOytKIAVXjpYHxq9TuaPFQVZ5/1IZIKLg7+P98Zgz4Mn1/5xh8OUJ7vjtu1/OCKOQyO+nh+f/ya4kz6sKBPIk/vaKF7YJT3LC2Py/vPKcqiLM/N8/tiH/RH2/tp7h5Mydo8wNzCLMryMtneOL2g9/mVf/zVThpa+3jfBRVxuyPUmtoSSnMz+c3O+C+xbFJfVO0DIrIe+DbgBH6kql8bs98N/BS4DOgAblbVoyJSCjwBXA78RFXvjGXh04nPr3zn2YMsrcjn/cvjM9HIIcLVS8p5Zu8pPIOjZ9wMZMTrZ9/JHhbPyp9SU0DohhipGvQiwqrqYl5paMfn1yndjHvU5+dLv9jOr7e38IVrFjG7IGtSr59M57XL6eADK2bzqzes+cZMbMKgFxEncB9wLdAEbBWRTaq6J+yw24EuVV0kIhuBe4GbgSHgn4AVwR8zjqd3tHCorZ/7br2Ux7Y2Rv26yY5s+fjqKjZtb+Yj33+FB2+7nJqyXBpa+/jBiw2c6hnG7XKwtraEqxaVRf2eqsqm7S3ML82hKCc5lySOxkdWVfKHPad46UAb7102ueGQQ6M+7nz0DZ7Z28pd1y3jc1cvjPuoow9dNIdH647zwv5WrkuheQtm5kXTdLMGaFDVw6o6AjwGbBhzzAbgoeDjJ4B1IiKq2q+qLxMIfDMOn1/57nMNLKnIi/uyAWsXlPKz29fS1T/CDd9/hW8/c5Drv/cyvUNePrqqkiUV+fzxYDtf37KfN49HN3zvtcOdHDjVx6Ux6MRMpPddUEFpbiaPbZ1cQN//0mHe/62XeGZvK9evnEtBVsaMDC1dW1tCyZjmm0frjp/1Y0w0QV8JhFcxm4LbIh6jql7AA5RGWwgRuUNE6kWkvq0tfsP/ktVvdp6gobWPL65bjGMKTQaTtXZBKf/9+XdSlufmW88c4MK5BXzhmsWsrinhljXVfOnaJUXXls8AAA5oSURBVLgznPz7Mwejer8fv3KE4pyMuHU8zpRMl4OPXVbFs3tbae2Nrm7S0NrHD188REv3ILeuqeaKBVH/tZ82l9PB+hWzeW5fK4MjNkvWjC8pOmNV9X5VXa2qq8vL49MRmYwerTvOz147xlef3sOsfDfdA6Nxr4GFankvN7Rz65pqbl1TzfUrK89ory/Nc3PVwlJePNDGrglGoTR2DvCHvae4dW01Gc6k+Os0LTdfPg+vX3ly28S3F/xTQzsf/f4rDHv9/OW7FiTk3rgfumgOAyM+XrDRN+YcovmX2QyEz/ioCm6LeIyIuIBCAp2yZgKvH+mktXeYdXEcoTGerAwnKyoLI3Y8XrGglHy3ix+8cOic7/HQn47iFOFTV9TEqZQza2F5HmtqSnh86/Fz3oT7kbpjfPrB16koyOKvr17IvOBs1ZkWar55egZucG5SVzSjbrYCi0WklkCgbwRuHXPMJuA24FXgRuA5tVvVT6hv2Mvv95xkQVkuK5LslntZGU4+deV8fvDiIQ639bGgPO+sY/qHvTxe38h1F81hduHkRpgki0jfoKpLc3j9aCevHe7kyoVnNsV4fX6++pu9/ORPR3nv0nK+c8sqfr09cSHrcjrYcMlcfvzKUdyPv8WFcwttBI45y4RBr6peEbkT2EJgeOWDqrpbRO4B6lV1E/AA8LCINACdBD4MABCRo0ABkCkiNwDvHzNi57y1ZfdJRrx+rl85d9q3DIyHz7yzlgdePsJ/vHiYe2+8+Kz9T77RRO+Ql7+4qmbmCxdHK+YWsmX3SX7w4iFqynKYU5iNqvLCgTa+/OROTvYMcdXCUtZdUJGwkA//gKoty+WaZbN46q1m/rD3FFcvKWfE66d7cBSnCDetrkqLZjUzdVGNo1fVzcDmMdvuDns8BNw0zmtrplG+tLXtWCfbjnXx7sVlzJrkeOuZUpbn5ubL5/Hz14/zhXWLqCp+u3nCMzjKj/54hEvmFaX8aJuxMl0O/vJdC/jmHw7wjq89x5qaEhwivHq4g5LcTG5dU52Q9vjxuBwO3ndBBRfMKeDJbU2nm3GyM5wMjvr4/vOH+Jv3LU5wKU0i2Vo3CeDzK//01G4KslyTHq890+549wL+q76JW/+zjoc+s4baslw8A6N86sE6TngG+dpHL0p0EePii+sWc/3KuWza3sJTbzXTM+jlKx9ejsMhuBzJWTuuLMrm8+9dRPfACPlZGWS6HDy29Tjffe4g1y6viNnNT0zqkWRrSl+9erXW19cnuhhx9bPXjvF/ntrFxsvnxex2gfEQWtTszeNd3P5QParKNz9+Cf/41E5O9QzziTXVLIvRLfJMfPQPe/mPlw5RUZDFU5+/yppw0piIbFPV1ZH22VWfYZ6BUb7x+/2srS1JmeUCVlUX88u/egcF2Rn8xU+2cqpnmE+utZBPBbluF1+9YQW7W3omHEFl0pcF/Qz792cP4Bkc5e4PL0/KDtjx1JTl8su/egc3XlbFp6+cz9LZFvKpYv2KOXx45Vy++9xBGjsHEl0ckwAW9DOoobWXh189xsY11VwYw3uIzpTSPDf/dtNKFs9KjZt+m7f97w8uw6/w01ePJrooJgGsM3aGPPLaMX7yp6O4nEJNaW5KrEGSCmU00ZlTmM36FbN5bGsjf/u+JeS67Z/++cRq9DNk/8leDrb2cc2yCvLsH5lJgM9cVUPvkJdfvhH7O16Z5GZBPwOGRn08vfME5flurpzBRa+MCXdpdTEXVxXykz8dxe9PrtF2Jr4s6GfAAy8fobN/hD+7eM6UbmhhTCyICH9xVQ2H2vr5Y0N7ootjZpAFfZyd8AzyvecaWD6nwDoxTcJ96KK5lOe7+fErRxJdFDODLOjj7F8278OvyofsDkAmCWS6HHxy7Xxe2N/GtmOdiS6OmSEW9HH08sF2fr29hc9evZDi3NS9xZ5JL3/+jhrml+bw2Yff4IRnMNHFMTPAlkCIk87+Ea779kvkuV08/YV38as3J76RhTEz5VTPEA+8fITaslx+8dkrbWnjNGBLIMwwVeUfntxBV/8o37lllf0jMkmnoiCLb2+8hF0tHv7uie02CifNWdDHwSN1x/nDnlP8w3XLUnIGrDk/rLuggr//wDKe3nGCj/3wT7zV2J3oIpk4saabGPvX3+3j/pcOs6A8l09fWTPjtwc0ZjJUlTePd7Nl90l6h71cWl3Ed25Zdca9B0xqOFfTjU3RjKHf7TrBf/7xMHluFx+7tMpC3iQ9EeHS+cVcOLeAFw608XJDO+/5+gtsuKSSv3rPQhbNOvsWkib1WNDHgKry/RcO8fUt+5lXnM0nr5hPflZGootlTNTcGU4+cOFsrlhQSlvvMI++foxfvtnEumWz+MxVtVy5sDSlVls1Z7Kgn4Zhr4/f7DjBj185ys5mDzdcMpdV1cV2cweTsgqzMyjMzuBL1y7l1UMdvHqog2f2trK0Ip9PXjmfDZfMpcAqMSnH2ugnaWjUR92RTp7f18rTO07Q3jfMoll5/OW7avn46nn8/PXGRBfRmJgZ9fnZ0dTN3hO97DnRQ1aGgw9dNJcbVs3ligWlVqlJIudqo7egn8Cw18fOJg91RzqpO9LJ1iOdDI76cDmExbPyuGJhKYvK8+xrrUlrqkpz9yD1R7vY3tTNsNdPVoaD9RfO5p2Ly1lZVciC8jxbyymBph30IrIe+DbgBH6kql8bs98N/BS4DOgAblbVo8F9XwZuB3zAF1V1y7l+VyKDvn/Yy8HWPvaf7GFns4cdTR72nuhh1Bf4fzQr382C8jyWVuSzoDzXajPmvDTi9XOorY89LT0cbu+ja2AUgNxMJ4sr8qkuyaG6JIfK4mxm5bupKMiiLM9NUU4GWRk2pyRepjXqRkScwH3AtUATsFVENqnqnrDDbge6VHWRiGwE7gVuFpHlwEbgQmAu8IyILFFV3/ROafJGvH4GRrz0DXtp7xvhpGeQk54hjnYMcLi9n8NtfTR1vT0d3O1yUFmUzZULSplXkkNNaa7drMEYAuvlXDCngAvmFOBXpb13mKbuQZq6BmnvHeaPB9vwDI4SaQ5WdoaTopwM8rNc5Lld5GcFHgd+MoLbXOS6XeRkOsnOcJKV4STT5SDD6SDDKbgcDpwOweUQnA7B4RCcIjgc4JQztzkdgkMEhxD48zz9xhFNcq0BGlT1MICIPAZsAMKDfgPwleDjJ4DvSaAtYwPwmKoOA0dEpCH4fq/Gpvhv29nk4eb7335bVfCr4lfF59eIf+kAMp0OyvIzKctzs2x2PrMLsqgoyKI4N9OGRxozAYcIswqymFWQxaXVxae3+/xK79AovUNeeoZG6Rv2MjjiY2DEx+CIjyGvj55BL629wwyN+hkeDWwLfXuONwkGvwQfC0Lwv9P7Tx/L5HJgsrERfvj6FXP4xsdXTu4NohBN0FcC4T2MTcDa8Y5RVa+IeIDS4PbXxry2cuwvEJE7gDuCT/tEZH9UpZ+6MuD0gtwH4/zLEuiM80xjdp7p5bw9zz3AN2+e8vvNH29HUrRFqOr9wP0z9ftEpH68tqx0YueZXuw808tMnmc0vYnNwLyw51XBbRGPEREXUEigUzaa1xpjjImjaIJ+K7BYRGpFJJNA5+qmMcdsAm4LPr4ReE4Dw3k2ARtFxC0itcBi4PXYFN0YY0w0Jmy6Cba53wlsITC88kFV3S0i9wD1qroJeAB4ONjZ2kngw4Dgcb8g0PTkBT6fiBE3EcxYM1GC2XmmFzvP9DJzzdXJNmHKGGNMbNmMH2OMSXMW9MYYk+bOq6AXkfUisl9EGkTkrkSXJ1ZEZJ6IPC8ie0Rkt4j8TXB7iYj8QUQOBv8snui9UoGIOEXkTRF5Ovi8VkTqgtf18eCggZQmIkUi8oSI7BORvSJyZTpeTxH5H8G/s7tE5OcikpUO11NEHhSRVhHZFbYt4vWTgO8Ez3eHiFwa6/KcN0EftpTDdcBy4JbgEg3pwAv8T1VdDlwBfD54bncBz6rqYuDZ4PN08DfA3rDn9wLfUtVFQBeBJTlS3beB36nqMmAlgfNNq+spIpXAF4HVqrqCwGCP0BIqqX49fwKsH7NtvOt3HYERiYsJTBz9QawLc94EPWFLOajqCBBayiHlqeoJVX0j+LiXQChUEji/h4KHPQTckJgSxo6IVAEfAn4UfC7ANQSW3oA0OE8RKQTeTWA0G6o6oqrdpOH1JDDyLzs4/yYHOEEaXE9VfYnACMRw412/DcBPNeA1oEhE5sSyPOdT0EdayuGs5RhSnYjUAKuAOqBCVU8Ed50EKhJUrFj6d+DvAX/weSnQrare4PN0uK61QBvw42AT1Y9EJJc0u56q2gz8G3CcQMB7gG2k3/UMGe/6xT2bzqegT3sikgc8CfytqvaE7wtOYEvpsbQi8mdAq6puS3RZ4swFXAr8QFVXAf2MaaZJk+tZTKA2W0tgddtczm7uSEszff3Op6BP6+UYRCSDQMg/oqq/DG4+FfoKGPyzNVHli5GrgOtF5CiBprdrCLRlFwW/+kN6XNcmoElV64LPnyAQ/Ol2Pd8HHFHVNlUdBX5J4Bqn2/UMGe/6xT2bzqegj2Yph5QUbKd+ANirqt8M2xW+NMVtwH/PdNliSVW/rKpVqlpD4Po9p6qfAJ4nsPQGpMd5ngQaRWRpcNM6ArPL0+p6EmiyuUJEcoJ/h0PnmVbXM8x4128T8Ong6JsrAE9YE09sqOp58wN8EDgAHAL+MdHlieF5vZPA18AdwFvBnw8SaL9+lsBKzM8AJYkuawzP+T3A08HHCwisodQA/BfgTnT5YnB+lwD1wWv6FFCcjtcT+GdgH7ALeBhwp8P1BH5OoN9hlMA3tNvHu34ElqS/L5hLOwmMQoppeWwJBGOMSXPnU9ONMcaclyzojTEmzVnQG2NMmrOgN8aYNGdBb4wxac6C3hhj0pwFvTHGpLn/D7M0U1q+YPHKAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.distplot(cross_scores)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here's the distribution for the differences between the first person in our dataset and the others."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x11f7e3b50>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.distplot(diff[0][1:])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Problem 2\n",
"\n",
"Let's implement a stable matching algorithm! We'll match the first half of the survey respondents with the second half."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"n = len(data) // 2\n",
"\n",
"# Compute sorted preferences lists\n",
"prefl = []\n",
"for i in range(n):\n",
" pref = list(range(n))\n",
" pref.sort(key=lambda j: diff[i][j + n])\n",
" prefl.append(pref)\n",
"\n",
"unmatched = list(range(n)) # stack of unengaged askers to match\n",
"current = [0 for _ in range(n)] # current index of each asker in his preference list\n",
"assign = [None for i in range(n)] # provisional assignments\n",
"\n",
"while unmatched:\n",
" a = unmatched.pop()\n",
" b = prefl[a][current[a]]\n",
" current[a] += 1\n",
" if assign[b] is None:\n",
" assign[b] = a\n",
" elif diff[a][b + n] < diff[assign[b]][b + n]:\n",
" unmatched.append(assign[b])\n",
" assign[b] = a\n",
" else:\n",
" unmatched.append(a)\n",
"\n",
"matches = [(j, i + n) for i, j in enumerate(assign)]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"415 ♥ 500 <- Score 3.60\n",
"369 ♥ 501 <- Score 12.40\n",
"347 ♥ 502 <- Score 3.90\n",
"309 ♥ 503 <- Score 8.90\n",
"451 ♥ 504 <- Score 13.10\n",
"322 ♥ 505 <- Score 7.00\n",
"169 ♥ 506 <- Score 13.30\n",
"229 ♥ 507 <- Score 13.75\n",
"84 ♥ 508 <- Score 15.05\n",
"414 ♥ 509 <- Score 15.50\n",
"41 ♥ 510 <- Score 4.50\n",
"434 ♥ 511 <- Score 11.00\n",
"184 ♥ 512 <- Score 12.00\n",
"54 ♥ 513 <- Score 15.60\n",
"496 ♥ 514 <- Score 3.70\n",
"114 ♥ 515 <- Score 7.90\n",
"303 ♥ 516 <- Score 10.40\n",
"298 ♥ 517 <- Score 16.55\n",
"442 ♥ 518 <- Score 3.70\n",
"452 ♥ 519 <- Score 34.20\n",
"263 ♥ 520 <- Score 10.40\n",
"364 ♥ 521 <- Score 6.70\n",
"315 ♥ 522 <- Score 2.60\n",
"396 ♥ 523 <- Score 13.20\n",
"480 ♥ 524 <- Score 15.95\n",
"277 ♥ 525 <- Score 10.00\n",
"423 ♥ 526 <- Score 4.50\n",
"38 ♥ 527 <- Score 7.80\n",
"317 ♥ 528 <- Score 2.30\n",
"89 ♥ 529 <- Score 15.20\n",
"71 ♥ 530 <- Score 7.50\n",
"127 ♥ 531 <- Score 9.50\n",
"313 ♥ 532 <- Score 14.00\n",
"377 ♥ 533 <- Score 11.40\n",
"96 ♥ 534 <- Score 15.25\n",
"221 ♥ 535 <- Score 12.50\n",
"246 ♥ 536 <- Score 8.20\n",
"235 ♥ 537 <- Score 14.30\n",
"360 ♥ 538 <- Score 7.10\n",
"1 ♥ 539 <- Score 13.20\n",
"214 ♥ 540 <- Score 13.30\n",
"308 ♥ 541 <- Score 3.90\n",
"29 ♥ 542 <- Score 10.10\n",
"104 ♥ 543 <- Score 12.40\n",
"135 ♥ 544 <- Score 2.40\n",
"231 ♥ 545 <- Score 7.10\n",
"383 ♥ 546 <- Score 40.00\n",
"489 ♥ 547 <- Score 9.70\n",
"428 ♥ 548 <- Score 14.10\n",
"398 ♥ 549 <- Score 14.10\n",
"462 ♥ 550 <- Score 8.00\n",
"316 ♥ 551 <- Score 13.30\n",
"73 ♥ 552 <- Score 1.70\n",
"420 ♥ 553 <- Score 34.20\n",
"122 ♥ 554 <- Score 4.60\n",
"454 ♥ 555 <- Score 14.80\n",
"430 ♥ 556 <- Score 13.80\n",
"444 ♥ 557 <- Score 14.15\n",
"266 ♥ 558 <- Score 17.00\n",
"336 ♥ 559 <- Score 1.80\n",
"438 ♥ 560 <- Score 11.30\n",
"240 ♥ 561 <- Score 1.20\n",
"441 ♥ 562 <- Score 3.30\n",
"47 ♥ 563 <- Score 1.80\n",
"251 ♥ 564 <- Score 14.00\n",
"15 ♥ 565 <- Score 2.50\n",
"68 ♥ 566 <- Score 8.00\n",
"245 ♥ 567 <- Score 11.90\n",
"130 ♥ 568 <- Score 12.10\n",
"493 ♥ 569 <- Score 15.75\n",
"216 ♥ 570 <- Score 12.90\n",
"109 ♥ 571 <- Score 12.20\n",
"417 ♥ 572 <- Score 6.00\n",
"463 ♥ 573 <- Score 12.85\n",
"160 ♥ 574 <- Score 15.70\n",
"152 ♥ 575 <- Score 16.00\n",
"170 ♥ 576 <- Score 3.00\n",
"375 ♥ 577 <- Score 8.40\n",
"337 ♥ 578 <- Score 2.00\n",
"473 ♥ 579 <- Score 9.50\n",
"79 ♥ 580 <- Score 15.60\n",
"234 ♥ 581 <- Score 14.50\n",
"171 ♥ 582 <- Score 2.20\n",
"267 ♥ 583 <- Score 12.60\n",
"87 ♥ 584 <- Score 14.30\n",
"381 ♥ 585 <- Score 4.10\n",
"271 ♥ 586 <- Score 15.70\n",
"37 ♥ 587 <- Score 11.40\n",
"91 ♥ 588 <- Score 6.70\n",
"63 ♥ 589 <- Score 13.85\n",
"259 ♥ 590 <- Score 11.20\n",
"356 ♥ 591 <- Score 6.60\n",
"380 ♥ 592 <- Score 4.60\n",
"349 ♥ 593 <- Score 14.70\n",
"385 ♥ 594 <- Score 2.60\n",
"7 ♥ 595 <- Score 12.65\n",
"136 ♥ 596 <- Score 16.65\n",
"88 ♥ 597 <- Score 11.45\n",
"472 ♥ 598 <- Score 15.60\n",
"163 ♥ 599 <- Score 15.60\n",
"426 ♥ 600 <- Score 9.20\n",
"74 ♥ 601 <- Score 57.00\n",
"484 ♥ 602 <- Score 13.50\n",
"445 ♥ 603 <- Score 3.30\n",
"351 ♥ 604 <- Score 3.30\n",
"197 ♥ 605 <- Score 7.00\n",
"327 ♥ 606 <- Score 11.60\n",
"65 ♥ 607 <- Score 12.60\n",
"21 ♥ 608 <- Score 11.90\n",
"388 ♥ 609 <- Score 7.50\n",
"249 ♥ 610 <- Score 15.20\n",
"76 ♥ 611 <- Score 15.85\n",
"278 ♥ 612 <- Score 5.50\n",
"306 ♥ 613 <- Score 5.60\n",
"400 ♥ 614 <- Score 15.70\n",
"8 ♥ 615 <- Score 12.30\n",
"64 ♥ 616 <- Score 2.50\n",
"272 ♥ 617 <- Score 14.60\n",
"23 ♥ 618 <- Score 13.80\n",
"172 ♥ 619 <- Score 7.10\n",
"276 ♥ 620 <- Score 0.90\n",
"43 ♥ 621 <- Score 5.00\n",
"329 ♥ 622 <- Score 4.60\n",
"436 ♥ 623 <- Score 12.10\n",
"340 ♥ 624 <- Score 17.00\n",
"16 ♥ 625 <- Score 11.75\n",
"72 ♥ 626 <- Score 14.50\n",
"358 ♥ 627 <- Score 12.40\n",
"123 ♥ 628 <- Score 3.40\n",
"208 ♥ 629 <- Score 58.50\n",
"284 ♥ 630 <- Score 14.10\n",
"158 ♥ 631 <- Score 12.20\n",
"302 ♥ 632 <- Score 11.60\n",
"5 ♥ 633 <- Score 4.20\n",
"409 ♥ 634 <- Score 12.30\n",
"460 ♥ 635 <- Score 10.00\n",
"413 ♥ 636 <- Score 2.60\n",
"157 ♥ 637 <- Score 11.90\n",
"352 ♥ 638 <- Score 3.60\n",
"477 ♥ 639 <- Score 9.40\n",
"178 ♥ 640 <- Score 9.50\n",
"296 ♥ 641 <- Score 15.40\n",
"150 ♥ 642 <- Score 13.50\n",
"77 ♥ 643 <- Score 14.40\n",
"215 ♥ 644 <- Score 12.10\n",
"412 ♥ 645 <- Score 15.20\n",
"55 ♥ 646 <- Score 15.50\n",
"146 ♥ 647 <- Score 2.20\n",
"422 ♥ 648 <- Score 11.70\n",
"224 ♥ 649 <- Score 10.20\n",
"468 ♥ 650 <- Score 6.50\n",
"382 ♥ 651 <- Score 8.80\n",
"455 ♥ 652 <- Score 7.70\n",
"379 ♥ 653 <- Score 11.50\n",
"433 ♥ 654 <- Score 3.10\n",
"180 ♥ 655 <- Score 3.20\n",
"134 ♥ 656 <- Score 9.10\n",
"128 ♥ 657 <- Score 14.10\n",
"397 ♥ 658 <- Score 13.75\n",
"469 ♥ 659 <- Score 3.60\n",
"212 ♥ 660 <- Score 3.60\n",
"107 ♥ 661 <- Score 10.90\n",
"482 ♥ 662 <- Score 4.70\n",
"456 ♥ 663 <- Score 12.30\n",
"427 ♥ 664 <- Score 12.65\n",
"475 ♥ 665 <- Score 15.20\n",
"48 ♥ 666 <- Score 5.70\n",
"120 ♥ 667 <- Score 4.90\n",
"156 ♥ 668 <- Score 8.50\n",
"370 ♥ 669 <- Score 7.40\n",
"162 ♥ 670 <- Score 0.70\n",
"151 ♥ 671 <- Score 20.00\n",
"332 ♥ 672 <- Score 5.20\n",
"321 ♥ 673 <- Score 11.40\n",
"200 ♥ 674 <- Score 7.50\n",
"124 ♥ 675 <- Score 12.30\n",
"237 ♥ 676 <- Score 3.10\n",
"145 ♥ 677 <- Score 9.70\n",
"132 ♥ 678 <- Score 2.50\n",
"49 ♥ 679 <- Score 2.30\n",
"154 ♥ 680 <- Score 2.90\n",
"95 ♥ 681 <- Score 2.10\n",
"97 ♥ 682 <- Score 16.00\n",
"204 ♥ 683 <- Score 10.60\n",
"147 ♥ 684 <- Score 12.10\n",
"67 ♥ 685 <- Score 10.40\n",
"418 ♥ 686 <- Score 8.00\n",
"194 ♥ 687 <- Score 15.70\n",
"116 ♥ 688 <- Score 13.00\n",
"424 ♥ 689 <- Score 2.60\n",
"282 ♥ 690 <- Score 13.80\n",
"264 ♥ 691 <- Score 2.10\n",
"404 ♥ 692 <- Score 6.40\n",
"22 ♥ 693 <- Score 13.50\n",
"290 ♥ 694 <- Score 10.60\n",
"60 ♥ 695 <- Score 15.30\n",
"193 ♥ 696 <- Score 10.40\n",
"320 ♥ 697 <- Score 3.90\n",
"2 ♥ 698 <- Score 2.20\n",
"225 ♥ 699 <- Score 4.10\n",
"408 ♥ 700 <- Score 13.80\n",
"40 ♥ 701 <- Score 10.60\n",
"201 ♥ 702 <- Score 8.80\n",
"9 ♥ 703 <- Score 17.00\n",
"217 ♥ 704 <- Score 0.90\n",
"117 ♥ 705 <- Score 1.70\n",
"182 ♥ 706 <- Score 12.20\n",
"106 ♥ 707 <- Score 7.20\n",
"466 ♥ 708 <- Score 13.60\n",
"190 ♥ 709 <- Score 26.10\n",
"227 ♥ 710 <- Score 14.45\n",
"325 ♥ 711 <- Score 12.40\n",
"191 ♥ 712 <- Score 4.30\n",
"195 ♥ 713 <- Score 16.65\n",
"14 ♥ 714 <- Score 12.50\n",
"159 ♥ 715 <- Score 11.90\n",
"476 ♥ 716 <- Score 1.50\n",
"372 ♥ 717 <- Score 5.50\n",
"98 ♥ 718 <- Score 10.10\n",
"129 ♥ 719 <- Score 13.60\n",
"33 ♥ 720 <- Score 5.20\n",
"331 ♥ 721 <- Score 8.60\n",
"85 ♥ 722 <- Score 16.00\n",
"478 ♥ 723 <- Score 1.60\n",
"161 ♥ 724 <- Score 10.30\n",
"376 ♥ 725 <- Score 11.20\n",
"149 ♥ 726 <- Score 10.00\n",
"458 ♥ 727 <- Score 3.80\n",
"31 ♥ 728 <- Score 12.00\n",
"188 ♥ 729 <- Score 10.10\n",
"357 ♥ 730 <- Score 8.30\n",
"44 ♥ 731 <- Score 12.90\n",
"236 ♥ 732 <- Score 7.50\n",
"252 ♥ 733 <- Score 4.10\n",
"219 ♥ 734 <- Score 15.10\n",
"384 ♥ 735 <- Score 13.40\n",
"25 ♥ 736 <- Score 13.10\n",
"189 ♥ 737 <- Score 9.80\n",
"205 ♥ 738 <- Score 3.70\n",
"386 ♥ 739 <- Score 13.25\n",
"42 ♥ 740 <- Score 13.80\n",
"292 ♥ 741 <- Score 14.90\n",
"497 ♥ 742 <- Score 1.50\n",
"142 ♥ 743 <- Score 16.75\n",
"294 ♥ 744 <- Score 13.80\n",
"350 ♥ 745 <- Score 14.90\n",
"211 ♥ 746 <- Score 10.00\n",
"101 ♥ 747 <- Score 0.40\n",
"139 ♥ 748 <- Score 13.30\n",
"186 ♥ 749 <- Score 16.05\n",
"310 ♥ 750 <- Score 14.25\n",
"35 ♥ 751 <- Score 5.40\n",
"323 ♥ 752 <- Score 15.00\n",
"318 ♥ 753 <- Score 3.60\n",
"431 ♥ 754 <- Score 1.60\n",
"248 ♥ 755 <- Score 13.30\n",
"196 ♥ 756 <- Score 2.00\n",
"17 ♥ 757 <- Score 8.90\n",
"164 ♥ 758 <- Score 14.65\n",
"93 ♥ 759 <- Score 10.50\n",
"342 ♥ 760 <- Score 10.20\n",
"133 ♥ 761 <- Score 16.00\n",
"335 ♥ 762 <- Score 6.70\n",
"202 ♥ 763 <- Score 1.50\n",
"465 ♥ 764 <- Score 7.70\n",
"492 ♥ 765 <- Score 9.80\n",
"449 ♥ 766 <- Score 8.50\n",
"287 ♥ 767 <- Score 7.00\n",
"274 ♥ 768 <- Score 7.20\n",
"82 ♥ 769 <- Score 8.30\n",
"115 ♥ 770 <- Score 15.65\n",
"92 ♥ 771 <- Score 37.30\n",
"288 ♥ 772 <- Score 12.50\n",
"222 ♥ 773 <- Score 1.30\n",
"83 ♥ 774 <- Score 15.60\n",
"253 ♥ 775 <- Score 5.80\n",
"19 ♥ 776 <- Score 12.90\n",
"168 ♥ 777 <- Score 5.70\n",
"390 ♥ 778 <- Score 7.00\n",
"243 ♥ 779 <- Score 13.30\n",
"179 ♥ 780 <- Score 14.80\n",
"257 ♥ 781 <- Score 0.40\n",
"471 ♥ 782 <- Score 9.10\n",
"30 ♥ 783 <- Score 8.70\n",
"210 ♥ 784 <- Score 11.90\n",
"479 ♥ 785 <- Score 16.00\n",
"113 ♥ 786 <- Score 4.80\n",
"34 ♥ 787 <- Score 14.60\n",
"261 ♥ 788 <- Score 6.20\n",
"260 ♥ 789 <- Score 14.20\n",
"354 ♥ 790 <- Score 13.60\n",
"108 ♥ 791 <- Score 6.80\n",
"126 ♥ 792 <- Score 13.00\n",
"207 ♥ 793 <- Score 0.80\n",
"166 ♥ 794 <- Score 10.90\n",
"121 ♥ 795 <- Score 13.00\n",
"338 ♥ 796 <- Score 13.10\n",
"256 ♥ 797 <- Score 13.30\n",
"203 ♥ 798 <- Score 11.00\n",
"105 ♥ 799 <- Score 8.00\n",
"393 ♥ 800 <- Score 12.20\n",
"239 ♥ 801 <- Score 18.10\n",
"421 ♥ 802 <- Score 13.90\n",
"90 ♥ 803 <- Score 12.40\n",
"425 ♥ 804 <- Score 16.00\n",
"58 ♥ 805 <- Score 5.40\n",
"362 ♥ 806 <- Score 13.90\n",
"368 ♥ 807 <- Score 14.95\n",
"111 ♥ 808 <- Score 7.40\n",
"401 ♥ 809 <- Score 1.70\n",
"187 ♥ 810 <- Score 2.10\n",
"185 ♥ 811 <- Score 35.55\n",
"459 ♥ 812 <- Score 14.90\n",
"11 ♥ 813 <- Score 1.90\n",
"295 ♥ 814 <- Score 4.50\n",
"280 ♥ 815 <- Score 11.30\n",
"119 ♥ 816 <- Score 11.70\n",
"326 ♥ 817 <- Score 1.80\n",
"39 ♥ 818 <- Score 8.50\n",
"69 ♥ 819 <- Score 14.85\n",
"402 ♥ 820 <- Score 3.70\n",
"206 ♥ 821 <- Score 20.00\n",
"45 ♥ 822 <- Score 5.90\n",
"255 ♥ 823 <- Score 2.10\n",
"485 ♥ 824 <- Score 12.20\n",
"218 ♥ 825 <- Score 7.70\n",
"461 ♥ 826 <- Score 4.20\n",
"24 ♥ 827 <- Score 16.70\n",
"268 ♥ 828 <- Score 5.30\n",
"27 ♥ 829 <- Score 8.20\n",
"213 ♥ 830 <- Score 13.50\n",
"94 ♥ 831 <- Score 16.00\n",
"144 ♥ 832 <- Score 15.35\n",
"279 ♥ 833 <- Score 6.90\n",
"80 ♥ 834 <- Score 13.50\n",
"118 ♥ 835 <- Score 12.70\n",
"228 ♥ 836 <- Score 6.10\n",
"137 ♥ 837 <- Score 1.70\n",
"174 ♥ 838 <- Score 15.60\n",
"258 ♥ 839 <- Score 7.50\n",
"50 ♥ 840 <- Score 14.70\n",
"301 ♥ 841 <- Score 6.40\n",
"183 ♥ 842 <- Score 7.40\n",
"447 ♥ 843 <- Score 12.70\n",
"99 ♥ 844 <- Score 8.20\n",
"344 ♥ 845 <- Score 4.20\n",
"10 ♥ 846 <- Score 6.60\n",
"102 ♥ 847 <- Score 5.90\n",
"419 ♥ 848 <- Score 7.50\n",
"394 ♥ 849 <- Score 11.80\n",
"175 ♥ 850 <- Score 16.60\n",
"138 ♥ 851 <- Score 6.50\n",
"51 ♥ 852 <- Score 7.10\n",
"273 ♥ 853 <- Score 15.30\n",
"192 ♥ 854 <- Score 3.40\n",
"223 ♥ 855 <- Score 11.70\n",
"359 ♥ 856 <- Score 16.00\n",
"311 ♥ 857 <- Score 6.20\n",
"125 ♥ 858 <- Score 7.10\n",
"437 ♥ 859 <- Score 11.30\n",
"70 ♥ 860 <- Score 14.60\n",
"293 ♥ 861 <- Score 2.70\n",
"75 ♥ 862 <- Score 3.70\n",
"328 ♥ 863 <- Score 2.70\n",
"494 ♥ 864 <- Score 6.10\n",
"474 ♥ 865 <- Score 0.80\n",
"403 ♥ 866 <- Score 7.70\n",
"270 ♥ 867 <- Score 4.30\n",
"165 ♥ 868 <- Score 3.90\n",
"140 ♥ 869 <- Score 13.60\n",
"307 ♥ 870 <- Score 1.00\n",
"6 ♥ 871 <- Score 9.40\n",
"483 ♥ 872 <- Score 14.40\n",
"57 ♥ 873 <- Score 15.00\n",
"334 ♥ 874 <- Score 2.70\n",
"209 ♥ 875 <- Score 13.60\n",
"319 ♥ 876 <- Score 2.70\n",
"167 ♥ 877 <- Score 1.10\n",
"269 ♥ 878 <- Score 12.00\n",
"406 ♥ 879 <- Score 15.70\n",
"405 ♥ 880 <- Score 6.20\n",
"244 ♥ 881 <- Score 3.90\n",
"286 ♥ 882 <- Score 3.20\n",
"457 ♥ 883 <- Score 13.20\n",
"392 ♥ 884 <- Score 12.10\n",
"395 ♥ 885 <- Score 9.10\n",
"13 ♥ 886 <- Score 13.10\n",
"429 ♥ 887 <- Score 16.25\n",
"220 ♥ 888 <- Score 3.40\n",
"265 ♥ 889 <- Score 13.65\n",
"32 ♥ 890 <- Score 11.40\n",
"300 ♥ 891 <- Score 10.60\n",
"495 ♥ 892 <- Score 8.70\n",
"148 ♥ 893 <- Score 9.20\n",
"232 ♥ 894 <- Score 13.30\n",
"348 ♥ 895 <- Score 3.90\n",
"112 ♥ 896 <- Score 6.70\n",
"28 ♥ 897 <- Score 11.20\n",
"242 ♥ 898 <- Score 6.30\n",
"103 ♥ 899 <- Score 7.70\n",
"254 ♥ 900 <- Score 13.00\n",
"374 ♥ 901 <- Score 14.00\n",
"78 ♥ 902 <- Score 2.60\n",
"226 ♥ 903 <- Score 2.60\n",
"4 ♥ 904 <- Score 10.80\n",
"241 ♥ 905 <- Score 10.60\n",
"36 ♥ 906 <- Score 1.20\n",
"499 ♥ 907 <- Score 7.40\n",
"373 ♥ 908 <- Score 7.30\n",
"250 ♥ 909 <- Score 10.10\n",
"20 ♥ 910 <- Score 13.70\n",
"230 ♥ 911 <- Score 15.10\n",
"416 ♥ 912 <- Score 11.00\n",
"467 ♥ 913 <- Score 7.20\n",
"481 ♥ 914 <- Score 4.00\n",
"487 ♥ 915 <- Score 6.00\n",
"343 ♥ 916 <- Score 15.70\n",
"378 ♥ 917 <- Score 14.00\n",
"247 ♥ 918 <- Score 11.70\n",
"56 ♥ 919 <- Score 1.20\n",
"339 ♥ 920 <- Score 11.70\n",
"387 ♥ 921 <- Score 14.00\n",
"305 ♥ 922 <- Score 4.80\n",
"3 ♥ 923 <- Score 12.90\n",
"333 ♥ 924 <- Score 10.00\n",
"450 ♥ 925 <- Score 3.70\n",
"181 ♥ 926 <- Score 14.10\n",
"233 ♥ 927 <- Score 15.40\n",
"18 ♥ 928 <- Score 9.40\n",
"59 ♥ 929 <- Score 16.05\n",
"155 ♥ 930 <- Score 3.40\n",
"355 ♥ 931 <- Score 1.20\n",
"464 ♥ 932 <- Score 10.60\n",
"26 ♥ 933 <- Score 1.70\n",
"100 ♥ 934 <- Score 14.40\n",
"281 ♥ 935 <- Score 10.00\n",
"365 ♥ 936 <- Score 13.40\n",
"361 ♥ 937 <- Score 15.40\n",
"371 ♥ 938 <- Score 15.05\n",
"46 ♥ 939 <- Score 9.50\n",
"143 ♥ 940 <- Score 7.40\n",
"314 ♥ 941 <- Score 10.60\n",
"53 ♥ 942 <- Score 4.50\n",
"81 ♥ 943 <- Score 5.10\n",
"0 ♥ 944 <- Score 7.60\n",
"439 ♥ 945 <- Score 5.20\n",
"275 ♥ 946 <- Score 4.10\n",
"61 ♥ 947 <- Score 11.40\n",
"411 ♥ 948 <- Score 11.50\n",
"367 ♥ 949 <- Score 15.00\n",
"262 ♥ 950 <- Score 5.60\n",
"410 ♥ 951 <- Score 9.50\n",
"440 ♥ 952 <- Score 11.05\n",
"198 ♥ 953 <- Score 15.40\n",
"86 ♥ 954 <- Score 13.10\n",
"199 ♥ 955 <- Score 9.00\n",
"177 ♥ 956 <- Score 13.50\n",
"488 ♥ 957 <- Score 11.90\n",
"341 ♥ 958 <- Score 8.30\n",
"366 ♥ 959 <- Score 3.50\n",
"12 ♥ 960 <- Score 12.00\n",
"470 ♥ 961 <- Score 3.00\n",
"432 ♥ 962 <- Score 15.45\n",
"389 ♥ 963 <- Score 4.10\n",
"312 ♥ 964 <- Score 12.20\n",
"399 ♥ 965 <- Score 2.80\n",
"141 ♥ 966 <- Score 2.50\n",
"446 ♥ 967 <- Score 10.40\n",
"391 ♥ 968 <- Score 11.00\n",
"324 ♥ 969 <- Score 14.10\n",
"435 ♥ 970 <- Score 4.80\n",
"453 ♥ 971 <- Score 14.90\n",
"443 ♥ 972 <- Score 16.95\n",
"304 ♥ 973 <- Score 7.20\n",
"52 ♥ 974 <- Score 14.20\n",
"448 ♥ 975 <- Score 13.45\n",
"153 ♥ 976 <- Score 12.90\n",
"486 ♥ 977 <- Score 12.20\n",
"407 ♥ 978 <- Score 6.50\n",
"498 ♥ 979 <- Score 12.90\n",
"285 ♥ 980 <- Score 3.50\n",
"176 ♥ 981 <- Score 10.70\n",
"491 ♥ 982 <- Score 0.50\n",
"131 ♥ 983 <- Score 9.70\n",
"363 ♥ 984 <- Score 16.00\n",
"490 ♥ 985 <- Score 15.75\n",
"283 ♥ 986 <- Score 14.30\n",
"62 ♥ 987 <- Score 4.30\n",
"330 ♥ 988 <- Score 16.00\n",
"297 ♥ 989 <- Score 4.50\n",
"353 ♥ 990 <- Score 14.00\n",
"299 ♥ 991 <- Score 13.00\n",
"66 ♥ 992 <- Score 0.50\n",
"346 ♥ 993 <- Score 10.80\n",
"173 ♥ 994 <- Score 6.90\n",
"110 ♥ 995 <- Score 10.90\n",
"345 ♥ 996 <- Score 7.90\n",
"291 ♥ 997 <- Score 10.40\n",
"238 ♥ 998 <- Score 7.90\n",
"289 ♥ 999 <- Score 15.00\n"
]
}
],
"source": [
"for a, b in matches:\n",
" print(f'{a} ♥ {b} <- Score {diff[a][b]:.2f}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To verify stability, we'll check every pair of matches."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Stable!\n"
]
}
],
"source": [
"for i, (a1, b1) in enumerate(matches):\n",
" for (a2, b2) in matches[i + 1:]:\n",
" if diff[a1][b2] < diff[a1][b1] and diff[b2][a1] < diff[b2][a2]:\n",
" raise Exception(\"returned unstable matching\")\n",
" if diff[b1][a2] < diff[b1][a1] and diff[a2][b1] < diff[a2][b2]:\n",
" raise Exception(\"returned unstable matching\")\n",
"\n",
"print('Stable!')"
]
}
],
"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.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment