Compare commits
	
		
			2 Commits
		
	
	
		
			a6edde9139
			...
			c23ff2ea4b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c23ff2ea4b | |||
| 60a9ee3d2d | 
							
								
								
									
										
											BIN
										
									
								
								progress.png
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								progress.png
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 122 KiB | 
| @@ -20,3 +20,5 @@ | |||||||
|   stars: 2 |   stars: 2 | ||||||
| 11: | 11: | ||||||
|   stars: 2 |   stars: 2 | ||||||
|  | 12: | ||||||
|  |   stars: 2 | ||||||
							
								
								
									
										4
									
								
								res/examples/day12_1.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								res/examples/day12_1.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | AAAA | ||||||
|  | BBCD | ||||||
|  | BBCC | ||||||
|  | EEEC | ||||||
							
								
								
									
										5
									
								
								res/examples/day12_2.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								res/examples/day12_2.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | OOOOO | ||||||
|  | OXOXO | ||||||
|  | OOOOO | ||||||
|  | OXOXO | ||||||
|  | OOOOO | ||||||
							
								
								
									
										10
									
								
								res/examples/day12_3.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								res/examples/day12_3.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | RRRRIICCFF | ||||||
|  | RRRRIICCCF | ||||||
|  | VVRRRCCFFF | ||||||
|  | VVRCCCJFFF | ||||||
|  | VVVVCJJCFE | ||||||
|  | VVIVCCJJEE | ||||||
|  | VVIIICJJEE | ||||||
|  | MIIIIIJJEE | ||||||
|  | MIIISIJEEE | ||||||
|  | MMMISSJEEE | ||||||
							
								
								
									
										5
									
								
								res/examples/day12_4.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								res/examples/day12_4.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | EEEEE | ||||||
|  | EXXXX | ||||||
|  | EEEEE | ||||||
|  | EXXXX | ||||||
|  | EEEEE | ||||||
							
								
								
									
										6
									
								
								res/examples/day12_5.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								res/examples/day12_5.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | AAAAAA | ||||||
