added visualization for day 4 puzzle 1
This commit is contained in:
		| @@ -1,10 +1,11 @@ | ||||
| #import "/src/utils.typ": * | ||||
| #import "@preview/cetz:0.3.1": canvas, draw | ||||
|  | ||||
| #let check-xmas(lines, ox, oy) = { | ||||
|   let w = lines.first().len() | ||||
|   let h = lines.len() | ||||
|  | ||||
|   let total = 0 | ||||
|   let dirs = () | ||||
|   for dy in (-1, 0, 1) { | ||||
|     for dx in (-1, 0, 1) { | ||||
|       if dx == 0 and dy == 0 { | ||||
| @@ -26,11 +27,11 @@ | ||||
|         } | ||||
|       } | ||||
|       if buffer == "XMAS" { | ||||
|         total += 1 | ||||
|         dirs.push((dx, dy)) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   return total | ||||
|   return dirs | ||||
| } | ||||
|  | ||||
| #let solve(input) = { | ||||
| @@ -42,7 +43,7 @@ | ||||
|   for y in range(h) { | ||||
|     for x in range(w) { | ||||
|       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 | ||||
| } | ||||
|  | ||||
| #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( | ||||
|   4, 1, | ||||
|   solve, | ||||
|   example: 18 | ||||
|   example: 18, | ||||
|   visualize: visualize | ||||
| ) | ||||
		Reference in New Issue
	
	Block a user