From 1b3f1b99f5e4f14ac47bd2c519efe7512178b2e7 Mon Sep 17 00:00:00 2001 From: William Carroll Date: Fri, 13 Nov 2020 16:57:47 +0000 Subject: Solve box-stacking problem Write a function to compute the highest stack of boxes that can be created from a list of boxes. --- scratch/facebook/stacking-boxes.py | 50 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 scratch/facebook/stacking-boxes.py (limited to 'scratch/facebook/stacking-boxes.py') diff --git a/scratch/facebook/stacking-boxes.py b/scratch/facebook/stacking-boxes.py new file mode 100644 index 000000000000..7a3304bc51b9 --- /dev/null +++ b/scratch/facebook/stacking-boxes.py @@ -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)) -- cgit 1.4.1