Change-Id: I99d2882ac9ef5ede85032132f6727e7bad8f24eb Reviewed-on: https://cl.tvl.fyi/c/depot/+/2564 Tested-by: BuildkiteCI Reviewed-by: Profpatsch <mail@profpatsch.de>
		
			
				
	
	
		
			66 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import itertools
 | |
| import math
 | |
| 
 | |
| def tree_line(init):
 | |
|     return {
 | |
|         "init-len": len(init),
 | |
|         "known": '',
 | |
|         "rest": itertools.repeat(init)
 | |
|     }
 | |
| 
 | |
| def tree_line_at(pos, tree_line):
 | |
|     needed = (pos + 1) - len(tree_line["known"])
 | |
|     # internally advance the tree line to the position requested
 | |
|     if needed > 0:
 | |
|         tree_line["known"] = tree_line["known"] \
 | |
|           + ''.join(
 | |
|             itertools.islice(
 | |
|                 tree_line["rest"],
 | |
|                 1+math.floor(needed / tree_line["init-len"])))
 | |
|     # print(tree_line)
 | |
|     return tree_line["known"][pos] == '#'
 | |
| 
 | |
| def tree_at(linepos, pos, trees):
 | |
|     return tree_line_at(pos, trees[linepos])
 | |
| 
 | |
| def slope_positions(trees, right, down):
 | |
|     line = 0
 | |
|     pos = 0
 | |
|     while line < len(trees):
 | |
|         yield (line, pos)
 | |
|         line = line + down
 | |
|         pos = pos + right
 | |
| 
 | |
| trees = []
 | |
| with open("./input", 'r') as f:
 | |
|     for line in f:
 | |
|         line = line.rstrip()
 | |
|         trees.append(tree_line(line))
 | |
| 
 | |
| # print(list(itertools.islice(trees[0], 5)))
 | |
| # print(list(map(
 | |
| #     lambda x: tree_at(0, x, trees),
 | |
| #     range(100)
 | |
| # )))
 | |
| # print(list(slope_positions(trees, right=3, down=1)))
 | |
| 
 | |
| def count_slope_positions(trees, slope):
 | |
|     count = 0
 | |
|     for (line, pos) in slope:
 | |
|         if tree_at(line, pos, trees):
 | |
|             count = count + 1
 | |
|     return count
 | |
| 
 | |
| print(
 | |
|         count_slope_positions(trees, slope_positions(trees, right=1, down=1))
 | |
|     *
 | |
|         count_slope_positions(trees, slope_positions(trees, right=3, down=1))
 | |
|     *
 | |
|         count_slope_positions(trees, slope_positions(trees, right=5, down=1))
 | |
|     *
 | |
|         count_slope_positions(trees, slope_positions(trees, right=7, down=1))
 | |
|     *
 | |
|         count_slope_positions(trees, slope_positions(trees, right=1, down=2))
 | |
| )
 | |
| 
 | |
| # I realized I could have just used a modulo instead …
 |