summaryrefslogtreecommitdiff
path: root/aoc/2024/05
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/05
parent62fe361fc42dea75deaf7ac31c0ba6ba80e26a9c (diff)
downloadpuzzles-86bac31392a76da84817eec020d2b84d099b3cc1.tar.gz
puzzles-86bac31392a76da84817eec020d2b84d099b3cc1.zip
add other challenges supportHEADmaster
Diffstat (limited to 'aoc/2024/05')
-rwxr-xr-xaoc/2024/05/python.py30
-rwxr-xr-xaoc/2024/05/raku.raku10
-rw-r--r--aoc/2024/05/rust/Cargo.lock7
-rw-r--r--aoc/2024/05/rust/Cargo.toml6
-rw-r--r--aoc/2024/05/rust/src/main.rs42
5 files changed, 95 insertions, 0 deletions
diff --git a/aoc/2024/05/python.py b/aoc/2024/05/python.py
new file mode 100755
index 0000000..9e81978
--- /dev/null
+++ b/aoc/2024/05/python.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+
+from fileinput import input
+from functools import cmp_to_key
+from itertools import takewhile
+
+inp = map(str.strip, input())
+ordering = set(takewhile(bool, inp))
+us = list(inp)
+
+
+def cmp(x, y):
+ return (f"{y}|{x}" in ordering) * 2 - 1 # hehe
+
+
+silver = 0
+gold = 0
+
+for u in us:
+ pre = u.split(",")
+ post = list(sorted(pre, key=cmp_to_key(cmp)))
+
+ mid = int(post[len(post) // 2])
+ if pre == post:
+ silver += mid
+ else:
+ gold += mid
+
+print("silver:", silver)
+print("gold:", gold)
diff --git a/aoc/2024/05/raku.raku b/aoc/2024/05/raku.raku
new file mode 100755
index 0000000..a13cf5a
--- /dev/null
+++ b/aoc/2024/05/raku.raku
@@ -0,0 +1,10 @@
+#!/usr/bin/env raku
+
+my (@rs, @us) := slurp.split("\n\n")>>.lines;
+
+sub mid(@u) {
+ my @s = @u.sort({ "$^a|$^b" !(elem) @rs });
+ return (@u Z== @s).all.so ?? ($_, 0) !! (0, $_) with @s[@s/2];
+}
+
+(("silver: ", "gold: ") Z~ [Z+] @us>>.split(",").map(&mid)).map(&say);
diff --git a/aoc/2024/05/rust/Cargo.lock b/aoc/2024/05/rust/Cargo.lock
new file mode 100644
index 0000000..ac79b17
--- /dev/null
+++ b/aoc/2024/05/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/05/rust/Cargo.toml b/aoc/2024/05/rust/Cargo.toml
new file mode 100644
index 0000000..88e7b42
--- /dev/null
+++ b/aoc/2024/05/rust/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "puzzle"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/aoc/2024/05/rust/src/main.rs b/aoc/2024/05/rust/src/main.rs
new file mode 100644
index 0000000..0db788d
--- /dev/null
+++ b/aoc/2024/05/rust/src/main.rs
@@ -0,0 +1,42 @@
+#![feature(slice_split_once)]
+
+use std::cmp::Ordering::{Greater, Less};
+use std::collections::HashSet;
+use std::io;
+
+fn main() -> io::Result<()> {
+ let mut lines = io::stdin().lines().flatten();
+ let mut set = HashSet::<(u16, u16)>::new();
+
+ while let Some(s) = lines.next() {
+ if let Some((a, b)) = s.split_once('|') {
+ set.insert((a.parse().unwrap(), b.parse().unwrap()));
+ } else {
+ break;
+ }
+ }
+
+ let mut silver: usize = 0;
+ let mut gold: usize = 0;
+
+ for line in lines {
+ let mut nums: Vec<u16> = line.split(',').map(|n| n.parse().unwrap()).collect();
+ let mid = nums.len() / 2;
+
+ if nums.is_sorted_by(|&a, &b| set.contains(&(a, b))) {
+ silver += nums[mid] as usize;
+ } else {
+ gold += *nums
+ .select_nth_unstable_by(mid, |&a, &b| match set.contains(&(a, b)) {
+ true => Less,
+ false => Greater,
+ })
+ .1 as usize;
+ }
+ }
+
+ println!("silver: {silver}");
+ println!("gold: {gold}");
+
+ return Ok(());
+}