Created
May 9, 2017 02:53
-
-
Save ofek/7aa2f68a67a2b5bbdf56dd72d7ca083d to your computer and use it in GitHub Desktop.
Shopify Fall 2017 Internship - Back End Development Problem
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Just made public as deadline past.