{ "cells": [ { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "pi13 = [l.strip() for l in open('advent13.txt').read().splitlines()]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "{'Alice': {'Bob': 54,\n", " 'Carol': -81,\n", " 'David': -42,\n", " 'Eric': 89,\n", " 'Frank': -89,\n", " 'George': 97,\n", " 'Mallory': -94},\n", " 'Bob': {'Alice': 3,\n", " 'Carol': -70,\n", " 'David': -31,\n", " 'Eric': 72,\n", " 'Frank': -25,\n", " 'George': -95,\n", " 'Mallory': 11},\n", " 'Carol': {'Alice': -83,\n", " 'Bob': 8,\n", " 'David': 35,\n", " 'Eric': 10,\n", " 'Frank': 61,\n", " 'George': 10,\n", " 'Mallory': 29},\n", " 'David': {'Alice': 67,\n", " 'Bob': 25,\n", " 'Carol': 48,\n", " 'Eric': -65,\n", " 'Frank': 8,\n", " 'George': 84,\n", " 'Mallory': 9},\n", " 'Eric': {'Alice': -51,\n", " 'Bob': -39,\n", " 'Carol': 84,\n", " 'David': -98,\n", " 'Frank': -20,\n", " 'George': -6,\n", " 'Mallory': 60},\n", " 'Frank': {'Alice': 51,\n", " 'Bob': 79,\n", " 'Carol': 88,\n", " 'David': 33,\n", " 'Eric': 43,\n", " 'George': 77,\n", " 'Mallory': -3},\n", " 'George': {'Alice': -14,\n", " 'Bob': -12,\n", " 'Carol': -52,\n", " 'David': 14,\n", " 'Eric': -62,\n", " 'Frank': -18,\n", " 'Mallory': -17},\n", " 'Mallory': {'Alice': -36,\n", " 'Bob': 76,\n", " 'Carol': -34,\n", " 'David': 37,\n", " 'Eric': 40,\n", " 'Frank': 18,\n", " 'George': 7}}" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# import collections\n", "\n", "# Seating = collections.namedtuple('Seating', ['person', 'neighbour', 'gain'])\n", "\n", "preferences = {}\n", "for line in pi13:\n", " words = line.split()\n", " gain = int(words[3])\n", " if words[2] == 'lose':\n", " gain *= -1\n", " if words[0] not in preferences:\n", " preferences[words[0]] = {}\n", " preferences[words[0]][words[-1][:-1]] = gain\n", "preferences" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def score(seating, prefs):\n", " happiness = 0\n", " for i in range(len(seating)):\n", " l = (i - 1) % len(seating)\n", " r = (i + 1) % len(seating)\n", " happiness += prefs[seating[i]][seating[l]]\n", " happiness += prefs[seating[i]][seating[r]]\n", " #print(i, l, r, ':', seating[i],'->', seating[l], preferences[seating[i]][seating[l]], \n", " # ';', seating[i],'->', seating[r], preferences[seating[i]][seating[r]])\n", " return happiness" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-333" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = list(preferences.keys())\n", "score(list(preferences.keys()), preferences)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "709" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import itertools\n", "\n", "seatings = itertools.permutations(list(preferences.keys()))\n", "\n", "max(score(s, preferences) for s in seatings)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "{'Alice': {'Bob': 54,\n", " 'Carol': -81,\n", " 'David': -42,\n", " 'Eric': 89,\n", " 'Frank': -89,\n", " 'George': 97,\n", " 'Mallory': -94},\n", " 'Bob': {'Alice': 3,\n", " 'Carol': -70,\n", " 'David': -31,\n", " 'Eric': 72,\n", " 'Frank': -25,\n", " 'George': -95,\n", " 'Mallory': 11},\n", " 'Carol': {'Alice': -83,\n", " 'Bob': 8,\n", " 'David': 35,\n", " 'Eric': 10,\n", " 'Frank': 61,\n", " 'George': 10,\n", " 'Mallory': 29},\n", " 'David': {'Alice': 67,\n", " 'Bob': 25,\n", " 'Carol': 48,\n", " 'Eric': -65,\n", " 'Frank': 8,\n", " 'George': 84,\n", " 'Mallory': 9},\n", " 'Eric': {'Alice': -51,\n", " 'Bob': -39,\n", " 'Carol': 84,\n", " 'David': -98,\n", " 'Frank': -20,\n", " 'George': -6,\n", " 'Mallory': 60},\n", " 'Frank': {'Alice': 51,\n", " 'Bob': 79,\n", " 'Carol': 88,\n", " 'David': 33,\n", " 'Eric': 43,\n", " 'George': 77,\n", " 'Mallory': -3},\n", " 'George': {'Alice': -14,\n", " 'Bob': -12,\n", " 'Carol': -52,\n", " 'David': 14,\n", " 'Eric': -62,\n", " 'Frank': -18,\n", " 'Mallory': -17},\n", " 'Mallory': {'Alice': -36,\n", " 'Bob': 76,\n", " 'Carol': -34,\n", " 'David': 37,\n", " 'Eric': 40,\n", " 'Frank': 18,\n", " 'George': 7}}" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# import collections\n", "\n", "# Seating = collections.namedtuple('Seating', ['person', 'neighbour', 'gain'])\n", "\n", "preferences2 = {}\n", "for line in pi13:\n", " words = line.split()\n", " gain = int(words[3])\n", " if words[2] == 'lose':\n", " gain *= -1\n", " if words[0] not in preferences2:\n", " preferences2[words[0]] = {}\n", " preferences2[words[0]][words[-1][:-1]] = gain\n", "preferences2" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "{'Alice': {'Bob': 54,\n", " 'Carol': -81,\n", " 'David': -42,\n", " 'Eric': 89,\n", " 'Frank': -89,\n", " 'George': 97,\n", " 'Mallory': -94,\n", " 'me': 0},\n", " 'Bob': {'Alice': 3,\n", " 'Carol': -70,\n", " 'David': -31,\n", " 'Eric': 72,\n", " 'Frank': -25,\n", " 'George': -95,\n", " 'Mallory': 11,\n", " 'me': 0},\n", " 'Carol': {'Alice': -83,\n", " 'Bob': 8,\n", " 'David': 35,\n", " 'Eric': 10,\n", " 'Frank': 61,\n", " 'George': 10,\n", " 'Mallory': 29,\n", " 'me': 0},\n", " 'David': {'Alice': 67,\n", " 'Bob': 25,\n", " 'Carol': 48,\n", " 'Eric': -65,\n", " 'Frank': 8,\n", " 'George': 84,\n", " 'Mallory': 9,\n", " 'me': 0},\n", " 'Eric': {'Alice': -51,\n", " 'Bob': -39,\n", " 'Carol': 84,\n", " 'David': -98,\n", " 'Frank': -20,\n", " 'George': -6,\n", " 'Mallory': 60,\n", " 'me': 0},\n", " 'Frank': {'Alice': 51,\n", " 'Bob': 79,\n", " 'Carol': 88,\n", " 'David': 33,\n", " 'Eric': 43,\n", " 'George': 77,\n", " 'Mallory': -3,\n", " 'me': 0},\n", " 'George': {'Alice': -14,\n", " 'Bob': -12,\n", " 'Carol': -52,\n", " 'David': 14,\n", " 'Eric': -62,\n", " 'Frank': -18,\n", " 'Mallory': -17,\n", " 'me': 0},\n", " 'Mallory': {'Alice': -36,\n", " 'Bob': 76,\n", " 'Carol': -34,\n", " 'David': 37,\n", " 'Eric': 40,\n", " 'Frank': 18,\n", " 'George': 7,\n", " 'me': 0},\n", " 'me': {'Alice': 0,\n", " 'Bob': 0,\n", " 'Carol': 0,\n", " 'David': 0,\n", " 'Eric': 0,\n", " 'Frank': 0,\n", " 'George': 0,\n", " 'Mallory': 0,\n", " 'me': 0}}" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preferences2['me'] = {other: 0 for other in preferences2}\n", "for other in preferences2:\n", " preferences2[other]['me'] = 0\n", "preferences2" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "668" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seatings = itertools.permutations(list(preferences2.keys()))\n", "\n", "max(score(s, preferences2) for s in seatings)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "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.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }