summaryrefslogtreecommitdiff
path: root/aoc/2024/02
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 /aoc/2024/02
parent62fe361fc42dea75deaf7ac31c0ba6ba80e26a9c (diff)
downloadpuzzles-master.tar.gz
puzzles-master.zip
add other challenges supportHEADmaster
Diffstat (limited to 'aoc/2024/02')
-rwxr-xr-xaoc/2024/02/python.py24
-rwxr-xr-xaoc/2024/02/raku.raku9
-rw-r--r--aoc/2024/02/rust/Cargo.lock7
-rw-r--r--aoc/2024/02/rust/Cargo.toml6
-rw-r--r--aoc/2024/02/rust/src/main.rs33
5 files changed, 79 insertions, 0 deletions
diff --git a/aoc/2024/02/python.py b/aoc/2024/02/python.py
new file mode 100755
index 0000000..f2c807d
--- /dev/null
+++ b/aoc/2024/02/python.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python3
+
+from fileinput import input
+
+reports = [[int(level) for level in report.split()] for report in input()]
+
+
+def incr(xs):
+ return all(x < y and y - x <= 3 for x, y in zip(xs, xs[1:]))
+
+
+def safe(xs):
+ return incr(xs) or incr(xs[::-1])
+
+
+def drops(xs):
+ return (xs[:idx] + xs[idx + 1 :] for idx, _ in enumerate(xs))
+
+
+silver = sum(safe(rep) for rep in reports)
+gold = sum(any(safe(mod) for mod in drops(rep)) for rep in reports)
+
+print("silver:", silver)
+print("gold:", gold)
diff --git a/aoc/2024/02/raku.raku b/aoc/2024/02/raku.raku
new file mode 100755
index 0000000..9b930de
--- /dev/null
+++ b/aoc/2024/02/raku.raku
@@ -0,0 +1,9 @@
+#!/usr/bin/env raku
+
+my @rs = lines>>.words.map(&cache);
+
+sub incr ($r) { $r.rotor(2=>-1).map({ ([-] $_) (elem) (1..3)}).all };
+sub safe ($r) { so $r.&incr || $r.reverse.&incr };
+
+say "silver: ", @rs.map(&safe).sum;
+say "gold: ", @rs.map({ $_.combinations($_-1).map(&safe).any.so }).sum;
diff --git a/aoc/2024/02/rust/Cargo.lock b/aoc/2024/02/rust/Cargo.lock
new file mode 100644
index 0000000..ac79b17
--- /dev/null
+++ b/aoc/2024/02/rust/Cargo.lock
@@ -0,0 +1,7 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "puzzle"
+version = "0.1.0"
diff --git a/aoc/2024/02/rust/Cargo.toml b/aoc/2024/02/rust/Cargo.toml
new file mode 100644
index 0000000..88e7b42
--- /dev/null
+++ b/aoc/2024/02/rust/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "puzzle"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/aoc/2024/02/rust/src/main.rs b/aoc/2024/02/rust/src/main.rs
new file mode 100644
index 0000000..2007837
--- /dev/null
+++ b/aoc/2024/02/rust/src/main.rs
@@ -0,0 +1,33 @@
+#![feature(iter_map_windows)]
+
+use std::io;
+
+fn main() {
+ let input: Vec<Vec<i64>> = io::stdin()
+ .lines()
+ .map(|line| {
+ line.unwrap()
+ .split_whitespace()
+ .map(str::parse::<i64>)
+ .collect()
+ })
+ .collect::<Result<Vec<_>, _>>()
+ .unwrap();
+
+ let silver: usize = input.iter().filter(|&xs| all_safe(xs)).count();
+ let gold: usize = input.iter().filter(|&xs| drop_safe(xs)).count();
+ println!("silver: {silver}");
+ println!("gold: {gold}");
+}
+
+fn all_safe(xs: &Vec<i64>) -> bool {
+ let mut diffs = xs.iter().map_windows(|&[x, y]| y - x).peekable();
+ let dir = diffs.peek().unwrap_or(&1).signum();
+ diffs.all(|d| (1..=3).contains(&d.abs()) && d.signum() == dir)
+}
+
+fn drop_safe(xs: &Vec<i64>) -> bool {
+ (0..xs.len())
+ .map(|idx| xs.split_at(idx))
+ .any(|(left, right)| all_safe(&[left, &right[1..]].concat()))
+}