From d7ff9b456eac35226b6cf06f8c559c7d06eb178b Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Tue, 2 Dec 2025 17:36:33 +0800 Subject: new: day 2 --- 2025/aa.rs | 4 +- 2025/ab.rs | 12 ++--- 2025/b | 1 + 2025/ba.rs | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2025/bb.rs | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2025/fetch.rs | 14 ++--- 2025/lib.rs | 2 + 2025/main.rs | 7 ++- 2025/read.rs | 6 +-- 9 files changed, 348 insertions(+), 24 deletions(-) create mode 100644 2025/b create mode 100644 2025/ba.rs create mode 100644 2025/bb.rs diff --git a/2025/aa.rs b/2025/aa.rs index 1982912..eea845f 100644 --- a/2025/aa.rs +++ b/2025/aa.rs @@ -48,7 +48,9 @@ impl Ring { pub fn main() { let mut ring = Ring::new(); - let input = read("a"); + let input = read( + "a", '\n', + ); for i in input { let dir = i .chars() diff --git a/2025/ab.rs b/2025/ab.rs index 3d4f36d..bafd2ae 100644 --- a/2025/ab.rs +++ b/2025/ab.rs @@ -48,7 +48,7 @@ impl Ring { pub fn main() { let mut ring = Ring::new(); - let input = fetch(1); + let input = fetch(1, '\n'); for i in input { let dir = i .chars() @@ -63,13 +63,7 @@ pub fn main() { 'R' => ring.right(num), _ => {} } - println!( - "{}: {:#?}", - num, ring - ) + println!("{}: {:#?}", num, ring) } - println!( - "Result: {}", - ring.counter - ); + println!("Result: {}", ring.counter); } diff --git a/2025/b b/2025/b new file mode 100644 index 0000000..c7d6699 --- /dev/null +++ b/2025/b @@ -0,0 +1 @@ +11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862 diff --git a/2025/ba.rs b/2025/ba.rs new file mode 100644 index 0000000..4903ec0 --- /dev/null +++ b/2025/ba.rs @@ -0,0 +1,162 @@ +use aoc::{fetch::fetch, read::read}; + +struct Checker { + first: usize, + last: usize, +} + +impl Checker { + fn new(first: usize, last: usize) -> Result { + if first + .to_string() + .chars() + .next() + .unwrap() + == '0' + { + return Err(()); + } + + Ok( + Self { + first, + last, + }, + ) + } + + fn parse_section_naive(num: usize) -> usize { + let mut prevs = String::new(); + let mut ans = 0; + for c in num + .to_string() + .chars() + { + if prevs.is_empty() || prevs.contains(c) { + prevs.push(c); + } + if !prevs.contains(c) { + prevs.clear() + } + if prevs.len() >= 2 + && (num + .to_string() + .len() + == 2 + || !prevs.contains(c)) + { + ans += prevs + .parse::() + .unwrap(); + + prevs.clear(); + } + } + ans + } + + // fn parse_section(num: usize) -> usize { + // let mut ans = 0; + // for (i, c) in num + // .to_string() + // .chars() + // .enumerate() + // { + // for j in i..=num + // .to_string() + // .len() + // { + // for k in (j..=num + // .to_string() + // .len() + // / 2) + // .rev() + // { + // ans += if num.to_string()[j..=k] == num.to_string()[k..=k + + // (j..k).len()] { println!( + // "{} {j} {k}", + // num.to_string()[j..k].to_string() + // ); + // num.to_string()[j..=k] + // .parse::() + // .unwrap() + // } else { + // 0 + // } + // } + // } + // } + // ans + // } + + fn parse_section(num: usize) -> usize { + let s = num.to_string(); + if s.len() % 2 != 0 { + return 0; + } + if s[0..s.len() / 2] == s[s.len() / 2..s.len()] { + return num; + } + 0 + } + + fn parse(self) -> usize { + let mut ans = 0; + for i in self.first..=self.last { + ans += Self::parse_section(i); + } + ans + } +} + +pub fn main() { + let input = fetch( + 2, ',', + ); + // let input = read( + // "b", ',', + // ); + let mut ans = 0; + + println!( + "{}", + Checker::new( + 998, 1012, + ) + .unwrap() + .parse() + ); + println!( + "{}", + Checker::new( + 11, 22, + ) + .unwrap() + .parse() + ); + // return; + for s in input { + let s = s.replace( + '\n', "", + ); + let split = s.split('-'); + let first = split + .clone() + .next() + .unwrap() + .parse() + .unwrap(); + let last = split + .clone() + .nth(1) + .unwrap() + .parse() + .unwrap(); + ans += &Checker::new( + first, last, + ) + .unwrap() + .parse(); + } + println!("{ans}"); +} diff --git a/2025/bb.rs b/2025/bb.rs new file mode 100644 index 0000000..84d6b31 --- /dev/null +++ b/2025/bb.rs @@ -0,0 +1,164 @@ +use aoc::{fetch::fetch, read::read}; + +struct Checker { + first: usize, + last: usize, +} + +impl Checker { + fn new(first: usize, last: usize) -> Result { + if first + .to_string() + .chars() + .next() + .unwrap() + == '0' + { + return Err(()); + } + + Ok( + Self { + first, + last, + }, + ) + } + + fn parse_section_naive(num: usize) -> usize { + let mut prevs = String::new(); + let mut ans = 0; + for c in num + .to_string() + .chars() + { + if prevs.is_empty() || prevs.contains(c) { + prevs.push(c); + } + if !prevs.contains(c) { + prevs.clear() + } + if prevs.len() >= 2 + && (num + .to_string() + .len() + == 2 + || !prevs.contains(c)) + { + ans += prevs + .parse::() + .unwrap(); + + prevs.clear(); + } + } + ans + } + + // fn parse_section(num: usize) -> usize { + // let mut ans = 0; + // for (i, c) in num + // .to_string() + // .chars() + // .enumerate() + // { + // for j in i..=num + // .to_string() + // .len() + // { + // for k in (j..=num + // .to_string() + // .len() + // / 2) + // .rev() + // { + // ans += if num.to_string()[j..=k] == num.to_string()[k..=k + + // (j..k).len()] { println!( + // "{} {j} {k}", + // num.to_string()[j..k].to_string() + // ); + // num.to_string()[j..=k] + // .parse::() + // .unwrap() + // } else { + // 0 + // } + // } + // } + // } + // ans + // } + + fn parse_section(num: usize) -> usize { + let s = num.to_string(); + let len = s.len(); + for substr_len in 1..=len / 2 { + if len % substr_len == 0 { + let first = &s[0..substr_len]; + if s.as_bytes() + .chunks(substr_len) + .all(|chunk| chunk == first.as_bytes()) + { + return num; + } + } + } + 0 + } + + fn parse(self) -> usize { + let mut ans = 0; + for i in self.first..=self.last { + ans += Self::parse_section(i); + } + ans + } +} + +pub fn main() { + let input = fetch( + 2, ',', + ); + // let input = read( + // "b", ',', + // ); + let mut ans = 0; + + println!( + "{}", + Checker::new(998, 1012,) + .unwrap() + .parse() + ); + println!( + "{}", + Checker::new(11, 22,) + .unwrap() + .parse() + ); + // return; + for s in input { + let s = s.replace( + '\n', "", + ); + let split = s.split('-'); + let first = split + .clone() + .next() + .unwrap() + .parse() + .unwrap(); + let last = split + .clone() + .nth(1) + .unwrap() + .parse() + .unwrap(); + ans += &Checker::new( + first, last, + ) + .unwrap() + .parse(); + } + println!("{ans}"); +} diff --git a/2025/fetch.rs b/2025/fetch.rs index 954aa7e..c83d800 100644 --- a/2025/fetch.rs +++ b/2025/fetch.rs @@ -1,18 +1,12 @@ -use std::{env, sync::Arc}; +use std::{env, str::pattern::Pattern, sync::Arc}; use reqwest::{Url, blocking::Client, cookie::Jar}; const YEAR: usize = 2025; -pub fn fetch(lv: usize) -> Vec { +pub fn fetch(lv: usize, p: impl Pattern) -> Vec { let jar = Arc::new(Jar::default()); - jar.add_cookie_str( - &format!( - "session={}", - env::var("AOC_SESSION").unwrap() - ), - &Url::parse("https:///adventofcode.com").unwrap(), - ); + jar.add_cookie_str(&format!("session={}", env::var("AOC_SESSION").unwrap()), &Url::parse("https:///adventofcode.com").unwrap()); Client::builder() .cookie_provider(jar) @@ -23,7 +17,7 @@ pub fn fetch(lv: usize) -> Vec { .unwrap() .text() .unwrap() - .lines() + .split(p) .map(|s| s.to_string()) .collect() } diff --git a/2025/lib.rs b/2025/lib.rs index fe134e7..060f29a 100644 --- a/2025/lib.rs +++ b/2025/lib.rs @@ -1,2 +1,4 @@ +#![feature(pattern)] + pub mod fetch; pub mod read; diff --git a/2025/main.rs b/2025/main.rs index bc0b130..6f628bf 100644 --- a/2025/main.rs +++ b/2025/main.rs @@ -1,7 +1,12 @@ pub mod aa; pub mod ab; +pub mod ba; +pub mod bb; + fn main() { // aa::main(); - ab::main(); + // ab::main(); + // ba::main(); + bb::main(); } diff --git a/2025/read.rs b/2025/read.rs index a53a3a3..ebd41bd 100644 --- a/2025/read.rs +++ b/2025/read.rs @@ -1,9 +1,9 @@ -use std::{fs, path::Path}; +use std::{fs, path::Path, str::pattern::Pattern}; -pub fn read(file: impl AsRef) -> Vec { +pub fn read(file: impl AsRef, p: impl Pattern) -> Vec { fs::read_to_string(file) .expect("Failed to read file") - .lines() + .split(p) .map(|l| l.to_string()) .collect() } -- cgit v1.2.3