DEVELOPMENT ENVIRONMENT

~liljamo/aoc2025

0e07bd6b46093753b1563afa4db2bf73852813fc — Jonni Liljamo 3 days ago 03b2262
feat: day2
6 files changed, 119 insertions(+), 4 deletions(-)

M Cargo.lock
M Cargo.toml
M crates/common/src/lib.rs
A crates/day2/Cargo.toml
A crates/day2/src/main.rs
M justfile
M Cargo.lock => Cargo.lock +7 -0
@@ 17,6 17,13 @@ dependencies = [
]

[[package]]
name = "day2"
version = "0.1.0"
dependencies = [
 "common",
]

[[package]]
name = "sc"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"

M Cargo.toml => Cargo.toml +1 -1
@@ 1,3 1,3 @@
[workspace]
resolver = "3"
members = ["crates/common", "crates/day1"]
members = ["crates/common", "crates/day1", "crates/day2"]

M crates/common/src/lib.rs => crates/common/src/lib.rs +0 -2
@@ 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);
        }


A crates/day2/Cargo.toml => crates/day2/Cargo.toml +7 -0
@@ 0,0 1,7 @@
[package]
name = "day2"
version = "0.1.0"
edition = "2024"

[dependencies]
common = { path = "../common" }

A crates/day2/src/main.rs => crates/day2/src/main.rs +100 -0
@@ 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::<u64>().unwrap(), last.parse::<u64>().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::<usize>();
                    // 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::<usize>()
}

fn two(input: &str) -> usize {
    input
        .split(",")
        .map(|mut range| {
            range = range.trim();
            let (first, last) = range
                .split_once("-")
                .map(|(first, last)| (first.parse::<u64>().unwrap(), last.parse::<u64>().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::<usize>();
                    if a == i_s.len() {
                        ret += i as usize;
                        break;
                    }
                }
            }

            ret
        })
        .sum::<usize>()
}

#[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);
    }
}

M justfile => justfile +4 -1
@@ 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}} --