Skip to content

Commit 795b7f0

Browse files
committed
Rust day 13
1 parent 5f36552 commit 795b7f0

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

data/day13.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
1015292
2+
19,x,x,x,x,x,x,x,x,41,x,x,x,x,x,x,x,x,x,743,x,x,x,x,x,x,x,x,x,x,x,x,13,17,x,x,x,x,x,x,x,x,x,x,x,x,x,x,29,x,643,x,x,x,x,x,37,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,23

src/days/day13.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
use anyhow::Result;
2+
use libaoc::{aoc, AocResult};
3+
use std::time::Instant;
4+
5+
#[aoc("3215", "1001569619313439")]
6+
pub fn solve(input: String) -> Result<AocResult> {
7+
let parse = Instant::now();
8+
let lines: Vec<_> = input.lines().collect();
9+
let secs: usize = lines[0].parse().unwrap();
10+
let buses: Vec<usize> = lines[1]
11+
.split(',')
12+
.map(|x| x.parse())
13+
.filter(|x| x.is_ok())
14+
.map(|x| x.unwrap())
15+
.collect();
16+
let all_buses: Vec<Option<(usize, usize)>> = lines[1]
17+
.split(',')
18+
.map(|x| x.parse())
19+
.enumerate()
20+
.map(|x| {
21+
if x.1.is_ok() {
22+
Some((x.0, x.1.unwrap()))
23+
} else {
24+
None
25+
}
26+
})
27+
.collect();
28+
let parse = parse.elapsed().as_secs_f64();
29+
30+
let t1 = Instant::now();
31+
let mut current = secs;
32+
loop {
33+
if buses.iter().any(|x| current % x == 0) {
34+
break;
35+
}
36+
current += 1;
37+
}
38+
let part1 = (current - secs) * buses.iter().find(|&&x| current % x == 0).unwrap();
39+
40+
let t1 = t1.elapsed().as_secs_f64();
41+
42+
let t2 = Instant::now();
43+
let mut start = 0;
44+
let mut increment = 1;
45+
for bus in &all_buses {
46+
if let Some(bus) = bus {
47+
let index = bus.0;
48+
let num = bus.1;
49+
loop {
50+
start += increment;
51+
if (start + index) % num == 0 {
52+
break;
53+
}
54+
}
55+
let mut new_increment = start;
56+
loop {
57+
new_increment += increment;
58+
if (new_increment + index) % num == 0 {
59+
break;
60+
}
61+
}
62+
increment = new_increment - start;
63+
}
64+
}
65+
let part2 = start;
66+
67+
let t2 = t2.elapsed().as_secs_f64();
68+
69+
Ok(AocResult::new(part1, part2, parse, t1, t2))
70+
}

src/days/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ mod day09;
1010
mod day10;
1111
mod day11;
1212
mod day12;
13+
mod day13;

0 commit comments

Comments
 (0)