about summary refs log tree commit diff
path: root/scratch
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-11-13T16·57+0000
committerWilliam Carroll <wpcarro@gmail.com>2020-11-13T16·57+0000
commit1b3f1b99f5e4f14ac47bd2c519efe7512178b2e7 (patch)
tree1436485a9cda2c1678017b0c5f6e6d0e3a8da371 /scratch
parent7672049e1cc25b2848245c565329240c95d2e96d (diff)
Solve box-stacking problem
Write a function to compute the highest stack of boxes that can be created from
a list of boxes.
Diffstat (limited to 'scratch')
-rw-r--r--scratch/facebook/stacking-boxes.py50
1 files changed, 50 insertions, 0 deletions
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))