4 "cell_type": "markdown",
9 "You've been shopping around for a holiday package deal and its time to make your choice of which deal to go with. The file [01-holidays.txt](01-holidays.txt) contains a summary of your investigations. \n",
11 "It's a simple text file, with one possible holiday package per line.\n",
13 "Each line has four fields, separated by spaces. They are:\n",
14 "* The deal ID, from the price comparison website you found it.\n",
15 "* The holiday price, in whole pounds.\n",
16 "* The location of the holiday, always a single word.\n",
17 "* The number of nights you'd be staying. \n",
19 "For example, the data file might look like this:\n",
22 "db61bb90 769 Morgantown 3\n",
23 "202c898b5f 1284 Morgantown 21\n",
24 "def36ffcd 1514 Giessenmestia 21\n",
25 "389018bd0707 1052 Estacada 21\n",
26 "a487c4270 782 Geoje-Si 14\n",
27 "6caf2584a55 724 Stonington-Island 14\n",
28 "199608abc5 1209 Nordkapp 21\n",
33 "cell_type": "markdown",
37 "You have a budget of £1200. How many of the holidays can you afford?\n",
39 "Given the example data above, you could afford four of the holidays: the trips to Estacada, Geoje-Si and Stonnington-Island, and the three-day trip to Morgantown. \n",
41 "The 21 day trip to Morgantown and the trips to Giessenmestia and Nordkapp are all too expensive."
45 "cell_type": "markdown",
53 "execution_count": 12,
59 "[['dda7d369', '1546', 'Uzupis', '21'],\n",
60 " ['68022753', '1239', 'Mamula', '21'],\n",
61 " ['b261dbd1cef', '996', 'Holmegaard', '21']]"
64 "execution_count": 12,
66 "output_type": "execute_result"
71 "with open('01-holidays.txt') as f:\n",
72 " for hol_line in f.readlines():\n",
73 " holidays.append(hol_line.split())\n",
80 "execution_count": 13,
89 "execution_count": 13,
91 "output_type": "execute_result"
95 "affordable_holidays = []\n",
96 "for h in holidays:\n",
97 " if int(h[1]) <= 1200:\n",
98 " affordable_holidays.append(h)\n",
100 "len(affordable_holidays)"
105 "execution_count": 14,
114 "execution_count": 14,
116 "output_type": "execute_result"
124 "cell_type": "markdown",
127 "### Smart-alec one-line solution"
132 "execution_count": 15,
141 "execution_count": 15,
143 "output_type": "execute_result"
147 "sum(1 for h in open('01-holidays.txt').readlines() if int(h.split()[1]) <= 1200)"
151 "cell_type": "markdown",
155 "You don't just want _a_ holiday. You want the _best_ holiday. What is the code of the holiday which would give you the best value?\n",
157 "The \"value\" of a holiday is the duration per pound. Because some destinations are better than others, you'll want to scale the value for some locations. For instance, a night in Timbuktu is worth three times as much as a holiday in Bletchley.\n",
159 "Assume all holidays have a relative value of 1, apart from these destinations.\n",
161 "| Destination | Score |\n",
162 "|-------------|-------|\n",
163 "| Almaty | 2.0 |\n",
164 "| Brorfelde | 0.9 |\n",
165 "| Estacada | 0.4 |\n",
166 "| Jayuya | 0.6 |\n",
167 "| Karlukovo | 2.2 |\n",
168 "| Morgantown | 2.9 |\n",
169 "| Nordkapp | 1.5 |\n",
170 "| Nullarbor | 2.2 |\n",
171 "| Puente-Laguna-Garzonkuala-Penyu | 0.4 |\n",
172 "| Uzupis | 0.9 |\n",
176 "Given the holiday list above, the holiday to Geoje-Si (with the standard weighting of 1) has a value of $\\frac{14}{782} = 0.0179$ nights per pound. \n",
178 "The trip to Estacada looks promising, at $\\frac{21}{1052} = 0.0200$ nights per pound. Unfortunately, the weighting for Estacada is low, to the adjusted cost is $0.4 \\times \\frac{21}{1052} = 0.00798$ nights per pound.\n",
180 "The best value holiday is the 21 day trip to Morgantown, with a value of $2.9 \\times \\frac{21}{1284} = 0.0474$ nights per pound. Unfortunately, it's unaffordable. \n",
182 "The best value affordable holiday is the trip to Stonnington Island, with $\\frac{14}{1284} = 0.0193$ nights per pound."
187 "execution_count": 16,
193 "destination_values = {'Almaty': 2.0, 'Brorfelde': 0.9, 'Estacada': 0.4, 'Jayuya': 0.6, 'Karlukovo': 2.2, \n",
194 " 'Morgantown': 2.9,'Nordkapp': 1.5, 'Nullarbor': 2.2, \n",
195 " 'Puente-Laguna-Garzonkuala-Penyu': 0.4, 'Uzupis': 0.9}"
200 "execution_count": 17,
206 "def value_of_destination(name):\n",
207 " if name in destination_values:\n",
208 " return destination_values[name]\n",
215 "execution_count": 18,
221 "def value_of_holiday(holiday):\n",
222 " hid, cost, destination, duration = tuple(holiday)\n",
223 " value = value_of_destination(destination) * float(duration) / int(cost)\n",
229 "execution_count": 19,
238 "execution_count": 19,
240 "output_type": "execute_result"
244 "best_holiday = ''\n",
247 "for h in affordable_holidays:\n",
248 " if value_of_holiday(h) > best_value:\n",
249 " best_value = value_of_holiday(h)\n",
250 " best_holiday = h[0]\n",
256 "cell_type": "markdown",
259 "## Smart-alec solution"
264 "execution_count": 20,
273 "execution_count": 20,
275 "output_type": "execute_result"
280 "max(affordable_holidays, key=value_of_holiday)[0]"
285 "execution_count": 21,
294 "execution_count": 21,
296 "output_type": "execute_result"
300 "# Answer if you don't filter by affordability\n",
301 "max(holidays, key=value_of_holiday)[0]"
306 "execution_count": 23,
315 "execution_count": 23,
317 "output_type": "execute_result"
321 "# Answer if you don't scale by perceived value\n",
322 "max(affordable_holidays, key=lambda h: float(h[3]) / float(h[1]))[0]"
327 "execution_count": 22,
336 "execution_count": 22,
338 "output_type": "execute_result"
342 "# Answer if you don't scale by perceived value, AND don't filter by affordability\n",
343 "max(holidays, key=lambda h: float(h[3]) / float(h[1]))[0]"
349 "display_name": "Python 3",
350 "language": "python",
358 "file_extension": ".py",
359 "mimetype": "text/x-python",
361 "nbconvert_exporter": "python",
362 "pygments_lexer": "ipython3",