diff options
| -rw-r--r-- | 2025/aa.rs | 4 | ||||
| -rw-r--r-- | 2025/ab.rs | 12 | ||||
| -rw-r--r-- | 2025/b | 1 | ||||
| -rw-r--r-- | 2025/ba.rs | 162 | ||||
| -rw-r--r-- | 2025/bb.rs | 164 | ||||
| -rw-r--r-- | 2025/fetch.rs | 14 | ||||
| -rw-r--r-- | 2025/lib.rs | 2 | ||||
| -rw-r--r-- | 2025/main.rs | 7 | ||||
| -rw-r--r-- | 2025/read.rs | 6 |
9 files changed, 348 insertions, 24 deletions
@@ -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() @@ -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); } @@ -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<Self, ()> { + 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::<usize>() + .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::<usize>() + // .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<Self, ()> { + 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::<usize>() + .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::<usize>() + // .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<String> { +pub fn fetch(lv: usize, p: impl Pattern) -> Vec<String> { 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<String> { .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<Path>) -> Vec<String> { +pub fn read(file: impl AsRef<Path>, p: impl Pattern) -> Vec<String> { fs::read_to_string(file) .expect("Failed to read file") - .lines() + .split(p) .map(|l| l.to_string()) .collect() } |
