summaryrefslogtreecommitdiff
path: root/2025
diff options
context:
space:
mode:
Diffstat (limited to '2025')
-rw-r--r--2025/aa.rs4
-rw-r--r--2025/ab.rs12
-rw-r--r--2025/b1
-rw-r--r--2025/ba.rs162
-rw-r--r--2025/bb.rs164
-rw-r--r--2025/fetch.rs14
-rw-r--r--2025/lib.rs2
-rw-r--r--2025/main.rs7
-rw-r--r--2025/read.rs6
9 files changed, 348 insertions, 24 deletions
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<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()
}