88 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Typst
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Typst
		
	
	
	
	
	
| #import "/src/utils.typ": *
 | |
| #import "@preview/cetz:0.3.1": canvas, draw
 | |
| 
 | |
| #let solve(input) = {
 | |
|   let lines = input.split("\n")
 | |
|   let w = lines.first().len()
 | |
|   let h = lines.len()
 | |
| 
 | |
|   let perms = (("M", "S"), ("S", "M"))
 | |
|   let total = 0
 | |
|   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 {
 | |
|           total += 1
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   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(length: 2em, {
 | |
|     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(
 | |
|   4, 2,
 | |
|   solve,
 | |
|   example: 9,
 | |
|   visualize: visualize
 | |
| ) |