summaryrefslogtreecommitdiff
path: root/2025
diff options
context:
space:
mode:
authormhsn <mail@mhsn.net>2026-03-18 21:48:13 +0000
committermhsn <mail@mhsn.net>2026-03-18 21:48:13 +0000
commit86bac31392a76da84817eec020d2b84d099b3cc1 (patch)
treee2ee52db59b86b914d5b4bcceb19c9b5d899fff4 /2025
parent62fe361fc42dea75deaf7ac31c0ba6ba80e26a9c (diff)
downloadpuzzles-86bac31392a76da84817eec020d2b84d099b3cc1.tar.gz
puzzles-86bac31392a76da84817eec020d2b84d099b3cc1.zip
add other challenges supportHEADmaster
Diffstat (limited to '2025')
-rw-r--r--2025/01/c.c19
-rwxr-xr-x2025/01/python.py15
-rw-r--r--2025/01/rust/Cargo.lock89
-rw-r--r--2025/01/rust/Cargo.toml7
-rw-r--r--2025/01/rust/src/main.rs25
-rwxr-xr-x2025/02/python.py33
-rwxr-xr-x2025/03/python.py21
-rw-r--r--2025/03/rust/Cargo.lock7
-rw-r--r--2025/03/rust/Cargo.toml6
-rw-r--r--2025/03/rust/src/main.rs42
-rwxr-xr-x2025/04/python.py36
-rw-r--r--2025/04/rust/Cargo.lock7
-rw-r--r--2025/04/rust/Cargo.toml6
-rw-r--r--2025/04/rust/src/main.rs66
-rwxr-xr-x2025/05/python.py39
-rw-r--r--2025/05/rust/Cargo.lock7
-rw-r--r--2025/05/rust/Cargo.toml6
-rw-r--r--2025/05/rust/src/main.rs55
-rwxr-xr-x2025/06/python.py18
-rwxr-xr-x2025/07/python.py31
-rwxr-xr-x2025/08/python.py29
-rwxr-xr-x2025/09/python.py13
-rw-r--r--2025/09/rust/Cargo.lock7
-rw-r--r--2025/09/rust/Cargo.toml6
-rw-r--r--2025/09/rust/src/main.rs113
-rw-r--r--2025/10/rust/Cargo.lock155
-rw-r--r--2025/10/rust/Cargo.toml8
-rw-r--r--2025/10/rust/src/main.rs68
-rw-r--r--2025/11/rust/Cargo.lock7
-rw-r--r--2025/11/rust/Cargo.toml6
-rw-r--r--2025/11/rust/src/main.rs84
-rwxr-xr-x2025/12/python.py21
32 files changed, 0 insertions, 1052 deletions
diff --git a/2025/01/c.c b/2025/01/c.c
deleted file mode 100644
index 115ea13..0000000
--- a/2025/01/c.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-int main()
-{
- char dir;
- int64_t n;
- int64_t p = 50;
- int64_t p1 = 0, p2 = 0;
- while (scanf("%c%ld ", &dir, &n) == 2) {
- int64_t new = p + (dir == 'R' ? n : -n);
- p2 += labs(new) / 100 + (p != 0 && new <= 0);
- p = (p = new % 100) >= 0 ? p : p + 100;
- p1 += p == 0;
- }
- printf("silver: %ld\ngold: %ld", p1, p2);
- return 0;
-}
diff --git a/2025/01/python.py b/2025/01/python.py
deleted file mode 100755
index d5ff1fa..0000000
--- a/2025/01/python.py
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env python3
-
-from fileinput import input
-from itertools import accumulate
-
-
-def fn(p: tuple[int, int], rot: str) -> tuple[int, int]:
- x = p[0] + int(rot[1:]) * (1 if rot[0] == "R" else -1)
- return x % 100, abs(x) // 100 + (p[0] and x <= 0)
-
-
-p1, p2 = zip(*list(accumulate(input(), fn, initial=(50, 0))))
-
-print(f"silver: {sum(not p for p in p1)}")
-print(f"gold: {sum(p2)}")
diff --git a/2025/01/rust/Cargo.lock b/2025/01/rust/Cargo.lock
deleted file mode 100644
index 15ca0d7..0000000
--- a/2025/01/rust/Cargo.lock
+++ /dev/null
@@ -1,89 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "aoc_2025-01"
-version = "0.1.0"
-dependencies = [
- "num",
-]
-
-[[package]]
-name = "autocfg"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
-
-[[package]]
-name = "num"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
-dependencies = [
- "num-bigint",
- "num-complex",
- "num-integer",
- "num-iter",
- "num-rational",
- "num-traits",
-]
-
-[[package]]
-name = "num-bigint"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
-dependencies = [
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-complex"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.46"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-iter"
-version = "0.1.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
-dependencies = [
- "autocfg",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-rational"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
-dependencies = [
- "num-bigint",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
-dependencies = [
- "autocfg",
-]
diff --git a/2025/01/rust/Cargo.toml b/2025/01/rust/Cargo.toml
deleted file mode 100644
index 901af57..0000000
--- a/2025/01/rust/Cargo.toml
+++ /dev/null
@@ -1,7 +0,0 @@
-[package]
-name = "aoc_2025-01"
-version = "0.1.0"
-edition = "2024"
-
-[dependencies]
-num = { version = "0.4.3", features = ["num-bigint"] }
diff --git a/2025/01/rust/src/main.rs b/2025/01/rust/src/main.rs
deleted file mode 100644
index 72b718b..0000000
--- a/2025/01/rust/src/main.rs
+++ /dev/null
@@ -1,25 +0,0 @@
-use num::BigUint;
-use std::io;
-
-fn main() {
- let mut curr = 50;
- let mut silver: u64 = 0;
- let mut gold: BigUint = BigUint::ZERO;
- io::stdin()
- .lines()
- .flatten()
- .map(|line| match line.split_at(1) {
- ("L", n) => -n.parse::<i64>().unwrap(),
- (_, n) => n.parse::<i64>().unwrap(),
- })
- .for_each(|n| {
- let prev = curr;
- curr += n;
- gold += (curr.abs() / 100) as u64 + (prev != 0 && curr <= 0) as u64;
- curr = curr.rem_euclid(100);
- silver += (curr == 0) as u64;
- });
-
- println!("silver: {silver}");
- println!("gold: {gold}");
-}
diff --git a/2025/02/python.py b/2025/02/python.py
deleted file mode 100755
index a3b4d1e..0000000
--- a/2025/02/python.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env python3
-
-
-from itertools import accumulate
-from bisect import bisect_left, bisect_right
-from functools import cache
-
-rs = [(int(a), int(b)) for r in input().split(",") for [a, b] in [r.split("-")]]
-N = max(len(str(x)) for r in rs for x in r)
-
-
-@cache
-def memo(p2: bool):
- ids = sorted(
- {
- int(str(n) * reps)
- for n in range(10 ** (N // 2))
- for reps in range(2, N // len(str(n)) + 1 if p2 else 3)
- }
- )
- sums = list(accumulate(ids))
- return ids[1:], sums
-
-
-def prefix_sum(a: int, b: int, ids: list[int], sums: list[int]):
- return sums[bisect_right(ids, b)] - sums[bisect_left(ids, a)]
-
-
-silver = sum(prefix_sum(*r, *memo(False)) for r in rs)
-gold = sum(prefix_sum(*r, *memo(True)) for r in rs)
-
-print("silver:", silver)
-print("gold:", gold)
diff --git a/2025/03/python.py b/2025/03/python.py
deleted file mode 100755
index b0d4bfd..0000000
--- a/2025/03/python.py
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env python3
-
-from fileinput import input
-
-lines = [[int(b) for b in line.strip()] for line in input()]
-
-
-def jolt(bs: list[int], n: int) -> int:
- if n == 1:
- return max(bs)
- n -= 1
- b = max(bs[:-n])
- i = bs.index(b)
- return b * (10**n) + jolt(bs[i + 1 :], n)
-
-
-silver = sum(jolt(bs, 2) for bs in lines)
-gold = sum(jolt(bs, 12) for bs in lines)
-
-print("silver:", silver)
-print("gold:", gold)
diff --git a/2025/03/rust/Cargo.lock b/2025/03/rust/Cargo.lock
deleted file mode 100644
index 7f2fe0f..0000000
--- a/2025/03/rust/Cargo.lock
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "aoc_2025-03"
-version = "0.1.0"
diff --git a/2025/03/rust/Cargo.toml b/2025/03/rust/Cargo.toml
deleted file mode 100644
index c0441da..0000000
--- a/2025/03/rust/Cargo.toml
+++ /dev/null
@@ -1,6 +0,0 @@
-[package]
-name = "aoc_2025-03"
-version = "0.1.0"
-edition = "2024"
-
-[dependencies]
diff --git a/2025/03/rust/src/main.rs b/2025/03/rust/src/main.rs
deleted file mode 100644
index be0b3e6..0000000
--- a/2025/03/rust/src/main.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-use std::io;
-
-fn max(bs: &Vec<u8>, start: usize, end: usize) -> (u8, usize) {
- let mut bests = [None; 10];
- for idx in start..=end {
- if bs[idx] == 9 {
- return (9, idx);
- }
- bests[bs[idx] as usize].get_or_insert((bs[idx], idx));
- }
- bests.into_iter().flatten().last().unwrap()
-}
-
-fn jolt(bs: &Vec<u8>, n: usize) -> u64 {
- let mut j: u64 = 0;
- let mut start = 0;
- for n in (1..=n).rev() {
- j *= 10;
- let (b, idx) = max(bs, start, bs.len() - n);
- j += b as u64;
- start = idx + 1;
- }
- j
-}
-
-fn main() {
- let (silver, gold) = io::stdin()
- .lines()
- .flatten()
- .map(|line| {
- line.into_bytes()
- .iter()
- .map(|&x| x - b'0')
- .collect::<Vec<u8>>()
- })
- .map(|bs| (jolt(&bs, 2), jolt(&bs, 12)))
- .reduce(|(a0, a1), (x0, x1)| (a0 + x0, a1 + x1))
- .unwrap();
-
- println!("silver: {silver}");
- println!("gold: {gold}");
-}
diff --git a/2025/04/python.py b/2025/04/python.py
deleted file mode 100755
index 844c38e..0000000
--- a/2025/04/python.py
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env python3
-
-from fileinput import input
-
-g = {
- complex(x, y): ch
- for y, line in enumerate(input())
- for x, ch in enumerate(line.strip())
-}
-
-
-def accessible():
- return {
- p
- for p, x in g.items()
- if x == "@"
- and sum(
- 1
- for dx in (-1, 0, 1)
- for dy in (-1j, 0j, 1j)
- if dx + dy != 0 and g.get(p + dx + dy, ".") == "@"
- )
- < 4
- }
-
-
-silver = len(accessible())
-gold = 0
-
-while rem := accessible():
- gold += len(rem)
- for gone in rem:
- g.pop(gone)
-
-print("silver:", silver)
-print("gold:", gold)
diff --git a/2025/04/rust/Cargo.lock b/2025/04/rust/Cargo.lock
deleted file mode 100644
index 222070d..0000000
--- a/2025/04/rust/Cargo.lock
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "aoc_2025-04"
-version = "0.1.0"
diff --git a/2025/04/rust/Cargo.toml b/2025/04/rust/Cargo.toml
deleted file mode 100644
index b29e6d6..0000000
--- a/2025/04/rust/Cargo.toml
+++ /dev/null
@@ -1,6 +0,0 @@
-[package]
-name = "aoc_2025-04"
-version = "0.1.0"
-edition = "2024"
-
-[dependencies]
diff --git a/2025/04/rust/src/main.rs b/2025/04/rust/src/main.rs
deleted file mode 100644
index 3b13140..0000000
--- a/2025/04/rust/src/main.rs
+++ /dev/null
@@ -1,66 +0,0 @@
-use std::{collections::VecDeque, io};
-
-fn main() {
- let mut grid: Vec<Vec<Option<usize>>> = io::stdin()
- .lines()
- .flatten()
- .map(|line| line.chars().map(|ch| (ch == '@').then_some(0)).collect())
- .collect();
-
- // count neighbours
- points(&grid)
- .collect::<Vec<_>>()
- .into_iter()
- .for_each(|p @ (x, y)| {
- let ns = neighbours(p, &grid).count();
- if let Some(n) = grid[y][x].as_mut() {
- *n = ns;
- }
- });
-
- let mut stack = points(&grid)
- .filter(|&(x, y)| grid[y][x].is_some_and(|n| n < 4))
- .collect::<VecDeque<_>>();
- let silver = stack.len();
- let mut gold = 0;
-
- while let Some(p @ (x, y)) = stack.pop_back() {
- if grid[y][x].take().is_none() {
- continue;
- }
- gold += 1;
- // reduce neighbours' neighbour counts by 1
- neighbours(p, &grid)
- .collect::<Vec<_>>()
- .into_iter()
- .for_each(|(nx, ny)| {
- if let Some(n) = grid[ny][nx].as_mut() {
- *n -= 1;
- if *n < 4 {
- stack.push_back((nx, ny))
- }
- }
- });
- }
-
- println!("silver: {silver}");
- println!("gold: {gold}");
-}
-
-fn neighbours<T>(
- (x, y): (usize, usize),
- grid: &Vec<Vec<Option<T>>>,
-) -> impl Iterator<Item = (usize, usize)> {
- let xs = x.saturating_sub(1)..=(x + 1).min(grid.first().unwrap().len() - 1);
- let ys = y.saturating_sub(1)..=(y + 1).min(grid.len() - 1);
-
- xs.flat_map(move |nx| ys.clone().map(move |ny| (nx, ny)))
- .filter(move |n| *n != (x, y))
- .filter(|&(nx, ny)| grid.get(ny).and_then(|row| row.get(nx)).unwrap().is_some())
-}
-
-fn points<T>(grid: &Vec<Vec<T>>) -> impl Iterator<Item = (usize, usize)> {
- let xs = 0..grid.first().unwrap().len();
- let ys = 0..grid.len();
- xs.flat_map(move |x| ys.clone().map(move |y| (x, y)))
-}
diff --git a/2025/05/python.py b/2025/05/python.py
deleted file mode 100755
index 9977623..0000000
--- a/2025/05/python.py
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env python3
-
-from itertools import takewhile
-from fileinput import input
-
-
-inp = map(str.strip, input())
-rs = [tuple(map(int, r.split("-"))) for r in takewhile(bool, inp)]
-ids = list(map(int, inp))
-
-
-def add(a: int, b: int, c: int, d: int) -> tuple[int, int] | None:
- if c < a:
- return add(c, d, a, b)
- if b < c:
- return None
- return (a, max(b, d))
-
-
-done = False
-while not done:
- ms = []
- for r in rs:
- for idx, m in enumerate(ms):
- if new := add(*r, *m):
- ms[idx] = new
- break
-
- else:
- ms.append(r)
- done = len(rs) == len(ms)
- rs = ms
-
-
-silver = sum(1 for i in ids if any(lo <= i <= hi for lo, hi in rs))
-gold = sum(b - a + 1 for a, b in rs)
-
-print("silver:", silver)
-print("gold:", gold)
diff --git a/2025/05/rust/Cargo.lock b/2025/05/rust/Cargo.lock
deleted file mode 100644
index 0d1bf4e..0000000
--- a/2025/05/rust/Cargo.lock
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "aoc_2025-05"
-version = "0.1.0"
diff --git a/2025/05/rust/Cargo.toml b/2025/05/rust/Cargo.toml
deleted file mode 100644
index e85826e..0000000
--- a/2025/05/rust/Cargo.toml
+++ /dev/null
@@ -1,6 +0,0 @@
-[package]
-name = "aoc_2025-05"
-version = "0.1.0"
-edition = "2024"
-
-[dependencies]
diff --git a/2025/05/rust/src/main.rs b/2025/05/rust/src/main.rs
deleted file mode 100644
index cd78338..0000000
--- a/2025/05/rust/src/main.rs
+++ /dev/null
@@ -1,55 +0,0 @@
-use std::io;
-
-fn main() {
- let mut input = io::stdin().lines().flatten().map(|line| line);
- let ranges = input.by_ref().take_while(|s| !s.is_empty()).map(|s| {
- let (lo, hi) = s.split_once('-').unwrap();
- (
- lo.to_owned().parse().unwrap(),
- hi.to_owned().parse().unwrap(),
- )
- });
-
- let mut merged: Vec<(u64, u64)> = vec![];
- for (mut lo, mut hi) in ranges {
- let ldx = merged.partition_point(|&(_, max)| max < lo);
- let mut rdx = merged.partition_point(|&(_, max)| max < hi);
-
- let left = merged.get(ldx);
- let right = merged.get(rdx);
-
- // ldx = merged.len() -> left is none -> insert at end
- let Some(&(llo, lhi)) = left else {
- merged.push((lo, hi));
- continue;
- };
-
- if (llo..=lhi).contains(&lo) {
- lo = lo.min(llo); // include range start point
- }
-
- // rdx = merged.len() -> right is none -> merge with all
- let Some(&(rlo, rhi)) = right else {
- merged.drain(ldx..);
- merged.push((lo, hi));
- continue;
- };
-
- if (rlo..=rhi).contains(&hi) {
- hi = hi.max(rhi);
- rdx += 1;
- }
-
- merged.drain(ldx..rdx);
- merged.insert(ldx, (lo, hi));
- }
-
- let silver = input
- .map(|n| n.parse::<u64>().unwrap())
- .filter(|id| merged.iter().any(|&(lo, hi)| (lo..=hi).contains(id)))
- .count();
- let gold: u64 = merged.iter().map(|(lo, hi)| hi - lo + 1).sum();
-
- println!("silver: {silver}");
- println!("gold: {gold}");
-}
diff --git a/2025/06/python.py b/2025/06/python.py
deleted file mode 100755
index 4c57829..0000000
--- a/2025/06/python.py
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env python3
-
-from math import prod
-from fileinput import input
-from itertools import takewhile, repeat
-
-*nums, ops = [line.strip("\n") for line in input()]
-ops = [prod if op == "*" else sum for op in ops.split()]
-
-horizontal = [map(int, row.split()) for row in nums]
-silver = sum(op(chunk) for op, chunk in zip(ops, zip(*horizontal)))
-
-vertical = ("".join(ds).strip() for ds in [*zip(*nums)])
-chunks = repeat(lambda: [*map(int, takewhile(bool, vertical))])
-gold = sum(op(chunk()) for op, chunk in zip(ops, chunks))
-
-print("silver:", silver)
-print("gold:", gold)
diff --git a/2025/07/python.py b/2025/07/python.py
deleted file mode 100755
index 639c368..0000000
--- a/2025/07/python.py
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/env python3
-
-from fileinput import input
-from functools import cache
-
-lines = [line.strip() for line in input()]
-start = lines[0].index("S")
-
-silver = 0
-bs = {start}
-for line in lines:
- for b in bs.copy():
- if line[b] == "^":
- silver += 1
- bs -= {b}
- bs |= {b - 1, b + 1}
-
-
-@cache
-def tls(r: int, c: int) -> int:
- if r == len(lines):
- return 1
- if lines[r][c] == "^":
- return tls(r, c - 1) + tls(r, c + 1)
- return tls(r + 1, c)
-
-
-gold = tls(0, start)
-
-print("silver:", silver)
-print("gold:", gold)
diff --git a/2025/08/python.py b/2025/08/python.py
deleted file mode 100755
index 98a4725..0000000
--- a/2025/08/python.py
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env python3
-
-from fileinput import input
-from math import dist, prod
-from operator import itemgetter
-
-MAX_CONNS = 1000 # test: 10, input: 1000
-
-boxes = [[*map(int, line.split(","))] for line in input()]
-N = len(boxes)
-
-js = {n: {n} for n in range(N)}
-conns = sorted(
- ((x, y) for x in range(N) for y in range(x)),
- key=lambda t: dist(*itemgetter(*t)(boxes)),
-)
-
-for n, (x, y) in enumerate(conns):
- if n == MAX_CONNS:
- lens = {id(j): len(j) for j in js.values()}.values()
- print("silver:", prod(sorted(lens, reverse=True)[:3]))
-
- j = js[x] | js[y]
- for b in j:
- js[b] = j
-
- if len(j) == N:
- print("gold:", boxes[x][0] * boxes[y][0])
- break
diff --git a/2025/09/python.py b/2025/09/python.py
deleted file mode 100755
index 6c4df6c..0000000
--- a/2025/09/python.py
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env python3
-
-from fileinput import input
-
-pts = [[*map(int, line.split(","))] for line in input()]
-
-silver = max(
- (abs(x1 - x2) + 1) * (abs(y1 - y2) + 1) for (x1, y1) in pts for (x2, y2) in pts
-)
-gold = 0
-
-print("silver:", silver)
-print("gold:", gold)
diff --git a/2025/09/rust/Cargo.lock b/2025/09/rust/Cargo.lock
deleted file mode 100644
index 1a33f1f..0000000
--- a/2025/09/rust/Cargo.lock
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "aoc_2025-09"
-version = "0.1.0"
diff --git a/2025/09/rust/Cargo.toml b/2025/09/rust/Cargo.toml
deleted file mode 100644
index a713c42..0000000
--- a/2025/09/rust/Cargo.toml
+++ /dev/null
@@ -1,6 +0,0 @@
-[package]
-name = "aoc_2025-09"
-version = "0.1.0"
-edition = "2024"
-
-[dependencies]
diff --git a/2025/09/rust/src/main.rs b/2025/09/rust/src/main.rs
deleted file mode 100644
index 32847e3..0000000
--- a/2025/09/rust/src/main.rs
+++ /dev/null
@@ -1,113 +0,0 @@
-use std::io;
-
-#[derive(Debug)]
-struct Floor {
- x_comp: Vec<usize>,
- y_comp: Vec<usize>,
-}
-
-impl Floor {
- fn new(pts: Vec<(usize, usize)>) -> (Self, Vec<(usize, usize)>) {
- let (mut xs, mut ys): (Vec<_>, Vec<_>) = pts.clone().into_iter().unzip();
- xs.sort_unstable();
- xs.dedup();
- ys.sort_unstable();
- ys.dedup();
-
- let pts = pts
- .into_iter()
- .map(|(x, y)| (xs.binary_search(&x).unwrap(), ys.binary_search(&y).unwrap()))
- .collect();
-
- (
- Self {
- x_comp: xs,
- y_comp: ys,
- },
- pts,
- )
- }
-
- fn uncomp(&self, (x, y): (usize, usize)) -> (usize, usize) {
- (self.x_comp[x], self.y_comp[y])
- }
-
- fn area(&self, (p1, p2): ((usize, usize), (usize, usize))) -> usize {
- let (x1, y1) = self.uncomp(p1);
- let (x2, y2) = self.uncomp(p2);
- (x1.abs_diff(x2) + 1) * (y1.abs_diff(y2) + 1)
- }
-}
-
-fn main() {
- let pts = io::stdin()
- .lines()
- .flatten()
- .map(|line| {
- let (x, y) = line.split_once(',').unwrap();
- (x.parse().unwrap(), y.parse().unwrap())
- })
- .collect::<Vec<(usize, usize)>>();
-
- let (floor, pts) = Floor::new(pts);
-
- let xmax = *pts.iter().map(|(x, _)| x).max().unwrap();
- let ymax = *pts.iter().map(|(_, y)| y).max().unwrap();
-
- // some padding so that flood fill works correctly
- let mut grid: Vec<Vec<Option<bool>>> = vec![vec![None; xmax + 3]; ymax + 3];
-
- // draw green/red tiles
- for pair in [vec![*pts.last().unwrap()], pts.clone()]
- .concat()
- .windows(2)
- {
- let (x1, y1) = pair[0];
- let (x2, y2) = pair[1];
- (x1.min(x2)..=x1.max(x2)).for_each(|x| {
- (y1.min(y2)..=(y1.max(y2))).for_each(|y| grid[y + 1][x + 1] = Some(true))
- });
- }
-
- // flood fill from top left
- let mut q = vec![(0, 0)];
- while let Some((x, y)) = q.pop() {
- grid[y][x] = Some(false);
- let ns = vec![
- (x.saturating_sub(1), y),
- ((x + 1).min(xmax + 2), y),
- (x, y.saturating_sub(1)),
- (x, (y + 1).min(ymax + 2)),
- ];
- q.extend(ns.into_iter().filter(|&(x, y)| grid[y][x].is_none()));
- }
-
- // replace inside cells with Some(true) and undo the padding
- let grid: Vec<Vec<bool>> = grid
- .into_iter()
- .skip(1)
- .map(|r| r.into_iter().skip(1).map(|c| c.unwrap_or(true)).collect())
- .collect();
-
- let mut rectangles = pts
- .iter()
- .enumerate()
- .flat_map(|(idx, p1)| pts.iter().take(idx).map(move |p2| (*p1, *p2)))
- .collect::<Vec<_>>();
- rectangles.sort_unstable_by_key(|&r| std::cmp::Reverse(floor.area(r)));
-
- let silver: usize = floor.area(*rectangles.first().unwrap());
- let gold: usize = floor.area(
- *rectangles
- .iter()
- .filter(|&&((x1, y1), (x2, y2))| {
- (x1.min(x2)..=x1.max(x2))
- .flat_map(|x| (y1.min(y2)..=y1.max(y2)).map(move |y| (x, y)))
- .all(|(x, y)| grid[y][x])
- })
- .next()
- .unwrap(),
- );
- println!("silver: {silver}");
- println!("gold: {gold}");
-}
diff --git a/2025/10/rust/Cargo.lock b/2025/10/rust/Cargo.lock
deleted file mode 100644
index fcb9609..0000000
--- a/2025/10/rust/Cargo.lock
+++ /dev/null
@@ -1,155 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "aoc_2025-10"
-version = "0.1.0"
-dependencies = [
- "good_lp",
- "itertools",
-]
-
-[[package]]
-name = "autocfg"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
-
-[[package]]
-name = "either"
-version = "1.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
-
-[[package]]
-name = "fnv"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-
-[[package]]
-name = "good_lp"
-version = "1.14.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "776aa1ba88ac058e78408c17f4dbff826a51ae08ed6642f71ca0edd7fe9383f3"
-dependencies = [
- "fnv",
- "microlp",
-]
-
-[[package]]
-name = "itertools"
-version = "0.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
-dependencies = [
- "either",
-]
-
-[[package]]
-name = "log"
-version = "0.4.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
-
-[[package]]
-name = "matrixmultiply"
-version = "0.3.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08"
-dependencies = [
- "autocfg",
- "rawpointer",
-]
-
-[[package]]
-name = "microlp"
-version = "0.2.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51d1790c73b93164ff65868f63164497cb32339458a9297e17e212d91df62258"
-dependencies = [
- "log",
- "sprs",
-]
-
-[[package]]
-name = "ndarray"
-version = "0.16.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841"
-dependencies = [
- "matrixmultiply",
- "num-complex",
- "num-integer",
- "num-traits",
- "portable-atomic",
- "portable-atomic-util",
- "rawpointer",
-]
-
-[[package]]
-name = "num-complex"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.46"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
-dependencies = [
- "num-traits",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "portable-atomic"
-version = "1.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
-
-[[package]]
-name = "portable-atomic-util"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507"
-dependencies = [
- "portable-atomic",
-]
-
-[[package]]
-name = "rawpointer"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
-
-[[package]]
-name = "smallvec"
-version = "1.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
-
-[[package]]
-name = "sprs"
-version = "0.11.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6dca58a33be2188d4edc71534f8bafa826e787cc28ca1c47f31be3423f0d6e55"
-dependencies = [
- "ndarray",
- "num-complex",
- "num-traits",
- "smallvec",
-]
diff --git a/2025/10/rust/Cargo.toml b/2025/10/rust/Cargo.toml
deleted file mode 100644
index 20ee505..0000000
--- a/2025/10/rust/Cargo.toml
+++ /dev/null
@@ -1,8 +0,0 @@
-[package]
-name = "aoc_2025-10"
-version = "0.1.0"
-edition = "2024"
-
-[dependencies]
-good_lp = { version = "1.14.2", features = ["microlp"], default-features = false }
-itertools = "0.14.0"
diff --git a/2025/10/rust/src/main.rs b/2025/10/rust/src/main.rs
deleted file mode 100644
index b0cd6ed..0000000
--- a/2025/10/rust/src/main.rs
+++ /dev/null
@@ -1,68 +0,0 @@
-use good_lp::*;
-use itertools::Itertools;
-use std::io;
-
-fn main() {
- let ms = io::stdin()
- .lines()
- .flatten()
- .map(|line| {
- let mut iter = line.split_whitespace();
- let p1 = iter
- .next()
- .unwrap()
- .chars()
- .filter_map(|ch| match ch {
- '.' => Some(0),
- '#' => Some(1),
- _ => None,
- })
- .collect::<Vec<u32>>();
-
- let mut iter = iter.map(|s| {
- s.split(|ch: char| ch.is_ascii_punctuation())
- .filter_map(|n| n.parse().ok())
- .collect::<Vec<u32>>()
- });
- let p2 = iter.next_back().unwrap();
- let bs = iter.collect::<Vec<_>>();
- (p1, p2, bs)
- })
- .collect::<Vec<_>>();
-
- let silver: usize = ms.iter().map(|(want, _, bs)| solve_p1(&want, &bs)).sum();
- let gold: usize = ms.iter().map(|(_, want, bs)| solve_p2(&want, &bs)).sum();
- println!("silver: {silver}");
- println!("gold: {gold}");
-}
-
-fn solve_p1(want: &Vec<u32>, bs: &Vec<Vec<u32>>) -> usize {
- bs.into_iter()
- .powerset()
- .map(|sub| (sub.len(), sub.into_iter().flatten().counts()))
- .filter(|(_, counts)| {
- want.iter()
- .enumerate()
- .all(|(n, w)| counts.get(&(n as u32)).unwrap_or(&0) % 2 == *w as usize)
- })
- .next()
- .unwrap()
- .0
-}
-
-fn solve_p2(want: &Vec<u32>, bs: &Vec<Vec<u32>>) -> usize {
- variables! {vars: 0 <= xs[bs.len()] (integer);}
- let obj: Expression = xs.iter().sum();
- let mut model = vars.minimise(&obj).using(default_solver);
- for (n, w) in want.iter().enumerate() {
- let xsum: Expression = bs
- .iter()
- .enumerate()
- .filter(|&(_, b)| b.contains(&(n as u32)))
- .map(|(x, _)| xs[x])
- .sum();
- model = model.with(constraint!(xsum == *w));
- }
-
- model.solve().unwrap().eval(&obj).round() as usize
-}
diff --git a/2025/11/rust/Cargo.lock b/2025/11/rust/Cargo.lock
deleted file mode 100644
index ab53f99..0000000
--- a/2025/11/rust/Cargo.lock
+++ /dev/null
@@ -1,7 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "aoc_2025-11"
-version = "0.1.0"
diff --git a/2025/11/rust/Cargo.toml b/2025/11/rust/Cargo.toml
deleted file mode 100644
index 9fbcc03..0000000
--- a/2025/11/rust/Cargo.toml
+++ /dev/null
@@ -1,6 +0,0 @@
-[package]
-name = "aoc_2025-11"
-version = "0.1.0"
-edition = "2024"
-
-[dependencies]
diff --git a/2025/11/rust/src/main.rs b/2025/11/rust/src/main.rs
deleted file mode 100644
index 522d7ad..0000000
--- a/2025/11/rust/src/main.rs
+++ /dev/null
@@ -1,84 +0,0 @@
-use std::{cell::RefCell, collections::HashMap, io, rc::Rc};
-
-#[derive(PartialEq, Eq, Hash, Debug)]
-struct Node {
- device: String,
- dac: bool,
- fft: bool,
-}
-
-fn main() {
- let adj = io::stdin()
- .lines()
- .flatten()
- .map(|line| {
- let (k, v) = line.split_once(": ").unwrap();
- (
- String::from(k),
- String::from(v)
- .split_whitespace()
- .map(String::from)
- .collect(),
- )
- })
- .collect::<HashMap<String, Vec<String>>>();
-
- let cache = Rc::new(RefCell::new(HashMap::new()));
-
- let silver = paths_from(
- Node {
- device: String::from("you"),
- dac: true,
- fft: true,
- },
- &adj,
- Rc::clone(&cache),
- );
- let gold = paths_from(
- Node {
- device: String::from("svr"),
- dac: false,
- fft: false,
- },
- &adj,
- Rc::clone(&cache),
- );
-
- println!("silver: {silver}");
- println!("gold: {gold}");
-}
-
-fn paths_from(
- curr: Node,
- adj: &HashMap<String, Vec<String>>,
- cache: Rc<RefCell<HashMap<Node, usize>>>,
-) -> usize {
- if curr.device == "out" {
- if curr.dac && curr.fft {
- return 1;
- }
- return 0;
- }
-
- let Some(&v) = cache.borrow().get(&curr) else {
- let paths = adj
- .get(&curr.device)
- .unwrap()
- .iter()
- .map(|n| {
- paths_from(
- Node {
- device: n.clone(),
- dac: curr.dac || curr.device == "dac",
- fft: curr.fft || curr.device == "fft",
- },
- adj,
- Rc::clone(&cache),
- )
- })
- .sum();
- cache.borrow_mut().insert(curr, paths);
- return paths;
- };
- return v;
-}
diff --git a/2025/12/python.py b/2025/12/python.py
deleted file mode 100755
index c3b5158..0000000
--- a/2025/12/python.py
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env python3
-
-from fileinput import input
-from itertools import takewhile
-
-
-def check(s: str):
- return eval(s.replace(": ", ">=9*(").replace("x", "*").replace(" ", "+") + ")")
-
-
-silver = sum(
- map(
- check,
- takewhile(
- bool,
- [line.strip() for line in input()][::-1],
- ),
- )
-)
-
-print("silver:", silver)