Done day 15
[advent-of-code-15.git] / advent13.ipynb
1 {
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 5,
6 "metadata": {
7 "collapsed": false,
8 "scrolled": true
9 },
10 "outputs": [],
11 "source": [
12 "pi13 = [l.strip() for l in open('advent13.txt').read().splitlines()]"
13 ]
14 },
15 {
16 "cell_type": "code",
17 "execution_count": 6,
18 "metadata": {
19 "collapsed": false,
20 "scrolled": true
21 },
22 "outputs": [
23 {
24 "data": {
25 "text/plain": [
26 "{'Alice': {'Bob': 54,\n",
27 " 'Carol': -81,\n",
28 " 'David': -42,\n",
29 " 'Eric': 89,\n",
30 " 'Frank': -89,\n",
31 " 'George': 97,\n",
32 " 'Mallory': -94},\n",
33 " 'Bob': {'Alice': 3,\n",
34 " 'Carol': -70,\n",
35 " 'David': -31,\n",
36 " 'Eric': 72,\n",
37 " 'Frank': -25,\n",
38 " 'George': -95,\n",
39 " 'Mallory': 11},\n",
40 " 'Carol': {'Alice': -83,\n",
41 " 'Bob': 8,\n",
42 " 'David': 35,\n",
43 " 'Eric': 10,\n",
44 " 'Frank': 61,\n",
45 " 'George': 10,\n",
46 " 'Mallory': 29},\n",
47 " 'David': {'Alice': 67,\n",
48 " 'Bob': 25,\n",
49 " 'Carol': 48,\n",
50 " 'Eric': -65,\n",
51 " 'Frank': 8,\n",
52 " 'George': 84,\n",
53 " 'Mallory': 9},\n",
54 " 'Eric': {'Alice': -51,\n",
55 " 'Bob': -39,\n",
56 " 'Carol': 84,\n",
57 " 'David': -98,\n",
58 " 'Frank': -20,\n",
59 " 'George': -6,\n",
60 " 'Mallory': 60},\n",
61 " 'Frank': {'Alice': 51,\n",
62 " 'Bob': 79,\n",
63 " 'Carol': 88,\n",
64 " 'David': 33,\n",
65 " 'Eric': 43,\n",
66 " 'George': 77,\n",
67 " 'Mallory': -3},\n",
68 " 'George': {'Alice': -14,\n",
69 " 'Bob': -12,\n",
70 " 'Carol': -52,\n",
71 " 'David': 14,\n",
72 " 'Eric': -62,\n",
73 " 'Frank': -18,\n",
74 " 'Mallory': -17},\n",
75 " 'Mallory': {'Alice': -36,\n",
76 " 'Bob': 76,\n",
77 " 'Carol': -34,\n",
78 " 'David': 37,\n",
79 " 'Eric': 40,\n",
80 " 'Frank': 18,\n",
81 " 'George': 7}}"
82 ]
83 },
84 "execution_count": 6,
85 "metadata": {},
86 "output_type": "execute_result"
87 }
88 ],
89 "source": [
90 "# import collections\n",
91 "\n",
92 "# Seating = collections.namedtuple('Seating', ['person', 'neighbour', 'gain'])\n",
93 "\n",
94 "preferences = {}\n",
95 "for line in pi13:\n",
96 " words = line.split()\n",
97 " gain = int(words[3])\n",
98 " if words[2] == 'lose':\n",
99 " gain *= -1\n",
100 " if words[0] not in preferences:\n",
101 " preferences[words[0]] = {}\n",
102 " preferences[words[0]][words[-1][:-1]] = gain\n",
103 "preferences"
104 ]
105 },
106 {
107 "cell_type": "code",
108 "execution_count": 7,
109 "metadata": {
110 "collapsed": true
111 },
112 "outputs": [],
113 "source": [
114 "def score(seating, prefs):\n",
115 " happiness = 0\n",
116 " for i in range(len(seating)):\n",
117 " l = (i - 1) % len(seating)\n",
118 " r = (i + 1) % len(seating)\n",
119 " happiness += prefs[seating[i]][seating[l]]\n",
120 " happiness += prefs[seating[i]][seating[r]]\n",
121 " #print(i, l, r, ':', seating[i],'->', seating[l], preferences[seating[i]][seating[l]], \n",
122 " # ';', seating[i],'->', seating[r], preferences[seating[i]][seating[r]])\n",
123 " return happiness"
124 ]
125 },
126 {
127 "cell_type": "code",
128 "execution_count": 8,
129 "metadata": {
130 "collapsed": false
131 },
132 "outputs": [
133 {
134 "data": {
135 "text/plain": [
136 "-333"
137 ]
138 },
139 "execution_count": 8,
140 "metadata": {},
141 "output_type": "execute_result"
142 }
143 ],
144 "source": [
145 "s = list(preferences.keys())\n",
146 "score(list(preferences.keys()), preferences)"
147 ]
148 },
149 {
150 "cell_type": "code",
151 "execution_count": 9,
152 "metadata": {
153 "collapsed": false,
154 "scrolled": true
155 },
156 "outputs": [
157 {
158 "data": {
159 "text/plain": [
160 "709"
161 ]
162 },
163 "execution_count": 9,
164 "metadata": {},
165 "output_type": "execute_result"
166 }
167 ],
168 "source": [
169 "import itertools\n",
170 "\n",
171 "seatings = itertools.permutations(list(preferences.keys()))\n",
172 "\n",
173 "max(score(s, preferences) for s in seatings)"
174 ]
175 },
176 {
177 "cell_type": "code",
178 "execution_count": 10,
179 "metadata": {
180 "collapsed": false,
181 "scrolled": true
182 },
183 "outputs": [
184 {
185 "data": {
186 "text/plain": [
187 "{'Alice': {'Bob': 54,\n",
188 " 'Carol': -81,\n",
189 " 'David': -42,\n",
190 " 'Eric': 89,\n",
191 " 'Frank': -89,\n",
192 " 'George': 97,\n",
193 " 'Mallory': -94},\n",
194 " 'Bob': {'Alice': 3,\n",
195 " 'Carol': -70,\n",
196 " 'David': -31,\n",
197 " 'Eric': 72,\n",
198 " 'Frank': -25,\n",
199 " 'George': -95,\n",
200 " 'Mallory': 11},\n",
201 " 'Carol': {'Alice': -83,\n",
202 " 'Bob': 8,\n",
203 " 'David': 35,\n",
204 " 'Eric': 10,\n",
205 " 'Frank': 61,\n",
206 " 'George': 10,\n",
207 " 'Mallory': 29},\n",
208 " 'David': {'Alice': 67,\n",
209 " 'Bob': 25,\n",
210 " 'Carol': 48,\n",
211 " 'Eric': -65,\n",
212 " 'Frank': 8,\n",
213 " 'George': 84,\n",
214 " 'Mallory': 9},\n",
215 " 'Eric': {'Alice': -51,\n",
216 " 'Bob': -39,\n",
217 " 'Carol': 84,\n",
218 " 'David': -98,\n",
219 " 'Frank': -20,\n",
220 " 'George': -6,\n",
221 " 'Mallory': 60},\n",
222 " 'Frank': {'Alice': 51,\n",
223 " 'Bob': 79,\n",
224 " 'Carol': 88,\n",
225 " 'David': 33,\n",
226 " 'Eric': 43,\n",
227 " 'George': 77,\n",
228 " 'Mallory': -3},\n",
229 " 'George': {'Alice': -14,\n",
230 " 'Bob': -12,\n",
231 " 'Carol': -52,\n",
232 " 'David': 14,\n",
233 " 'Eric': -62,\n",
234 " 'Frank': -18,\n",
235 " 'Mallory': -17},\n",
236 " 'Mallory': {'Alice': -36,\n",
237 " 'Bob': 76,\n",
238 " 'Carol': -34,\n",
239 " 'David': 37,\n",
240 " 'Eric': 40,\n",
241 " 'Frank': 18,\n",
242 " 'George': 7}}"
243 ]
244 },
245 "execution_count": 10,
246 "metadata": {},
247 "output_type": "execute_result"
248 }
249 ],
250 "source": [
251 "# import collections\n",
252 "\n",
253 "# Seating = collections.namedtuple('Seating', ['person', 'neighbour', 'gain'])\n",
254 "\n",
255 "preferences2 = {}\n",
256 "for line in pi13:\n",
257 " words = line.split()\n",
258 " gain = int(words[3])\n",
259 " if words[2] == 'lose':\n",
260 " gain *= -1\n",
261 " if words[0] not in preferences2:\n",
262 " preferences2[words[0]] = {}\n",
263 " preferences2[words[0]][words[-1][:-1]] = gain\n",
264 "preferences2"
265 ]
266 },
267 {
268 "cell_type": "code",
269 "execution_count": 11,
270 "metadata": {
271 "collapsed": false,
272 "scrolled": true
273 },
274 "outputs": [
275 {
276 "data": {
277 "text/plain": [
278 "{'Alice': {'Bob': 54,\n",
279 " 'Carol': -81,\n",
280 " 'David': -42,\n",
281 " 'Eric': 89,\n",
282 " 'Frank': -89,\n",
283 " 'George': 97,\n",
284 " 'Mallory': -94,\n",
285 " 'me': 0},\n",
286 " 'Bob': {'Alice': 3,\n",
287 " 'Carol': -70,\n",
288 " 'David': -31,\n",
289 " 'Eric': 72,\n",
290 " 'Frank': -25,\n",
291 " 'George': -95,\n",
292 " 'Mallory': 11,\n",
293 " 'me': 0},\n",
294 " 'Carol': {'Alice': -83,\n",
295 " 'Bob': 8,\n",
296 " 'David': 35,\n",
297 " 'Eric': 10,\n",
298 " 'Frank': 61,\n",
299 " 'George': 10,\n",
300 " 'Mallory': 29,\n",
301 " 'me': 0},\n",
302 " 'David': {'Alice': 67,\n",
303 " 'Bob': 25,\n",
304 " 'Carol': 48,\n",
305 " 'Eric': -65,\n",
306 " 'Frank': 8,\n",
307 " 'George': 84,\n",
308 " 'Mallory': 9,\n",
309 " 'me': 0},\n",
310 " 'Eric': {'Alice': -51,\n",
311 " 'Bob': -39,\n",
312 " 'Carol': 84,\n",
313 " 'David': -98,\n",
314 " 'Frank': -20,\n",
315 " 'George': -6,\n",
316 " 'Mallory': 60,\n",
317 " 'me': 0},\n",
318 " 'Frank': {'Alice': 51,\n",
319 " 'Bob': 79,\n",
320 " 'Carol': 88,\n",
321 " 'David': 33,\n",
322 " 'Eric': 43,\n",
323 " 'George': 77,\n",
324 " 'Mallory': -3,\n",
325 " 'me': 0},\n",
326 " 'George': {'Alice': -14,\n",
327 " 'Bob': -12,\n",
328 " 'Carol': -52,\n",
329 " 'David': 14,\n",
330 " 'Eric': -62,\n",
331 " 'Frank': -18,\n",
332 " 'Mallory': -17,\n",
333 " 'me': 0},\n",
334 " 'Mallory': {'Alice': -36,\n",
335 " 'Bob': 76,\n",
336 " 'Carol': -34,\n",
337 " 'David': 37,\n",
338 " 'Eric': 40,\n",
339 " 'Frank': 18,\n",
340 " 'George': 7,\n",
341 " 'me': 0},\n",
342 " 'me': {'Alice': 0,\n",
343 " 'Bob': 0,\n",
344 " 'Carol': 0,\n",
345 " 'David': 0,\n",
346 " 'Eric': 0,\n",
347 " 'Frank': 0,\n",
348 " 'George': 0,\n",
349 " 'Mallory': 0,\n",
350 " 'me': 0}}"
351 ]
352 },
353 "execution_count": 11,
354 "metadata": {},
355 "output_type": "execute_result"
356 }
357 ],
358 "source": [
359 "preferences2['me'] = {other: 0 for other in preferences2}\n",
360 "for other in preferences2:\n",
361 " preferences2[other]['me'] = 0\n",
362 "preferences2"
363 ]
364 },
365 {
366 "cell_type": "code",
367 "execution_count": 12,
368 "metadata": {
369 "collapsed": false
370 },
371 "outputs": [
372 {
373 "data": {
374 "text/plain": [
375 "668"
376 ]
377 },
378 "execution_count": 12,
379 "metadata": {},
380 "output_type": "execute_result"
381 }
382 ],
383 "source": [
384 "seatings = itertools.permutations(list(preferences2.keys()))\n",
385 "\n",
386 "max(score(s, preferences2) for s in seatings)"
387 ]
388 },
389 {
390 "cell_type": "code",
391 "execution_count": null,
392 "metadata": {
393 "collapsed": true
394 },
395 "outputs": [],
396 "source": []
397 }
398 ],
399 "metadata": {
400 "kernelspec": {
401 "display_name": "Python 3",
402 "language": "python",
403 "name": "python3"
404 },
405 "language_info": {
406 "codemirror_mode": {
407 "name": "ipython",
408 "version": 3
409 },
410 "file_extension": ".py",
411 "mimetype": "text/x-python",
412 "name": "python",
413 "nbconvert_exporter": "python",
414 "pygments_lexer": "ipython3",
415 "version": "3.4.3"
416 }
417 },
418 "nbformat": 4,
419 "nbformat_minor": 0
420 }