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}} --