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
 | 
			
		||||
11:
 | 
			
		||||
  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