From 34d2054c21ea28003ba7846820ce159220acf450 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Sun, 1 Dec 2024 12:50:55 +0100 Subject: [PATCH] day 1 puzzle 1 --- .gitignore | 1 + README.md | 15 ++++++ res/examples/day1.txt | 6 +++ src/day1/puzzle1.typ | 21 ++++++++ src/day1/puzzle2.typ | 0 src/main.pdf | Bin 0 -> 24391 bytes src/main.typ | 108 ++++++++++++++++++++++++++++++++++++++++++ src/utils.typ | 88 ++++++++++++++++++++++++++++++++++ 8 files changed, 239 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 res/examples/day1.txt create mode 100644 src/day1/puzzle1.typ create mode 100644 src/day1/puzzle2.typ create mode 100644 src/main.pdf create mode 100644 src/main.typ create mode 100644 src/utils.typ 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 0000000000000000000000000000000000000000..3c3915da8ea6770c601d394c96c1086557685c53 GIT binary patch literal 24391 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 literal 0 HcmV?d00001 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