Skip to content

Instantly share code, notes, and snippets.

@ofek
Created May 9, 2017 02:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ofek/7aa2f68a67a2b5bbdf56dd72d7ca083d to your computer and use it in GitHub Desktop.
Save ofek/7aa2f68a67a2b5bbdf56dd72d7ca083d to your computer and use it in GitHub Desktop.
Shopify Fall 2017 Internship - Back End Development Problem
import json
from collections import namedtuple
try:
import requests
except ImportError:
raise ImportError('This program requires '
'https://github.com/kennethreitz/requests')
ENDPOINT = 'https://backend-challenge-fall-2017.herokuapp.com/orders.json'
OFFSET_PARAM = 'page'
CookieOrder = namedtuple('CookieOrder', ['amount', 'id'])
def stream_orders(orders_per_page, total_orders):
page = 1
payload = {OFFSET_PARAM: str(page)}
while total_orders > 0:
response = requests.get(ENDPOINT, params=payload).json()
for order in response['orders']:
yield order
total_orders -= orders_per_page
page += 1
payload[OFFSET_PARAM] = str(page)
raise StopIteration
def main():
response = requests.get(ENDPOINT).json()
remaining_cookies = response['available_cookies']
orders_per_page = response['pagination']['per_page']
total_orders = response['pagination']['total']
cookie_orders = []
orders = stream_orders(orders_per_page, total_orders)
for order in orders:
for product in order['products']:
# I could break early here, but I don't know
# if an order allows duplicate products.
if product['title'] == 'Cookie':
cookie_orders.append(
CookieOrder(amount=product['amount'], id=-order['id'])
)
cookie_orders.sort()
while remaining_cookies > 0:
try:
order = cookie_orders.pop()
except IndexError:
break
if order.amount > remaining_cookies:
continue
remaining_cookies -= order.amount
print(json.dumps({
'remaining_cookies': remaining_cookies,
'unfulfilled_orders': [abs(order.id) for order in reversed(cookie_orders)]
}))
if __name__ == '__main__':
main()
@ofek
Copy link
Author

ofek commented May 11, 2017

Just made public as deadline past.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment