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