commit 34d2054c21ea28003ba7846820ce159220acf450 Author: LordBaryhobal Date: Sun Dec 1 12:50:55 2024 +0100 day 1 puzzle 1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..593cda8 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +res/inputs/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..71c33f1 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# Advent of Code + +This repo contains my attempt at this year's Advent of Code (2024) + +I will try and do some problems (probably not all of them) using Typst + +## Progress: +#### Stars: 0 / 50 +| Mon | Tue | Wed | Thu | Fri | Sat | Sun | +|:------------------:|:-----------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:| +| | | | | | | 1
:star: | +| 2 | 3 | 4 | 5 | 6 | 7 | 8 | +| 9 | 10 | 11 | 12 | 13 | 14 | 15 | +| 16 | 17 | 18 | 19 | 20 | 21 | 22 | +| 23 | 24 | 25 | | | | | \ No newline at end of file diff --git a/res/examples/day1.txt b/res/examples/day1.txt new file mode 100644 index 0000000..dfca0b1 --- /dev/null +++ b/res/examples/day1.txt @@ -0,0 +1,6 @@ +3 4 +4 3 +2 5 +1 3 +3 9 +3 3 \ No newline at end of file diff --git a/src/day1/puzzle1.typ b/src/day1/puzzle1.typ new file mode 100644 index 0000000..008842f --- /dev/null +++ b/src/day1/puzzle1.typ @@ -0,0 +1,21 @@ +#import "/src/utils.typ": * + +#let solve(input) = { + let lines = input.split("\n") + let (l1, l2) = ((), ()) + let reg = regex("^(\d+)\s+(\d+)$") + for line in lines { + let digits = line.match(reg) + l1.push(int(digits.captures.first())) + l2.push(int(digits.captures.last())) + } + + let total = l1.sorted().zip(l2.sorted()).map(((a, b)) => calc.abs(a - b)).sum() + return total +} + +#show-puzzle( + 1, + solve, + example: 11 +) \ No newline at end of file diff --git a/src/day1/puzzle2.typ b/src/day1/puzzle2.typ new file mode 100644 index 0000000..e69de29 diff --git a/src/main.pdf b/src/main.pdf new file mode 100644 index 0000000..3c3915d Binary files /dev/null and b/src/main.pdf differ diff --git a/src/main.typ b/src/main.typ new file mode 100644 index 0000000..3d466b6 --- /dev/null +++ b/src/main.typ @@ -0,0 +1,108 @@ +#import "@preview/cetz:0.3.1": canvas, draw +#import "/src/utils.typ": * + +#set document( + title: "Advent of Code 2024", + author: "Lord Baryhobal", + date: datetime.today() +) +#show: template + +#align(center, text(size: 2em)[*Advent of Code*]) +#align(center, text(size: 1.5em)[*--- 2024 ---*]) + +#v(1cm) + +#align(center, text(size: 1.2em)[_by Lord Baryhobal_]) + +#v(2cm) + +/* +#align(center, canvas({ + draw.merge-path( + { + draw.line((-0.5, 0), (0.5, 0), (0.5, 1)) + draw.arc-through((), (1.3, 0.9), (2, 1.2)) + draw.arc-through((), (1.3, 1.4), (0.5, 2)) + draw.arc-through((), (1.35, 1.8), (1.9, 1.9)) + draw.arc-through((), (1.3, 2.1), (0.4, 3)) + draw.arc-through((), (0.9, 2.7), (1.5, 2.8)) + draw.arc-through((), (0.5, 3.5), (0, 4.5)) + + draw.arc-through((), (-0.5, 3.5), (-1.5, 2.8)) + draw.arc-through((), (-0.9, 2.7), (-0.4, 3)) + draw.arc-through((), (-1.3, 2.1), (-1.9, 1.9)) + draw.arc-through((), (-1.35, 1.8), (-0.5, 2)) + draw.arc-through((), (-1.3, 1.4), (-2, 1.2)) + draw.arc-through((), (-1.3, 0.9), (-0.5, 1)) + }, + close: true, + fill: gradient.linear( + angle: 90deg, + rgb("#35AA48"), + rgb("#2C883A") + ), + stroke: none + ) + draw.rect( + (-0.5, 0), + (0.5, 0.9), + fill: rgb("#63584B"), + stroke: none + ) +}))*/ + + +#v(1fr) + +#context { + let stars = star-state.final() + let star-cnt = stars.values().sum(default: 0) + let first-weekday = datetime( + year: 2024, + month: 12, + day: 1 + ).weekday() + let cells = ([],) * (first-weekday - 1) + + for i in range(1, 26) { + let cell = [#i] + if str(i) in stars.keys() { + cell = stack( + dir: ttb, + spacing: 0.2em, + cell, + h(3pt) + ((emoji.star,)* stars.at(str(i))).join() + ) + cell = link(label("day-" + str(i)), cell) + } + + cells.push(cell) + } + + [*Stars: #star-cnt / 50*] + table( + columns: (1fr,)*7, + inset: 0.8em, + align: center + horizon, + fill: (_, y) => if y > 0 and calc.rem(y, 2) == 0 {gray.lighten(70%)}, + table.header([*Mon*], [*Tue*], [*Wed*], [*Thu*], [*Fri*], [*Sat*], [*Sun*]), + ..cells + ) +} + +#pagebreak() + +#box( + inset: 1em, + stroke: black, + width: 100%, + columns( + 2, + outline( + indent: 1em + ) + ) +) + +#make-day(1, stars: 1) \ No newline at end of file diff --git a/src/utils.typ b/src/utils.typ new file mode 100644 index 0000000..68f8de8 --- /dev/null +++ b/src/utils.typ @@ -0,0 +1,88 @@ +#let star-cnt = counter("stars") +#let star-state = state("stars", (:)) + +#let get-input-path(day) = { + return "/res/inputs/day" + str(day) + ".txt" +} + +#let get-example-path(day, suffix: none) = { + let suffix = if suffix != none {"_" + str(suffix)} else {""} + return "/res/examples/day" + str(day) + str(suffix) + ".txt" +} + +#let get-input(day) = { + return read(get-input-path(day)) +} + +#let check-example(day, func, target-result, suffix: none) = { + let result = (func)(read(get-example-path(day, suffix: suffix))) + /*assert( + result == target-result, + message: "Expected '" + repr(target-result) + "' got '" + repr(result) + "'" + )*/ + let passes = (result == target-result) + let name = if suffix == none [Example] else [Example '#suffix'] + box( + inset: (x: 1.2em, y: 0.6em), + radius: 1.2em, + fill: if passes {green.lighten(20%)} else {red.lighten(20%)}, + if passes [#name passes] else [#name fails] + ) + h(0.6em) +} + +#let show-result(result) = { + box( + inset: (x: 1.2em, y: 0.6em), + radius: 1.2em, + fill: blue.lighten(20%), + text(fill: white)[Result: #result] + ) +} + +#let show-puzzle(puzzle, func, example: none) = { + if example != none { + if type(example) == dictionary { + for (suffix, result) in example.pairs() { + check-example(puzzle, func, result, suffix: suffix) + } + } else { + check-example(puzzle, func, example) + } + linebreak() + } + + let input = get-input(1) + let result = (func)(input) + show-result(result) +} + +#let day-template(day, puzzle1, puzzle2, stars: 0) = { + pagebreak(weak: true) + let title = [Day #day] + ((emoji.star,)*stars).join() + [ + = #title + #label("day-" + str(day)) + ] // Newline required to avoid attaching the label to the text + heading(level: 2)[Puzzle 1] + puzzle1 + + heading(level: 2)[Puzzle 2] + puzzle2 +} + +#let make-day(day, stars: 0) = { + star-state.update(s => s + (str(day): stars)) + star-cnt.update(v => v + stars) + day-template( + stars: stars, + day, + include("/src/day" + str(day) + "/puzzle1.typ"), + include("/src/day" + str(day) + "/puzzle2.typ"), + ) +} + +#let template(body) = { + set text(font: "Source Sans 3") + body +} \ No newline at end of file