From 0e07bd6b46093753b1563afa4db2bf73852813fc Mon Sep 17 00:00:00 2001 From: Jonni Liljamo Date: Tue, 2 Dec 2025 15:10:29 +0200 Subject: [PATCH] feat: day2 --- Cargo.lock | 7 +++ Cargo.toml | 2 +- crates/common/src/lib.rs | 2 - crates/day2/Cargo.toml | 7 +++ crates/day2/src/main.rs | 100 +++++++++++++++++++++++++++++++++++++++ justfile | 5 +- 6 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 crates/day2/Cargo.toml create mode 100644 crates/day2/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 31151e3..f6578a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16,6 +16,13 @@ dependencies = [ "common", ] +[[package]] +name = "day2" +version = "0.1.0" +dependencies = [ + "common", +] + [[package]] name = "sc" version = "0.2.7" diff --git a/Cargo.toml b/Cargo.toml index 86c4459..f2246d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] resolver = "3" -members = ["crates/common", "crates/day1"] +members = ["crates/common", "crates/day1", "crates/day2"] diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index 46e1f20..59868ec 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -31,7 +31,6 @@ impl<'a> Format<'a> { impl<'a> fmt::Write for Format<'a> { fn write_str(&mut self, s: &str) -> fmt::Result { if self.len > self.buf.len() { - write("1"); return Err(fmt::Error); } let remaining_buf = &mut self.buf[self.len..]; @@ -40,7 +39,6 @@ impl<'a> fmt::Write for Format<'a> { remaining_buf[..write_num].copy_from_slice(&bytes[..write_num]); self.len += bytes.len(); if write_num < bytes.len() { - write("2"); return Err(fmt::Error); } diff --git a/crates/day2/Cargo.toml b/crates/day2/Cargo.toml new file mode 100644 index 0000000..e6e06a5 --- /dev/null +++ b/crates/day2/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day2" +version = "0.1.0" +edition = "2024" + +[dependencies] +common = { path = "../common" } diff --git a/crates/day2/src/main.rs b/crates/day2/src/main.rs new file mode 100644 index 0000000..c528a7c --- /dev/null +++ b/crates/day2/src/main.rs @@ -0,0 +1,100 @@ +#![no_std] + +use common::{format_str, print, read}; + +fn main() { + let buf = [0u8; 65000]; + read(buf.as_ptr(), buf.len()); + let mut input = str::from_utf8(&buf).unwrap(); + input = input.trim_end_matches(char::MIN); + let result_one = one(input); + let result_two = two(input); + print!(64, "one: {}\ntwo: {}\n", result_one, result_two); +} + +fn one(input: &str) -> usize { + input + .split(",") + .map(|mut range| { + range = range.trim(); + let (first, last) = range + .split_once("-") + .map(|(first, last)| (first.parse::().unwrap(), last.parse::().unwrap())) + .unwrap(); + + let mut ret = 0; + for i in first..=last { + let mut buf = [0; 20]; + let mut i_s = format_str(&mut buf, format_args!("{}", i)); + i_s = i_s.trim_end_matches(char::MIN); + + for j in 0..i_s.len() { + let mut amount = 0; + let a = i_s + .matches(&i_s[0..j]) + .map(|a| { + amount += 1; + a.len() + }) + .sum::(); + // remove amount check to do those that repeat more times + if a == i_s.len() && amount == 2 { + //print!(30, "found {}\n", i); + ret += i as usize; + break; + } + } + } + + ret + }) + .sum::() +} + +fn two(input: &str) -> usize { + input + .split(",") + .map(|mut range| { + range = range.trim(); + let (first, last) = range + .split_once("-") + .map(|(first, last)| (first.parse::().unwrap(), last.parse::().unwrap())) + .unwrap(); + + let mut ret = 0; + for i in first..=last { + let mut buf = [0; 20]; + let mut i_s = format_str(&mut buf, format_args!("{}", i)); + i_s = i_s.trim_end_matches(char::MIN); + + for j in 0..i_s.len() { + let a = i_s.matches(&i_s[0..j]).map(|a| a.len()).sum::(); + if a == i_s.len() { + ret += i as usize; + break; + } + } + } + + ret + }) + .sum::() +} + +#[cfg(test)] +mod test { + use super::*; + + const EXAMPLE_INPUT: &str = "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124"; + + #[test] + fn example() { + assert_eq!(one(EXAMPLE_INPUT), 1227775554); + assert_eq!(two(EXAMPLE_INPUT), 4174379265); + } + + #[test] + fn one_a() { + assert_eq!(one("3131219357-3131417388\n"), 6262562625); + } +} diff --git a/justfile b/justfile index 855f828..ec307d4 100644 --- a/justfile +++ b/justfile @@ -4,5 +4,8 @@ _default: init day: cargo init crates/day{{day}} +test day test="": + cargo test --bin day{{day}} {{test}} + solve day: - cat input/day{{day}}.txt | cargo run day{{day}} -- + cat input/day{{day}}.txt | cargo run --bin day{{day}} -- -- 2.44.1