|  | AAABBA | ||||||
|  | AAABBA | ||||||
|  | ABBAAA | ||||||
|  | ABBAAA | ||||||
|  | AAAAAA | ||||||
							
								
								
									
										68
									
								
								src/day12/puzzle1.typ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								src/day12/puzzle1.typ
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | |||||||
|  | #import "/src/utils.typ": * | ||||||
|  |  | ||||||
|  | #let offsets = ( | ||||||
|  |   (-1, 0), | ||||||
|  |   (0, -1), | ||||||
|  |   (1, 0), | ||||||
|  |   (0, 1) | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | #let in-grid(w, h, x, y) = { | ||||||
|  |   return 0 <= x and x < w and 0 <= y and y < h | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #let solve(input) = { | ||||||
|  |   let grid = input.split("\n").map(l => l.clusters()) | ||||||
|  |   let w = grid.first().len() | ||||||
|  |   let h = grid.len() | ||||||
|  |   let in-grid = in-grid.with(w, h) | ||||||
|  |  | ||||||
|  |   let visited = ((false,) * w,) * h | ||||||
|  |   let total = 0 | ||||||
|  |  | ||||||
|  |   for y in range(h) { | ||||||
|  |     for x in range(w) { | ||||||
|  |       if visited.at(y).at(x) { | ||||||
|  |         continue | ||||||
|  |       } | ||||||
|  |       let char = grid.at(y).at(x) | ||||||
|  |       let cells = () | ||||||
|  |       let borders = 0 | ||||||
|  |       let next-cells = ((x, y),) | ||||||
|  |       while next-cells.len() != 0 { | ||||||
|  |         let (cx, cy) = next-cells.remove(0) | ||||||
|  |         cells.push((cx, cy)) | ||||||
|  |         visited.at(cy).at(cx) = true | ||||||
|  |         for (dx, dy) in offsets { | ||||||
|  |           let (x2, y2) = (cx + dx, cy + dy) | ||||||
|  |           if (x2, y2) in cells or (x2, y2) in next-cells { | ||||||
|  |             continue | ||||||
|  |           } | ||||||
|  |           if in-grid(x2, y2) { | ||||||
|  |             let char2 = grid.at(y2).at(x2) | ||||||
|  |             if char2 == char { | ||||||
|  |               next-cells.push((x2, y2)) | ||||||
|  |             } else { | ||||||
|  |               borders += 1 | ||||||
|  |             } | ||||||
|  |           } else { | ||||||
|  |             borders += 1 | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       total += borders * cells.len() | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return total | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #show-puzzle( | ||||||
|  |   12, 1, | ||||||
|  |   solve, | ||||||
|  |   example: ( | ||||||
|  |     "1": 140, | ||||||
|  |     "2": 772, | ||||||
|  |     "3": 1930 | ||||||
|  |   ) | ||||||
|  | ) | ||||||
							
								
								
									
										151
									
								
								src/day12/puzzle2.typ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								src/day12/puzzle2.typ
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,151 @@ | |||||||
|  | #import "/src/utils.typ": * | ||||||
|  |  | ||||||
|  | #let offsets = ( | ||||||
|  |   (-1, 0), | ||||||
|  |   (0, -1), | ||||||
|  |   (1, 0), | ||||||
|  |   (0, 1) | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | #let in-grid(w, h, x, y) = { | ||||||
|  |   return 0 <= x and x < w and 0 <= y and y < h | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #let solve(input) = { | ||||||
|  |   let grid = input.split("\n").map(l => l.clusters()) | ||||||
|  |   let w = grid.first().len() | ||||||
|  |   let h = grid.len() | ||||||
|  |   let in-grid = in-grid.with(w, h) | ||||||
|  |  | ||||||
|  |   let zone-grid = ((none,) * w,) * h | ||||||
|  |   let zone-id = 0 | ||||||
|  |   let zone-sides = () | ||||||
|  |   let zone-areas = () | ||||||
|  |  | ||||||
|  |   for y in range(h) { | ||||||
|  |     for x in range(w) { | ||||||
|  |       if zone-grid.at(y).at(x) != none { | ||||||
|  |         continue | ||||||
|  |       } | ||||||
|  |       let char = grid.at(y).at(x) | ||||||
|  |       let area = 0 | ||||||
|  |       let borders = 0 | ||||||
|  |       let next-cells = ((x, y),) | ||||||
|  |  | ||||||
|  |       while next-cells.len() != 0 { | ||||||
|  |         let (cx, cy) = next-cells.remove(0) | ||||||
|  |         zone-grid.at(cy).at(cx) = zone-id | ||||||
|  |         area += 1 | ||||||
|  |         for (dx, dy) in offsets { | ||||||
|  |           let (x2, y2) = (cx + dx, cy + dy) | ||||||
|  |           if (x2, y2) in next-cells { | ||||||
|  |             continue | ||||||
|  |           } | ||||||
|  |           if in-grid(x2, y2) { | ||||||
|  |             if zone-grid.at(y2).at(x2) == zone-id { | ||||||
|  |               continue | ||||||
|  |             } | ||||||
|  |             let char2 = grid.at(y2).at(x2) | ||||||
|  |             if char2 == char { | ||||||
|  |               next-cells.push((x2, y2)) | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       zone-areas.push(area) | ||||||
|  |       zone-sides.push(0) | ||||||
|  |       zone-id += 1 | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   let first-zone0 = -1 | ||||||
|  |   let last-zone0 = -1 | ||||||
|  |   for y in range(h) { | ||||||
|  |     let first-zone = zone-grid.at(y).at(0) | ||||||
|  |     let last-zone = zone-grid.at(y).at(w - 1) | ||||||
|  |     if first-zone0 != first-zone { | ||||||
|  |       zone-sides.at(first-zone) += 1 | ||||||
|  |     } | ||||||
|  |     if last-zone0 != last-zone { | ||||||
|  |       zone-sides.at(last-zone) += 1 | ||||||
|  |     } | ||||||
|  |     first-zone0 = first-zone | ||||||
|  |     last-zone0 = last-zone | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   first-zone0 = -1 | ||||||
|  |   last-zone0 = -1 | ||||||
|  |   for x in range(w) { | ||||||
|  |     let first-zone = zone-grid.at(0).at(x) | ||||||
|  |     let last-zone = zone-grid.at(h - 1).at(x) | ||||||
|  |     if first-zone0 != first-zone { | ||||||
|  |       zone-sides.at(first-zone) += 1 | ||||||
|  |     } | ||||||
|  |     if last-zone0 != last-zone { | ||||||
|  |       zone-sides.at(last-zone) += 1 | ||||||
|  |     } | ||||||
|  |     first-zone0 = first-zone | ||||||
|  |     last-zone0 = last-zone | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   for x in range(w - 1) { | ||||||
|  |     let zone-a0 = -1 | ||||||
|  |     let zone-b0 = -1 | ||||||
|  |     for y in range(h) { | ||||||
|  |       let zone-a = zone-grid.at(y).at(x) | ||||||
|  |       let zone-b = zone-grid.at(y).at(x + 1) | ||||||
|  |       if zone-a != zone-b { | ||||||
|  |         if zone-a != zone-a0 { | ||||||
|  |           zone-sides.at(zone-a) += 1 | ||||||
|  |         } | ||||||
|  |         if zone-b != zone-b0 { | ||||||
|  |           zone-sides.at(zone-b) += 1 | ||||||
|  |         } | ||||||
|  |         zone-a0 = zone-a | ||||||
|  |         zone-b0 = zone-b | ||||||
|  |       } else { | ||||||
|  |         zone-a0 = -1 | ||||||
|  |         zone-b0 = -1 | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   for y in range(h - 1) { | ||||||
|  |     let zone-a0 = -1 | ||||||
|  |     let zone-b0 = -1 | ||||||
|  |     for x in range(w) { | ||||||
|  |       let zone-a = zone-grid.at(y).at(x) | ||||||
|  |       let zone-b = zone-grid.at(y + 1).at(x) | ||||||
|  |       if zone-a != zone-b { | ||||||
|  |         if zone-a != zone-a0 { | ||||||
|  |           zone-sides.at(zone-a) += 1 | ||||||
|  |         } | ||||||
|  |         if zone-b != zone-b0 { | ||||||
|  |           zone-sides.at(zone-b) += 1 | ||||||
|  |         } | ||||||
|  |         zone-a0 = zone-a | ||||||
|  |         zone-b0 = zone-b | ||||||
|  |       } else { | ||||||
|  |         zone-a0 = -1 | ||||||
|  |         zone-b0 = -1 | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   let total = range(zone-id).map(i => { | ||||||
|  |     zone-sides.at(i) * zone-areas.at(i) | ||||||
|  |   }) | ||||||
|  |   return total.sum() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #show-puzzle( | ||||||
|  |   12, 2, | ||||||
|  |   solve, | ||||||
|  |   example: ( | ||||||
|  |     "1": 80, | ||||||
|  |     "2": 436, | ||||||
|  |     "3": 1206, | ||||||
|  |     "4": 236, | ||||||
|  |     "5": 368 | ||||||
|  |   ) | ||||||
|  | ) | ||||||
							
								
								
									
										
											BIN
										
									
								
								src/main.pdf
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/main.pdf
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user