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…
	
	Add table
		Add a link
		
	
		Reference in a new issue