Solve box-stacking problem
Write a function to compute the highest stack of boxes that can be created from a list of boxes.
This commit is contained in:
parent
7672049e1c
commit
1b3f1b99f5
1 changed files with 50 additions and 0 deletions
50
scratch/facebook/stacking-boxes.py
Normal file
50
scratch/facebook/stacking-boxes.py
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
from random import randint
|
||||||
|
|
||||||
|
class Box(object):
|
||||||
|
def __init__(self, w, h, d):
|
||||||
|
self.width = w
|
||||||
|
self.depth = d
|
||||||
|
self.height = h
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "{}x{}x{}".format(self.width, self.depth, self.height)
|
||||||
|
|
||||||
|
def lt(self, b):
|
||||||
|
return all([
|
||||||
|
self.width < b.width,
|
||||||
|
self.height < b.height,
|
||||||
|
self.depth < b.depth,
|
||||||
|
])
|
||||||
|
|
||||||
|
def gt(self, b):
|
||||||
|
return all([
|
||||||
|
self.width > b.width,
|
||||||
|
self.height > b.height,
|
||||||
|
self.depth > b.depth,
|
||||||
|
])
|
||||||
|
|
||||||
|
def random_box():
|
||||||
|
return Box(
|
||||||
|
randint(1, 10),
|
||||||
|
randint(1, 10),
|
||||||
|
randint(1, 10),
|
||||||
|
)
|
||||||
|
|
||||||
|
xs = [random_box() for _ in range(5)]
|
||||||
|
|
||||||
|
def highest_stack(xs, cache={}):
|
||||||
|
if not xs:
|
||||||
|
return 0
|
||||||
|
heights = []
|
||||||
|
for i in range(len(xs)):
|
||||||
|
x, rest = xs[i], xs[0:i] + xs[i+1:]
|
||||||
|
if cache and x in cache:
|
||||||
|
height = cache[x]
|
||||||
|
else:
|
||||||
|
height = x.height + highest_stack([b for b in rest if x.gt(b)], cache)
|
||||||
|
cache[x] = height
|
||||||
|
heights += [height]
|
||||||
|
return max(heights)
|
||||||
|
|
||||||
|
print(xs)
|
||||||
|
print(highest_stack(xs))
|
Loading…
Reference in a new issue