Skip to content

Instantly share code, notes, and snippets.

@catherinedevlin
Last active August 29, 2015 14:03
Show Gist options
  • Save catherinedevlin/54fdf0adf4bd3502cac2 to your computer and use it in GitHub Desktop.
Save catherinedevlin/54fdf0adf4bd3502cac2 to your computer and use it in GitHub Desktop.
PyOhio 2014 food order
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:ea73faa26bcedd9da44d80969013ef32e151ee396c17493587fef27bc683ec03"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Proposed PyOhio 2013 food order"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Setup (ignorable)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import copy\n",
"import collections"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class MD(str):\n",
" def _repr_html_(self):\n",
" return self\n",
" \n",
"class Order(object):\n",
" _html_header_line = '<tr><th>Servings</th><th>Name</th><th>Category</th><th>$ each<th>Discount</th><th>$ Total</th></tr>'\n",
" def __init__(self, item, servings):\n",
" self.item = item\n",
" self.servings = servings\n",
" def __str__(self):\n",
" return \"%s %s\" % (self.servings, self.item.name)\n",
" def __repr__(self):\n",
" return \"%s * menu['%s']\" % (self.servings, self.item.name)\n",
" def price(self):\n",
" return self.item.dollars_each * self.servings * (1.0 - self.item.discount)\n",
" def _repr_html_row_(self):\n",
" return '<tr><td>%s</td>%s<td>%.2f</td></tr>' % (self.servings, self.item._repr_html_row_(), self.price())\n",
" def _repr_html_(self):\n",
" return \"\"\"\n",
" <table>\n",
" %s\n",
" %s\n",
" </table>\n",
" \"\"\" % (self._html_header_line, self._repr_html_row_())\n",
" \n",
" \n",
"class Item(object):\n",
" def __init__(self, name, category, dollars, n_in_group=1, discount=0.0):\n",
" self.name = name\n",
" self.category = category\n",
" self.dollars = dollars\n",
" self.n_in_group = n_in_group\n",
" self.dollars_each = float(dollars) / float(n_in_group)\n",
" self.discount = discount\n",
" def __repr__(self):\n",
" return \"Item('%s', '%s', %s, %s, %s)\" % (self.name, self.category, self.dollars, self.n_in_group, self.discount)\n",
" def __mul__(self, n):\n",
" return Order(self, n)\n",
" def _repr_html_row_(self):\n",
" return '<td>%s</td><td>%s</td><td>%.2f</td><td>%s</td>' % (\n",
" self.name, self.category, self.dollars_each, self.discount)\n",
" \n",
"class Meal(object):\n",
" def __init__(self, descrip):\n",
" self.orders = []\n",
" for line in descrip.splitlines():\n",
" if line:\n",
" item_name, servings = line.split(',')\n",
" self.orders.append(menu[item_name] * int(servings))\n",
" def __str__(self):\n",
" return \"\\n\".join(str(order) for order in self.orders)\n",
" def _html_table(self, order_list):\n",
" return \"\"\"\n",
" <table>\n",
" %s\n",
" %s\n",
" <tr style=\"font-weight:bold;\"><td>%s</td><td colspan=\"4\">TOTAL</td><td>%.2f</td></tr>\n",
" </table>\n",
" \"\"\" % (Order._html_header_line, \n",
" \"\\n\".join(o._repr_html_row_() for o in order_list),\n",
" sum(o.servings for o in order_list), \n",
" sum(o.price() for o in order_list)) \n",
" def _repr_html_(self):\n",
" return self._html_table(self.orders)\n",
" def categories(self):\n",
" cats = collections.defaultdict(list)\n",
" for o in self.orders:\n",
" cats[o.item.category].append(o)\n",
" return MD(\"\\n\".join(self._html_table(cats[c]) for c in cats))\n",
" def price(self):\n",
" return sum(o.price() for o in self.orders)\n",
" def __add__(self, other):\n",
" new = Meal('')\n",
" new.orders = self.orders + other.orders\n",
" return new\n",
" \n",
" "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Prices copied from OSU's \"Catering 101\" menu for student-affiliated groups. Still current as of July 2013, according to [Ohio Union website](http://ohiounion.osu.edu/plan_an_event/catering)."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"everything = \"\"\"\n",
"---facilities\n",
"easel,10,1,0.5\n",
"wireless microphone,100,1,0.5\n",
"extra hour,200,1,0.5\n",
"parking voucher,6,1\n",
"---bakery\n",
"bagel,13.75,12\n",
"muffin,13.75,12\n",
"croissant,10,12\n",
"scone,14.50,12\n",
"danish,13.75,12\n",
"sweet roll,14.50,12\n",
"doughnut,10,12\n",
"cookie,12,12\n",
"brownie,12,12\n",
"cupcake,10,12\n",
"rice krispie treat,12,12\n",
"buckeye candy,10,12\n",
"cereal bar,5.25\n",
"---breakfast\n",
"continental break,6.5\n",
"create your own continental,8.75\n",
"deluxe continental,10.5\n",
"breakfast buffet,12.75\n",
"americana breakfast,6.25\n",
"biscuits and gravy breakfast,6.25\n",
"french toast,6.25\n",
"---beverages\n",
"bottled juice,1.75\n",
"soda,0.5\n",
"powerade,1.75\n",
"milk,1.25\n",
"soy milk,1.25\n",
"water 12 oz,0.75\n",
"water 20 oz,1.5\n",
"coffee,17,14\n",
"hot tea,17,14\n",
"juice in pitcher,12,14\n",
"cider,12,14\n",
"hot chocolate,12,14\n",
"lemonade,10,14\n",
"ice tea,12,14\n",
"punch,13,14\n",
"---snacks\n",
"fruit,1\n",
"granola bar,1.5\n",
"yogurt,1\n",
"ice cream bar,1.25\n",
"potato chips,4.5,13\n",
"tortilla chips,4.5,13\n",
"pretzels,3.5,13\n",
"spicy snack mix,5.75,13\n",
"mixed nuts,12,13\n",
"peanuts,4.8,13\n",
"---dips\n",
"salsa,7.5,18\n",
"guacamole,9,18\n",
"ranch dip,8.5,18\n",
"onion dip,8.5,18\n",
"honey mustard dip,6,18\n",
"---party trays\n",
"cheese and crackers,3.75\n",
"fruit tray,3.75\n",
"vegetable tray,3.75\n",
"meat and cheese tray,5.75\n",
"---pizza\n",
"sheet pizza,26.25,13\n",
"---snack packages\n",
"pretzels,4.75\n",
"hummus and pita and vegetables,4.75\n",
"tortilla chips and dips,4.75\n",
"kettle chips and dips,4.75\n",
"southwester layered dip,4.75\n",
"---meeting packages\n",
"meeting package meal,9.25\n",
"sack lunch,8.75\n",
"---hors doeuvres\n",
"chicken wings,11,12\n",
"chicken tenders,11,12\n",
"vegetable egg rolls,10,12\n",
"chicken sate,12,12\n",
"beef sate,12,12\n",
"mini chicken quesadilla,13,12\n",
"mini vegetable quesadilla,13,12\n",
"meatballs,10,12\n",
"mini pizza,13,12\n",
"vegetarian steamed dumpling,11,12\n",
"spanakopita,11,12\n",
"bacon wrapped water chestnut,12,12\n",
"potato skins,12,12\n",
"bruschetta,8.75,12\n",
"deviled eggs,9.25,12\n",
"cucumber with cheese,8.5,12\n",
"phyllo cups,8.5,12\n",
"stuffed cherry tomatoes,8.25,12\n",
"\"\"\"\n",
"menu = {}\n",
"for thing in everything.strip().splitlines():\n",
" if thing[:3] == '---':\n",
" category = thing[3:]\n",
" continue\n",
" values = thing.split(',')\n",
" (obj_name, price) = values[:2]\n",
" try:\n",
" n_in_group = values[2]\n",
" try:\n",
" discount = values[3]\n",
" except:\n",
" discount = 0.0\n",
" except IndexError:\n",
" n_in_group = 1\n",
" menu[obj_name] = Item(obj_name, category, price, n_in_group, discount)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"2014"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sat_morn = Meal('''\n",
"bagel,60\n",
"muffin,24\n",
"croissant,24\n",
"scone,24\n",
"sweet roll,24\n",
"doughnut,60\n",
"danish,12\n",
"fruit,50\n",
"bottled juice,50\n",
"soda,50\n",
"milk,30\n",
"water 12 oz,150\n",
"coffee,168\n",
"''')\n",
"sat_aft = Meal(\"\"\"\n",
"cookie,168\n",
"brownie,96\n",
"fruit,50\n",
"soda,250\n",
"water 12 oz,225\n",
"\"\"\")\n",
"sun = Meal(\"\"\"\n",
"soda,100\n",
"milk,30\n",
"water 12 oz,150\n",
"coffee,168\n",
"fruit,50\n",
"cookie,120\n",
"brownie,84\n",
"coffee,84\n",
"\"\"\")\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sat_morn"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
" <table>\n",
" <tr><th>Servings</th><th>Name</th><th>Category</th><th>$ each<th>Discount</th><th>$ Total</th></tr>\n",
" <tr><td>60</td><td>bagel</td><td>bakery</td><td>1.15</td><td>0.0</td><td>68.75</td></tr>\n",
"<tr><td>24</td><td>muffin</td><td>bakery</td><td>1.15</td><td>0.0</td><td>27.50</td></tr>\n",
"<tr><td>24</td><td>croissant</td><td>bakery</td><td>0.83</td><td>0.0</td><td>20.00</td></tr>\n",
"<tr><td>24</td><td>scone</td><td>bakery</td><td>1.21</td><td>0.0</td><td>29.00</td></tr>\n",
"<tr><td>24</td><td>sweet roll</td><td>bakery</td><td>1.21</td><td>0.0</td><td>29.00</td></tr>\n",
"<tr><td>60</td><td>doughnut</td><td>bakery</td><td>0.83</td><td>0.0</td><td>50.00</td></tr>\n",
"<tr><td>12</td><td>danish</td><td>bakery</td><td>1.15</td><td>0.0</td><td>13.75</td></tr>\n",
"<tr><td>50</td><td>fruit</td><td>snacks</td><td>1.00</td><td>0.0</td><td>50.00</td></tr>\n",
"<tr><td>50</td><td>bottled juice</td><td>beverages</td><td>1.75</td><td>0.0</td><td>87.50</td></tr>\n",
"<tr><td>50</td><td>soda</td><td>beverages</td><td>0.50</td><td>0.0</td><td>25.00</td></tr>\n",
"<tr><td>30</td><td>milk</td><td>beverages</td><td>1.25</td><td>0.0</td><td>37.50</td></tr>\n",
"<tr><td>150</td><td>water 12 oz</td><td>beverages</td><td>0.75</td><td>0.0</td><td>112.50</td></tr>\n",
"<tr><td>168</td><td>coffee</td><td>beverages</td><td>1.21</td><td>0.0</td><td>204.00</td></tr>\n",
" <tr style=\"font-weight:bold;\"><td>726</td><td colspan=\"4\">TOTAL</td><td>754.50</td></tr>\n",
" </table>\n",
" "
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"text": [
"<__main__.Meal at 0x7fc2d01b1080>"
]
}
],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sat_aft"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
" <table>\n",
" <tr><th>Servings</th><th>Name</th><th>Category</th><th>$ each<th>Discount</th><th>$ Total</th></tr>\n",
" <tr><td>168</td><td>cookie</td><td>bakery</td><td>1.00</td><td>0.0</td><td>168.00</td></tr>\n",
"<tr><td>96</td><td>brownie</td><td>bakery</td><td>1.00</td><td>0.0</td><td>96.00</td></tr>\n",
"<tr><td>50</td><td>fruit</td><td>snacks</td><td>1.00</td><td>0.0</td><td>50.00</td></tr>\n",
"<tr><td>250</td><td>soda</td><td>beverages</td><td>0.50</td><td>0.0</td><td>125.00</td></tr>\n",
"<tr><td>225</td><td>water 12 oz</td><td>beverages</td><td>0.75</td><td>0.0</td><td>168.75</td></tr>\n",
" <tr style=\"font-weight:bold;\"><td>789</td><td colspan=\"4\">TOTAL</td><td>607.75</td></tr>\n",
" </table>\n",
" "
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": [
"<__main__.Meal at 0x7fc2d01b10b8>"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sun"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
" <table>\n",
" <tr><th>Servings</th><th>Name</th><th>Category</th><th>$ each<th>Discount</th><th>$ Total</th></tr>\n",
" <tr><td>100</td><td>soda</td><td>beverages</td><td>0.50</td><td>0.0</td><td>50.00</td></tr>\n",
"<tr><td>30</td><td>milk</td><td>beverages</td><td>1.25</td><td>0.0</td><td>37.50</td></tr>\n",
"<tr><td>150</td><td>water 12 oz</td><td>beverages</td><td>0.75</td><td>0.0</td><td>112.50</td></tr>\n",
"<tr><td>168</td><td>coffee</td><td>beverages</td><td>1.21</td><td>0.0</td><td>204.00</td></tr>\n",
"<tr><td>50</td><td>fruit</td><td>snacks</td><td>1.00</td><td>0.0</td><td>50.00</td></tr>\n",
"<tr><td>120</td><td>cookie</td><td>bakery</td><td>1.00</td><td>0.0</td><td>120.00</td></tr>\n",
"<tr><td>84</td><td>brownie</td><td>bakery</td><td>1.00</td><td>0.0</td><td>84.00</td></tr>\n",
"<tr><td>84</td><td>coffee</td><td>beverages</td><td>1.21</td><td>0.0</td><td>102.00</td></tr>\n",
" <tr style=\"font-weight:bold;\"><td>786</td><td colspan=\"4\">TOTAL</td><td>760.00</td></tr>\n",
" </table>\n",
" "
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": [
"<__main__.Meal at 0x7fc2d01b1438>"
]
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sat_morn + sat_aft + sun"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
" <table>\n",
" <tr><th>Servings</th><th>Name</th><th>Category</th><th>$ each<th>Discount</th><th>$ Total</th></tr>\n",
" <tr><td>60</td><td>bagel</td><td>bakery</td><td>1.15</td><td>0.0</td><td>68.75</td></tr>\n",
"<tr><td>24</td><td>muffin</td><td>bakery</td><td>1.15</td><td>0.0</td><td>27.50</td></tr>\n",
"<tr><td>24</td><td>croissant</td><td>bakery</td><td>0.83</td><td>0.0</td><td>20.00</td></tr>\n",
"<tr><td>24</td><td>scone</td><td>bakery</td><td>1.21</td><td>0.0</td><td>29.00</td></tr>\n",
"<tr><td>24</td><td>sweet roll</td><td>bakery</td><td>1.21</td><td>0.0</td><td>29.00</td></tr>\n",
"<tr><td>60</td><td>doughnut</td><td>bakery</td><td>0.83</td><td>0.0</td><td>50.00</td></tr>\n",
"<tr><td>12</td><td>danish</td><td>bakery</td><td>1.15</td><td>0.0</td><td>13.75</td></tr>\n",
"<tr><td>50</td><td>fruit</td><td>snacks</td><td>1.00</td><td>0.0</td><td>50.00</td></tr>\n",
"<tr><td>50</td><td>bottled juice</td><td>beverages</td><td>1.75</td><td>0.0</td><td>87.50</td></tr>\n",
"<tr><td>50</td><td>soda</td><td>beverages</td><td>0.50</td><td>0.0</td><td>25.00</td></tr>\n",
"<tr><td>30</td><td>milk</td><td>beverages</td><td>1.25</td><td>0.0</td><td>37.50</td></tr>\n",
"<tr><td>150</td><td>water 12 oz</td><td>beverages</td><td>0.75</td><td>0.0</td><td>112.50</td></tr>\n",
"<tr><td>168</td><td>coffee</td><td>beverages</td><td>1.21</td><td>0.0</td><td>204.00</td></tr>\n",
"<tr><td>168</td><td>cookie</td><td>bakery</td><td>1.00</td><td>0.0</td><td>168.00</td></tr>\n",
"<tr><td>96</td><td>brownie</td><td>bakery</td><td>1.00</td><td>0.0</td><td>96.00</td></tr>\n",
"<tr><td>50</td><td>fruit</td><td>snacks</td><td>1.00</td><td>0.0</td><td>50.00</td></tr>\n",
"<tr><td>250</td><td>soda</td><td>beverages</td><td>0.50</td><td>0.0</td><td>125.00</td></tr>\n",
"<tr><td>225</td><td>water 12 oz</td><td>beverages</td><td>0.75</td><td>0.0</td><td>168.75</td></tr>\n",
"<tr><td>100</td><td>soda</td><td>beverages</td><td>0.50</td><td>0.0</td><td>50.00</td></tr>\n",
"<tr><td>30</td><td>milk</td><td>beverages</td><td>1.25</td><td>0.0</td><td>37.50</td></tr>\n",
"<tr><td>150</td><td>water 12 oz</td><td>beverages</td><td>0.75</td><td>0.0</td><td>112.50</td></tr>\n",
"<tr><td>168</td><td>coffee</td><td>beverages</td><td>1.21</td><td>0.0</td><td>204.00</td></tr>\n",
"<tr><td>50</td><td>fruit</td><td>snacks</td><td>1.00</td><td>0.0</td><td>50.00</td></tr>\n",
"<tr><td>120</td><td>cookie</td><td>bakery</td><td>1.00</td><td>0.0</td><td>120.00</td></tr>\n",
"<tr><td>84</td><td>brownie</td><td>bakery</td><td>1.00</td><td>0.0</td><td>84.00</td></tr>\n",
"<tr><td>84</td><td>coffee</td><td>beverages</td><td>1.21</td><td>0.0</td><td>102.00</td></tr>\n",
" <tr style=\"font-weight:bold;\"><td>2301</td><td colspan=\"4\">TOTAL</td><td>2122.25</td></tr>\n",
" </table>\n",
" "
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
"<__main__.Meal at 0x7fc2d01b19e8>"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment