Compare commits
	
		
			2 Commits
		
	
	
		
			7bcab0b085
			...
			11277f0677
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 11277f0677 | |||
| b45cc17e0d | 
| @@ -1,10 +1,11 @@ | |||||||
| #import "/src/utils.typ": * | #import "/src/utils.typ": * | ||||||
|  | #import "@preview/cetz:0.3.1": canvas, draw | ||||||
|  |  | ||||||
| #let check-xmas(lines, ox, oy) = { | #let check-xmas(lines, ox, oy) = { | ||||||
|   let w = lines.first().len() |   let w = lines.first().len() | ||||||
|   let h = lines.len() |   let h = lines.len() | ||||||
|  |  | ||||||
|   let total = 0 |   let dirs = () | ||||||
|   for dy in (-1, 0, 1) { |   for dy in (-1, 0, 1) { | ||||||
|     for dx in (-1, 0, 1) { |     for dx in (-1, 0, 1) { | ||||||
|       if dx == 0 and dy == 0 { |       if dx == 0 and dy == 0 { | ||||||
| @@ -26,11 +27,11 @@ | |||||||
|         } |         } | ||||||
|       } |       } | ||||||
|       if buffer == "XMAS" { |       if buffer == "XMAS" { | ||||||
|         total += 1 |         dirs.push((dx, dy)) | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   return total |   return dirs | ||||||
| } | } | ||||||
|  |  | ||||||
| #let solve(input) = { | #let solve(input) = { | ||||||
| @@ -42,7 +43,7 @@ | |||||||
|   for y in range(h) { |   for y in range(h) { | ||||||
|     for x in range(w) { |     for x in range(w) { | ||||||
|       if lines.at(y).at(x) == "X" { |       if lines.at(y).at(x) == "X" { | ||||||
|         total += check-xmas(lines, x, y) |         total += check-xmas(lines, x, y).len() | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -50,8 +51,41 @@ | |||||||
|   return total |   return total | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #let visualize(input) = { | ||||||
|  |   let lines = input.split("\n") | ||||||
|  |   let w = lines.first().len() | ||||||
|  |   let h = lines.len() | ||||||
|  |  | ||||||
|  |   canvas({ | ||||||
|  |     for y in range(h) { | ||||||
|  |       for x in range(w) { | ||||||
|  |         if lines.at(y).at(x) == "X" { | ||||||
|  |           let key = str(x) + "-" + str(y) | ||||||
|  |           let dirs = check-xmas(lines, x, y) | ||||||
|  |           draw.on-layer(2, { | ||||||
|  |             for (dx, dy) in dirs { | ||||||
|  |               draw.line( | ||||||
|  |                 (x + dx * 0.2, y + dy * 0.2), | ||||||
|  |                 (x + dx * 2.8, y + dy * 2.8), | ||||||
|  |                 stroke: red, | ||||||
|  |                 fill: red, | ||||||
|  |                 mark: (end: ">") | ||||||
|  |               ) | ||||||
|  |             } | ||||||
|  |           }) | ||||||
|  |         } | ||||||
|  |         draw.content( | ||||||
|  |           (x, y), | ||||||
|  |           lines.at(y).at(x) | ||||||
|  |         ) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
| #show-puzzle( | #show-puzzle( | ||||||
|   4, 1, |   4, 1, | ||||||
|   solve, |   solve, | ||||||
|   example: 18 |   example: 18, | ||||||
|  |   visualize: visualize | ||||||
| ) | ) | ||||||
| @@ -1,4 +1,5 @@ | |||||||
| #import "/src/utils.typ": * | #import "/src/utils.typ": * | ||||||
|  | #import "@preview/cetz:0.3.1": canvas, draw | ||||||
|  |  | ||||||
| #let solve(input) = { | #let solve(input) = { | ||||||
|   let lines = input.split("\n") |   let lines = input.split("\n") | ||||||
| @@ -26,8 +27,62 @@ | |||||||
|   return total |   return total | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #let visualize(input) = { | ||||||
|  |   let lines = input.split("\n") | ||||||
|  |   let w = lines.first().len() | ||||||
|  |   let h = lines.len() | ||||||
|  |  | ||||||
|  |   let perms = (("M", "S"), ("S", "M")) | ||||||
|  |   let positions = () | ||||||
|  |   for y in range(1, h - 1) { | ||||||
|  |     for x in range(1, w - 1) { | ||||||
|  |       if lines.at(y).at(x) == "A" { | ||||||
|  |         let tl = lines.at(y - 1).at(x - 1) | ||||||
|  |         let tr = lines.at(y - 1).at(x + 1) | ||||||
|  |         let bl = lines.at(y + 1).at(x - 1) | ||||||
|  |         let br = lines.at(y + 1).at(x + 1) | ||||||
|  |         let tlbr = (tl, br) | ||||||
|  |         let bltr = (bl, tr) | ||||||
|  |         if tlbr in perms and bltr in perms { | ||||||
|  |           positions.push((x, y)) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   canvas({ | ||||||
|  |     for y in range(h) { | ||||||
|  |       for x in range(w) { | ||||||
|  |         let valid = (x, y) in positions | ||||||
|  |         if valid { | ||||||
|  |           draw.circle( | ||||||
|  |             (x, y), | ||||||
|  |             radius: 0.3, | ||||||
|  |             stroke: red, | ||||||
|  |             name: str(x) + "-" + str(y) | ||||||
|  |           ) | ||||||
|  |           for dy in (-1, 1) { | ||||||
|  |             for dx in (-1, 1) { | ||||||
|  |               draw.line( | ||||||
|  |                 str(x) + "-" + str(y), | ||||||
|  |                 (x + dx * 0.75, y + dy * 0.75), | ||||||
|  |                 stroke: red | ||||||
|  |               ) | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |         draw.content( | ||||||
|  |           (x, y), | ||||||
|  |           lines.at(y).at(x) | ||||||
|  |         ) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
| #show-puzzle( | #show-puzzle( | ||||||
|   4, 2, |   4, 2, | ||||||
|   solve, |   solve, | ||||||
|   example: 9 |   example: 9, | ||||||
|  |   visualize: visualize | ||||||
| ) | ) | ||||||
							
								
								
									
										
											BIN
										
									
								
								src/main.pdf
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/main.pdf
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user