From 6071366ed67fe85dce0ce1d492b37252841ddb5a Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Sat, 7 Dec 2024 12:04:13 +0100 Subject: [PATCH] tried multiple things for day 6 puzzle 2 --- src/day6/puzzle1.typ | 77 ++++++- src/day6/puzzle2.typ | 495 +++++++++++++++++++++++++++++++++++++++++++ src/main.pdf | Bin 83039 -> 100625 bytes src/utils.pdf | Bin 2193 -> 0 bytes 4 files changed, 570 insertions(+), 2 deletions(-) delete mode 100644 src/utils.pdf diff --git a/src/day6/puzzle1.typ b/src/day6/puzzle1.typ index 1258c6e..14135e7 100644 --- a/src/day6/puzzle1.typ +++ b/src/day6/puzzle1.typ @@ -1,4 +1,5 @@ #import "/src/utils.typ": * +#import "@preview/cetz:0.3.1": canvas, draw #let offsets = ( (0, -1), @@ -21,7 +22,7 @@ let oy = 0 let found-start = false for y in range(h) { - for x in range(h) { + for x in range(w) { if grid.at(y).at(x) == "^" { ox = x oy = y @@ -72,8 +73,80 @@ return count } +#let visualize(input) = { + let grid = input.split("\n").map(l => l.clusters()) + + let w = grid.first().len() + let h = grid.len() + + canvas(length: 2em, { + let (ox, oy) = (0, 0) + for y in range(h) { + for x in range(w) { + let c = grid.at(y).at(x) + draw.circle( + (x, -y), + radius: if c == "#" {0.4} else {0.2}, + fill: if c == "#" { + red + } else if c == "^" { + green + } else { + gray.lighten(40%) + } + ) + if c == "^" { + (ox, oy) = (x, y) + } + } + } + + let x = ox + let y = oy + let dir = 0 + let path = () + let (dx, dy) = offsets.at(dir) + while in-grid(x, y, w, h) { + path.push((x, y)) + + let x2 = x + dx + let y2 = y + dy + if not in-grid(x2, y2, w, h) { + break + } + + for _ in range(4) { + let next = grid.at(y2).at(x2) + + if next == "#" { + dir = calc.rem(dir + 1, 4) + (dx, dy) = offsets.at(dir) + x2 = x + dx + y2 = y + dy + } else { + break + } + } + + let col = if path.len() == 1 {green} else {blue} + draw.line( + (x, -y), + (x2, -y2), + mark: (end: ">"), + fill: col, + stroke: col + ) + + x = x2 + y = y2 + } + //draw.line(..path, stroke: blue) + }) +} + #show-puzzle( 6, 1, solve, - example: 41 + example: 41, + visualize: visualize ) \ No newline at end of file diff --git a/src/day6/puzzle2.typ b/src/day6/puzzle2.typ index e69de29..5b2d8be 100644 --- a/src/day6/puzzle2.typ +++ b/src/day6/puzzle2.typ @@ -0,0 +1,495 @@ +#import "/src/utils.typ": * +#import "@preview/cetz:0.3.1": canvas, draw + +#let offsets = ( + (0, -1), + (1, 0), + (0, 1), + (-1, 0) +) + +#let in-grid(x, y, w, h) = { + return 0 <= x and x < w and 0 <= y and y < h +} + +#let puzzle1(grid, w, h) = { + let ox = 0 + let oy = 0 + let found-start = false + for y in range(h) { + for x in range(w) { + if grid.at(y).at(x) == "^" { + ox = x + oy = y + found-start = true + break + } + } + if found-start { + break + } + } + let path = () + + let x = ox + let y = oy + let dir = 0 + let count = 1 + let (dx, dy) = offsets.at(dir) + while in-grid(x, y, w, h) { + if grid.at(y).at(x) != "v" { + path.push((x, y, dir)) + } + let x2 = x + dx + let y2 = y + dy + if not in-grid(x2, y2, w, h) { + break + } + + for _ in range(4) { + let next = grid.at(y2).at(x2) + + if next == "#" { + dir = calc.rem(dir + 1, 4) + (dx, dy) = offsets.at(dir) + x2 = x + dx + y2 = y + dy + } else { + break + } + } + + x = x2 + y = y2 + } + + return path +} + +/* +#let get-next-obstacle(grid, w, h, ox, oy, dir) = { + let (dx, dy) = offsets.at(dir) + let (x, y) = (ox, oy) + while in-grid(x, y, w, h) { + if grid.at(y).at(x) == "#" { + return (x - dx, y - dy) + } + x += dx + y += dy + } + return none +} + +#let puzzle1(grid, w, h) = { + let ox = 0 + let oy = 0 + let found-start = false + for y in range(h) { + for x in range(w) { + if grid.at(y).at(x) == "^" { + ox = x + oy = y + found-start = true + break + } + } + if found-start { + break + } + } + let path = () + + let x = ox + let y = oy + let dir = 0 + let count = 1 + let (dx, dy) = offsets.at(dir) + while in-grid(x, y, w, h) { + path.push((x, y, dir)) + let x2 = x + dx + let y2 = y + dy + if not in-grid(x2, y2, w, h) { + break + } + + for _ in range(4) { + let next = grid.at(y2).at(x2) + + if next == "#" { + dir = calc.rem(dir + 1, 4) + (dx, dy) = offsets.at(dir) + x2 = x + dx + y2 = y + dy + } else { + break + } + } + + x = x2 + y = y2 + } + + return path +} + +#let solve(input) = { + let grid = input.split("\n").map(l => l.clusters()) + + let w = grid.first().len() + let h = grid.len() + let obstacles = () + + for y in range(h) { + for x in range(w) { + if grid.at(y).at(x) == "#" { + obstacles.push((x, y)) + } + } + } + + let get-next-obstacle = get-next-obstacle.with( + grid, w, h + ) + + let path = puzzle1(grid, w, h) + + let count = 0 + for (ox, oy) in obstacles { + for odir in range(4) { + let dir = odir + let (dx, dy) = offsets.at(dir) + let (x, y) = (ox + dx, oy + dy) + if not in-grid(x, y, w, h) { + continue + } + let found = true + let in-path = false + let (min-x, min-y) = (w, h) + let (max-x, max-y) = (0, 0) + let corner-obstacles = () + corner-obstacles.push((ox, oy)) + for _ in range(3) { + let next = get-next-obstacle(x, y, calc.rem(dir + 3, 4)) + dir = calc.rem(dir + 1, 4) + if next == none { + found = false + break + } else { + (x, y) = next + min-x = calc.min(min-x, x) + min-y = calc.min(min-y, y) + max-x = calc.max(max-x, x) + max-y = calc.max(max-y, y) + if corner-in-path(path, x, y, ) + } + } + if found { + count += 1 + } + } + } + return count +}*/ + +#let solve(input) = { + let grid = input.split("\n").map(l => l.clusters()) + + let w = grid.first().len() + let h = grid.len() + + let ox = 0 + let oy = 0 + let found-start = false + for y in range(h) { + for x in range(w) { + if grid.at(y).at(x) == "^" { + ox = x + oy = y + found-start = true + break + } + } + if found-start { + break + } + } + let path = () + + let x = ox + let y = oy + let dir = 0 + let count = 1 + let (dx, dy) = offsets.at(dir) + while in-grid(x, y, w, h) { + path.push((x, y, dir)) + + if path.len() >= 3 { + let anchor = path.at(path.len() - 3) + if ((dx == 0 and y == anchor.last()) or + (dy == 0 and x == anchor.first())) { + + + } + } + + let x2 = x + dx + let y2 = y + dy + if not in-grid(x2, y2, w, h) { + break + } + + for _ in range(4) { + let next = grid.at(y2).at(x2) + + if next == "#" { + dir = calc.rem(dir + 1, 4) + (dx, dy) = offsets.at(dir) + x2 = x + dx + y2 = y + dy + } else { + break + } + } + + x = x2 + y = y2 + } + + return path +} + +#let has-loop(grid, w, h, ox, oy, tx, ty, dir) = { + let grid = grid + grid.at(ty).at(tx) = "#" + + let x = ox + let y = oy + let visited = () + let (dx, dy) = offsets.at(dir) + while in-grid(x, y, w, h) { + grid.at(y).at(x) = "v" + let e = (x, y, dir) + if e in visited { + return true + } + visited.push(e) + + let x2 = x + dx + let y2 = y + dy + if not in-grid(x2, y2, w, h) { + break + } + + for _ in range(4) { + let next = grid.at(y2).at(x2) + + if next == "#" { + dir = calc.rem(dir + 1, 4) + (dx, dy) = offsets.at(dir) + x2 = x + dx + y2 = y + dy + } else { + break + } + } + + x = x2 + y = y2 + } + + return false +} + +#let solve-bruteforce(input) = { + let grid = input.split("\n").map(l => l.clusters()) + + let w = grid.first().len() + let h = grid.len() + + let ox = 0 + let oy = 0 + let found-start = false + for y in range(h) { + for x in range(w) { + if grid.at(y).at(x) == "^" { + ox = x + oy = y + found-start = true + break + } + } + if found-start { + break + } + } + + let path = puzzle1(grid, w, h) + + let count = 0 + for (x, y, dir) in path { + let (dx, dy) = offsets.at(dir) + let (tx, ty) = (x + dx, y + dy) + if not in-grid(tx, ty, w, h) { + continue + } + if grid.at(ty).at(tx) != "." { + continue + } + if has-loop(grid, w, h, x, y, tx, ty, dir) { + grid.at(ty).at(tx) = "O" + count += 1 + } + } + + return count +} + +#let rejoins-path( + grid, w, h, path, + ox, oy, tx, ty, dir, + path-grid, si +) = { + let grid = grid + grid.at(ty).at(tx) = "#" + let (x, y) = (ox, oy) + let dir = dir + let (dx, dy) = offsets.at(dir) + let visited = () + + while in-grid(x, y, w, h) { + let (x2, y2) = (x + dx, y + dy) + + if not in-grid(x2, y2, w, h) { + return false + } + + let visits = path-grid.at(y2).at(x2) + if visits.at(str(dir), default: calc.inf) < si { + return true + } + let e = (x, y, dir) + if e in visited { + return true + } + visited.push(e) + + if grid.at(y2).at(x2) == "#" { + dir = calc.rem(dir + 1, 4) + (dx, dy) = offsets.at(dir) + } else { + (x, y) = (x2, y2) + } + } + return false +} + +#let solve(input) = { + let grid = input.split("\n").map(l => l.clusters()) + + let w = grid.first().len() + let h = grid.len() + + let path-grid = ( + ( + (:), + ) * w, + ) * h + + let path = puzzle1(grid, w, h) + + for (i, (x, y, dir)) in path.enumerate() { + path-grid.at(y).at(x).insert(str(dir), i) + } + let count = 0 + let max = (h, w, h, w) + for (i, (x, y, dir)) in path.enumerate() { + let (dx, dy) = offsets.at(dir) + let (tx, ty) = (x + dx, y + dy) + if not in-grid(tx, ty, w, h) or grid.at(ty).at(tx) != "." { + continue + } + let dir2 = calc.rem(dir + 1, 4) + if rejoins-path( + grid, w, h, path, + x, y, tx, ty, dir2, + path-grid, i + ) { + count += 1 + grid.at(ty).at(tx) = "O" + } + } + + //return raw(block: true, grid.map(l => l.join("")).join("\n")) + return count +} + +#let visualize(input) = { + let grid = input.split("\n").map(l => l.clusters()) + + let w = grid.first().len() + let h = grid.len() + + canvas(length: 2em, { + let (ox, oy) = (0, 0) + for y in range(h) { + for x in range(w) { + let c = grid.at(y).at(x) + draw.circle( + (x, -y), + radius: if c == "#" {0.4} else {0.2}, + fill: if c == "#" { + red + } else if c == "^" { + green + } else { + gray.lighten(40%) + } + ) + if c == "^" { + (ox, oy) = (x, y) + } + } + } + let path = puzzle1(grid, w, h) + let count = 0 + for (i, (x, y, dir)) in path.enumerate() { + if i != 0 { + let col = if i == 1 {green} else {blue} + draw.line( + (path.at(i - 1).first(), -path.at(i - 1).at(1)), + (x, -y), + stroke: col, + fill: col, + mark: (end: ">") + ) + } + + let (dx, dy) = offsets.at(dir) + let (tx, ty) = (x + dx, y + dy) + if not in-grid(tx, ty, w, h) { + continue + } + if grid.at(ty).at(tx) != "." { + continue + } + if has-loop(grid, w, h, x, y, tx, ty, dir) { + grid.at(ty).at(tx) = "O" + draw.circle( + (tx, -ty), + radius: 0.4, + stroke: blue + ) + } + } + }) +} + +#show-puzzle( + 6, 2, + solve,//solve-bruteforce, + example: 6, + visualize: visualize, + only-example: true +) + +//#solve(get-input(6)) \ No newline at end of file diff --git a/src/main.pdf b/src/main.pdf index 8bf5bbfe23e7f63fc5ff63756ddb7b9c18135420..901d7ef4b5090170610bbcccf4b28c28a560e679 100644 GIT binary patch delta 23009 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 delta 5254 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 oU6S2AsqODtCq?Nc71 z50Fc5eTN?ULIwH?on8HqlI^s-X!o0MW@l!1W^^+4hYh3IQBJ1u^VGXGL9^uOvFAQQH;-MiLP~k?4I2;J9Zm&TSl|n?R9SiXFxL!N(E}| zv?ipWD;AOhnLFrRmQkQw-zc7^kSr1oC_HLrwpb5;%P?LiqZWRO#aP9YHmM|#sRoBEr*B&L}!&OY@W zQ#V_NsoQ$TvUL5kp04IxzQe2FqIS*h z+Y(~FCmhYmGS2$yKY#wEqB!cSzu18uI@Z{JyUOv$19|T!8AiELu1df4EhHU0=QBJa;s0yK2O`D`@2cU3@@{H=hO8=>+b63 zeqZVyQn$*Ztl&5c$^THUQQatX7L=u!dpOUNIK<+*Gzi7jDv=9&2YTlx!U_<3&_Z3o zsbj)Yg0tlc`sd~Wo#CbDYU1WMs{;Z=40(4xigsIghK#EQY=fFWhYbanU(a`OIi_%G3PeAEB{