Merge branch 'master' of github.com:penguincoder/advent-of-code
commit
d707a1412c
|
@ -11,7 +11,7 @@ struct Point {
|
||||||
x: i32,
|
x: i32,
|
||||||
y: i32,
|
y: i32,
|
||||||
x_velocity: i32,
|
x_velocity: i32,
|
||||||
y_velocity: i32
|
y_velocity: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bounding_box(points: &Vec<Point>) -> (i32, i32, i32, i32) {
|
fn bounding_box(points: &Vec<Point>) -> (i32, i32, i32, i32) {
|
||||||
|
@ -21,10 +21,18 @@ fn bounding_box(points: &Vec<Point>) -> (i32, i32, i32, i32) {
|
||||||
let mut max_y = std::i32::MIN;
|
let mut max_y = std::i32::MIN;
|
||||||
|
|
||||||
for p in points.iter() {
|
for p in points.iter() {
|
||||||
if min_x > p.x { min_x = p.x };
|
if min_x > p.x {
|
||||||
if min_y > p.y { min_y = p.y };
|
min_x = p.x
|
||||||
if max_x < p.x { max_x = p.x };
|
};
|
||||||
if max_y < p.y { max_y = p.y };
|
if min_y > p.y {
|
||||||
|
min_y = p.y
|
||||||
|
};
|
||||||
|
if max_x < p.x {
|
||||||
|
max_x = p.x
|
||||||
|
};
|
||||||
|
if max_y < p.y {
|
||||||
|
max_y = p.y
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
(min_x, min_y, max_x, max_y)
|
(min_x, min_y, max_x, max_y)
|
||||||
|
@ -55,7 +63,10 @@ fn tick(points: &mut Vec<Point>) -> i32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
let (min_x, min_y, max_x, max_y) = bounding_box(points);
|
let (min_x, min_y, max_x, max_y) = bounding_box(points);
|
||||||
println!("final bounding box: ({}, {}) ({}, {})", min_x, min_y, max_x, max_y);
|
println!(
|
||||||
|
"final bounding box: ({}, {}) ({}, {})",
|
||||||
|
min_x, min_y, max_x, max_y
|
||||||
|
);
|
||||||
let mut final_set = HashSet::with_capacity(points.len());
|
let mut final_set = HashSet::with_capacity(points.len());
|
||||||
for p in points.iter() {
|
for p in points.iter() {
|
||||||
final_set.insert((p.x, p.y));
|
final_set.insert((p.x, p.y));
|
||||||
|
@ -81,7 +92,8 @@ fn main() {
|
||||||
.map(|line| line.unwrap())
|
.map(|line| line.unwrap())
|
||||||
.collect();
|
.collect();
|
||||||
let mut points: Vec<Point> = Vec::with_capacity(lines.len());
|
let mut points: Vec<Point> = Vec::with_capacity(lines.len());
|
||||||
let re = Regex::new(r"^position=<([-| ]\d+), ([-| ]\d+)> velocity=<([-| ]\d), ([-| ]\d)>$").unwrap();
|
let re =
|
||||||
|
Regex::new(r"^position=<([-| ]\d+), ([-| ]\d+)> velocity=<([-| ]\d), ([-| ]\d)>$").unwrap();
|
||||||
for line in lines.iter() {
|
for line in lines.iter() {
|
||||||
if re.is_match(line) {
|
if re.is_match(line) {
|
||||||
let cap = re.captures(line).unwrap();
|
let cap = re.captures(line).unwrap();
|
||||||
|
@ -93,7 +105,7 @@ fn main() {
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
x_velocity,
|
x_velocity,
|
||||||
y_velocity
|
y_velocity,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,9 @@ fn find_variable_max_sum(map: &[[i32; 300]; 300]) -> (usize, usize, i32, usize)
|
||||||
let mut sum = 0;
|
let mut sum = 0;
|
||||||
for i in 1..=300 {
|
for i in 1..=300 {
|
||||||
let (new_x, new_y, new_sum) = find_max_sum(map, i);
|
let (new_x, new_y, new_sum) = find_max_sum(map, i);
|
||||||
if new_sum == 0 { break; }
|
if new_sum == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
if new_sum > sum {
|
if new_sum > sum {
|
||||||
size = i;
|
size = i;
|
||||||
sum = new_sum;
|
sum = new_sum;
|
||||||
|
@ -78,8 +80,14 @@ fn main() {
|
||||||
|
|
||||||
let map = calc_map_from_serial_number(serial_number);
|
let map = calc_map_from_serial_number(serial_number);
|
||||||
let (x, y, sum) = find_max_sum(&map, 3);
|
let (x, y, sum) = find_max_sum(&map, 3);
|
||||||
println!("maximum sum coordinate of ({}, {}) with sum of {}", x, y, sum);
|
println!(
|
||||||
|
"maximum sum coordinate of ({}, {}) with sum of {}",
|
||||||
|
x, y, sum
|
||||||
|
);
|
||||||
|
|
||||||
let (x, y, sum, size) = find_variable_max_sum(&map);
|
let (x, y, sum, size) = find_variable_max_sum(&map);
|
||||||
println!("maximum variable sum found at ({}, {}) sum {} with size of {}", x, y, sum, size);
|
println!(
|
||||||
|
"maximum variable sum found at ({}, {}) sum {} with size of {}",
|
||||||
|
x, y, sum, size
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,11 @@ fn get_score(state: &[char; MAP_SIZE]) -> i64 {
|
||||||
score
|
score
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_game(initial_state: String, states: HashMap<String, char>, generations: i64) -> (i64, [i64; MAP_SIZE]) {
|
fn run_game(
|
||||||
|
initial_state: String,
|
||||||
|
states: HashMap<String, char>,
|
||||||
|
generations: i64,
|
||||||
|
) -> (i64, [i64; MAP_SIZE]) {
|
||||||
let mut last_state = ['.'; MAP_SIZE];
|
let mut last_state = ['.'; MAP_SIZE];
|
||||||
for (i, c) in initial_state.char_indices() {
|
for (i, c) in initial_state.char_indices() {
|
||||||
if c == '#' {
|
if c == '#' {
|
||||||
|
@ -30,7 +34,7 @@ fn run_game(initial_state: String, states: HashMap<String, char>, generations: i
|
||||||
let mut next_state = ['.'; MAP_SIZE];
|
let mut next_state = ['.'; MAP_SIZE];
|
||||||
for i in 2..(MAP_SIZE - 2) {
|
for i in 2..(MAP_SIZE - 2) {
|
||||||
let mut key = String::new();
|
let mut key = String::new();
|
||||||
for j in i-2..=i+2 {
|
for j in i - 2..=i + 2 {
|
||||||
key.push(last_state[j]);
|
key.push(last_state[j]);
|
||||||
}
|
}
|
||||||
if let Some(dest_state) = states.get(&key) {
|
if let Some(dest_state) = states.get(&key) {
|
||||||
|
@ -53,7 +57,14 @@ fn find_big_score(initial_state: String, states: HashMap<String, char>, iteratio
|
||||||
if diff1 == diff2 {
|
if diff1 == diff2 {
|
||||||
if diff2 == diff3 {
|
if diff2 == diff3 {
|
||||||
let sum = ((iterations - i as i64 - 1) * diff1) + scores[i];
|
let sum = ((iterations - i as i64 - 1) * diff1) + scores[i];
|
||||||
println!("({} - {}) * {} + {} = {}", iterations - 1, i as i64, diff1, scores[i], sum);
|
println!(
|
||||||
|
"({} - {}) * {} + {} = {}",
|
||||||
|
iterations - 1,
|
||||||
|
i as i64,
|
||||||
|
diff1,
|
||||||
|
scores[i],
|
||||||
|
sum
|
||||||
|
);
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
[[package]]
|
||||||
|
name = "day13"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
[package]
|
||||||
|
name = "day13"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Andrew Coleman <penguincoder@gmail.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
|
@ -0,0 +1,150 @@
|
||||||
|
/-------------------------------------\
|
||||||
|
/----------------------------------\ /---------------+-------------------------------------+--------\
|
||||||
|
/+----------------------------------+-------------------+---------------+----------------------------------\ | |
|
||||||
|
|| /---------+-------------------+-\ /-----------+--------------\ | | | /--------\
|
||||||
|
|| /------+--\ | /------+-+-+-----------+--------------+--------------\ | | | | |
|
||||||
|
|| | | | |/-----------+------+-+-+-----------+--------------+--------------+----+--+--\ | | |
|
||||||
|
|| /---------------+------+--+------++-----------+--\ | | | | /-------+----\ | | | | | | |
|
||||||
|
|| | /---+------+--+-\ || | | | | | | | | /+---------+----+--+--+-----+-\ | |
|
||||||
|
|| | | | | | | || | | | | | | /-+-------+---++---------+----+--+--+-----+-+--+\ |
|
||||||
|
|| | | | | | | || | /+---+-+-+-----------+----+-+-------+---++\ | | | | | | || |
|
||||||
|
|| | | /-+------+--+-+----++-----------+\|| | | | | | |/------+---+++--------+----+--+\ | | | || |
|
||||||
|
|| | | | | | | | || |||| | | | | | || | ||| | | || | | | || |
|
||||||
|
|| | | | | /----+--+-+----++-----------++++---+-+-+-----------+----+-++--\ | ||| | |/-++-+-----+-+--++-------+----\
|
||||||
|
/--------++-+-----------+-+-+-+----+--+-+----++-----------++++---+-+-+----\ | |/++--+---+---+++--------+----++-++-+-----+-+\ || | |
|
||||||
|
| || | /-+-+-+-+----+--+-+----++------\ |||| | | | | | |||| | | ||| | || || | | || || | |
|
||||||
|
| || | | | | | | | | | || | |||| | | | /--+------+----++++--+---+---+++--------+----++\|| | | || || | |
|
||||||
|
| /---++-+-------\ | | | | | | | | || | |||| | | | | | | |||| | | ||| /------+----+++++-+-----+-++-++-----\ | |
|
||||||
|
| | || | | | | | | | | | | /++------+----++++-\ | | | | | | |||| | | ||| | | ||||| | | || || | | |
|
||||||
|
| | || | | | | | | | | | | ||| | ||||/+-+-+-+-+--+------+----++++--+---+---+++-+------+----+++++-+---\ | || || | | |
|
||||||
|
| | || | /---+-+-+-+-+-+----+-\| | ||| | |||||| | | | | | | |||| | | ||| | /---+----+++++-+---+-+-++-++-----+-+-\ |
|
||||||
|
|/---+---++-+---+---+-+-+-+-+-+----+-++-+---+++------+----++++++-+-+\| | | | |||| | | ||| | | | ||||| | | | || || | | | |
|
||||||
|
|| | || | | | | | | | | | || | /+++------+----++++++-+-+++-+--+------+----++++--+---+---+++-+--+---+----+++++-+---+-+-++-++---\ | | | |
|
||||||
|
|| | || | | | | | | | | | || | |||| | |||||| | ||| | | | |||| | | ||| | | | ||||| | | | || || | | | | |
|
||||||
|
|| | || | | | | | | | | | || | |||| | /--++++++-+-+++-+--+------+----++++--+---+---+++-+-\| | ||||| | | | || || ^ | | | |
|
||||||
|
|| | |v | | | | | | | | | || | |||| | | |||||| | ||| | | | |||| | | ||| | || | ||||| | |/+-++-++---+-+-+-+\ |
|
||||||
|
|| | || | | /+-+-+-+-+-+----+-++-+--++++------+-+--++++++-+\||\-+--+------+----++++--+---//--+++-+-++---+--\ ||||| | ||| || \+---+-+-/ || |
|
||||||
|
|| | || | | || | | | \-+----+-+/ | |||| | | |||||| |||| /+--+----\ | |||| | | ||| | || | | ||||| | ||| || | | | || |
|
||||||
|
||/--+---++-+---+--++-+-+-+---+----+-+--+-\|||| | | |||||| |||| || | | | |||| | | ||| | || |/-+-+++++-+--\||| || | | | || |
|
||||||
|
||| | \+-+---+--++-+-+-+---+----+-+--+-+++++------+-+--++++++-++++-++--+----+-+----++++--+----+--+++-+-++---++-+-/|||| | |||| || | | | || |
|
||||||
|
|||/-+----+-+---+--++-+-+-+---+--\ | | | ||||| | | |||||| |||| || | /--+-+----++++--+----+--+++-+-++---++-+-\|||| | |||| || | | | || |
|
||||||
|
\+++-+----+-+---+--++-+-+-+---+--+-+-+--+-+++++------+-+--++++++-++++-++--/ | | | |||| /+----+--+++-+-++---++-+\||||| | |||| || | | | || |
|
||||||
|
||| | | | | || | | | | | | | | ||||| |/+--++++++-++++-++----+--+-+\ |||| || | ||| | || || ||||||| | |||| || | | | || |
|
||||||
|
||^ | | | | || | \-+---+--+-+-+--/ ||||| ||| |||||| |||| || | | || |||| || | ||| | || || ||||||| | |||| || | | | || |
|
||||||
|
||| | | | |/-++-+---+---+--+-+-+----+++++------+++--++++++-++++-++----+\ | || |||| || | ||| | || ||/+++++++-+--++++-++--+---+\| || |
|
||||||
|
||| | /--+-+---++-++\| | | | | | ||||| ||| \+++++-++++-++----++-+-++---++++-++----+--+++-+-++---/||||||||| | |||| || | ||| || |
|
||||||
|
||| | | | | || |||| | | | | | ||||| ||| /-+++++-++++-++----++\| || /-++++-++----+--+++-+-++----+++++++++-+--++++\|| | ||| || |
|
||||||
|
||| | | | | || |||| | |/-+-+-+----+++++------+++-+-+++++-++++-++----++++-++-+-++++-++----+--+++-+-++----+++++++++-+--+++++++--+-\ ||| || |
|
||||||
|
||| | | | | ||/++++---+---++-+-+-+----+++++------+++-+-+++++-++++-++----++++-++-+-++++-++----+--+++-+-++\ ||||||||| | ||||||| | | ||| || |
|
||||||
|
||| | | | | ||||||| | /-++-+-+-+----+++++\ ||| | ||||| |||| || |||| || | |||| || | ||| | ||| \++++++++-+--/|||||| | | ||| || |
|
||||||
|
||| | | | | ||||||| | | || |/+-+----++++++-----+++-+-+++++-++++-++----++++-++-+-++++-++----+--+++-+-+++----++++++++-+---++++++--+-+\||| || |
|
||||||
|
||| | | | | ||||||| | | || ||| | /-++++++-----+++-+-+++++-++++-++----++++-++-+-++++-++----+--+++-+-+++-\/-++++++++\| |||||| | ||||| || |
|
||||||
|
||| | | | | ||||||| | | || ||| | | |||||| ||| | ||||| |||| || |||| || | ||||/++----+--+++\| ||| || |||||||||| |||||| | ||||| || |
|
||||||
|
||| | | | | ||||||| | | || ||| | | ||||||/----+++-+-+++++-++++-++----++++-++\| ||||||| | ||||| ||| || |||||||||| |||||| | ||||| || |
|
||||||
|
|||/+-+--+-+-\ ||||||| | | || ||| | | ||||||| ||| | ||||| |||| || |||| |||| ||||||| | ||||| ||| || |||||||||| |||||| | ||||| || |
|
||||||
|
|||||/+--+-+-+-+++++++---+-+-++-+++-+--+-+++++++----+++-+-+++++-++++-++----++++-++++-+++++++----+--+++++-+++-++\|||||||||| |||||| | ||^|| || |
|
||||||
|
||||||| | | | ||||||| | | || ||| | | ||||||| ||| | ||||| |||| || |||| |||| ||||||| | |||||/+++-+++++++++++++---++++++--+-+++++---++-+\
|
||||||
|
||||||| | | | ||||||| | | || ||| | | ||||||| ||| | |||\+-++++-++----++++-++++-+++++++----+--+++++++++-+++++++++++++---/||||| | ||||| || ||
|
||||||
|
||||||| | | | ||||||| | | || |||/+--+-+++++++----+++-+-+++-+-++++-++----++++-++++-+++++++--\ | ||||||||| ||||||||||||| ||||| | ||||| || ||
|
||||||
|
||||||| | | | ||||||| | | || ||\++--+-+++++++----+++-+-+++-+-++/| || |||| |||| ||||||| /+-+--+++++++++-+++++++++++++---\||||| | ||||| || ||
|
||||||
|
||||||| | | | |||\+++---+-+-++-++-++--+-+++++++----+++-+-+++-+-+/ | || |||| |||| ||||||| || | ||||||||| ||||||||||||| |||||| | ||||| || ||
|
||||||
|
||^|||| | | | ||| ||| | | || || || | ||||||| ||| | ||| | | | || |||| |||| |||||\+-++-+--+++++++++-+++++/||||||| |||||| | ||||| || ||
|
||||||
|
||||||| | | | ||| |||/--+-+-++-++-++--+-+++++++----+++-+-+++-+-+\ | || |||| |||| ||||| | || | ||||||||| ||||| ||||||| |||||| | ||||| || ||
|
||||||
|
|||\+++--+-+-/ ||| |||| | | || || || | ||||||| ||| | ||| | || | || |||| |||| ||||| | || | |||||||\+-+++++-+++++++---++++++--+-+++++---/| ||
|
||||||
|
||| ||| | | ||| |||| | | || || || | ||||||| ||| | ||| | || | || |||| |||| ||||| | || | ||||||| | ||||| ||||||| |||||| | ||||| | ||
|
||||||
|
||| ||| | | ||| |||| | | || || || | |||||||/---+++-+-+++-+-++-+-++----++++-++++-+++++-+-++-+--+++++++-+-+++++\||||||| |||||| | ||||| | ||
|
||||||
|
||| ||| | | ||| |||| | | || || || | |||||||| ||| | ||| | || | || |||| |||| ||||| | || | ||||||| | ||||||||||||| |||||| | ||||| | ||
|
||||||
|
||| ||| | | ||| |||| | | || || || | |||||||| ||| | |\+-+-++-+-++----++++-++++-+++++-+-++-+--++/|||| | ||||||||||||| |||||| | ||||| | ||
|
||||||
|
||| ||| |/+---+++-++++--+-+-++-++-++--+-++++++++---+++-+\| | | || | || |||| |||| ||||| | || | || |||| | ||||||||||||| |||||| | ||||| | ||
|
||||||
|
||| ||| ||| ||| |||| | | || || || /+-++++++++---+++-+++-+-+-++-+-++----++++-++++-+++++-+-++-+--++-++++-+-+++++++++++++---++++++--+-+++++--\ | ||
|
||||||
|
||| ||| ||| ||| |||| /+-+-++-++-++-++-++++++++---+++-+++-+-+-++-+-++----++++-++++-+++++-+-++-+--++-++++-+-+++++++++++++---++++++\ | ||||| | | ||
|
||||||
|
||| ||| ||| ||| |||| || |/++-++-++-++-++++++++---+++-+++-+-+-++-+-++----++++-++++-+++++-+-++-+--++\|||| | ||||||||^|||| ||||||| | ||||| | | ||
|
||||||
|
||| ||| ||| ||| |||| || |||| || || || ||||\+++---+++-+++-+-+-++-+-++----++++-++++-+++++-+-++-+--+++++++-+-++++++++++++/ ||||||| | ||||| | | ||
|
||||||
|
||| ||| ||| ||| ||\+-++-++++-++-++-++-++++-+++---/|| ||| | | || | || |||| |||| ||||| | \+-+--+++++++-+-++++++++++++----/|||||| | ||||| | | ||
|
||||||
|
||| ||| ||| ||| || | || |||| || || || |||| |||/---++-+++-+-+-++-+-++-\ |||| |||| ||||| | | | ||||||| | |\+++++++++/ |||||| | ||||| | | ||
|
||||||
|
||| ||| ||| ||| || | || |||| || || || |||| |||| || ||| | | ||/+-++-+--++++-++++-+++++-+--+-+--+++++++-+-+-+++++++++------++++++-+-+++++--+-+\||
|
||||||
|
||| ||| ||| ||| || | || |||| || || || |||| |||| || ||| | | |||| || | |||| |||| ||||| | | | ||||||| | | ||||||||| |||||| | ||||| | ||||
|
||||||
|
||| ||\--+++---+++-+/ | || |||| || || || |||| |||| ^| ||| | | |||| || | |||| |||| ||||| | | | ||||||| | | ||||||||| |||||| | ||||| | ||||
|
||||||
|
||| || ||| ||| | | || |||| || || || |||| |||| || \++-+-+-++++-++-+--++/| |||| v|||| |/-+-+--+++++++-+-+-+++++++++\ |||||| | ||||| | ||||
|
||||||
|
||| || ||| ||| | | || |||| || || || |||| |||| \+--++-+-+-++++-++-+--++-+-+/|| |||||/++-+-+--+++++++-+-+-++++++++++\ |||||| | ||||| | ||||
|
||||||
|
||| || ||| ||| | | || |||| || || || |||| |||| |/-++-+-+-++++\|| | || | | || |||||||| | | ||||||| | | ||||||||||| |||||| | ||||| | ||||
|
||||||
|
|||/++---+++\ ||| | | || |||| || || ||/++++-++++----++-++-+-+-+++++++-+--++-+-+-++-++++++++-+-+--+++++++-+-+-+++++++++++--\ |||||| | ||||| | ||||
|
||||||
|
|||||| |||| ||| | | ^| |||| || ||/+++++++-++++----++-++-+-+-+++++++-+--++-+-+-++-++++++++-+-+--+++++++-+-+-+++++++++++--+-++++++\| ||||| | ||||
|
||||||
|
|||||| |||| ||| | | || ||||/++-++++++++++-++++----++-++-+-+-+++++++-+--++-+-+-++-++++++++-+-+->+++++++-+-+-+++++++++++--+-++++++++\||||| | ||||
|
||||||
|
|||||| |||| ||| | | || ||||||| |||||||||| |||| || || | | ||||||| | || | | || |||||||| | | ||||||| | | ||||||||||| | |||||||||||||| | ||||
|
||||||
|
|||||| |||| ||| | | || ||||||| |||||||||| |||| || || | | ||||||| | || | | || ||\+++++-+-+--+/||||| | | ||||||||||| | |||||||||||||| | ||||
|
||||||
|
|||||| |||| ||| | | || |\+++++-++++++++++-++++----++-++-+-+-+++++++-+--++-+-+-++-++-+++++-+-+--+-/|||| | | ||||||||||| | |||||||||||||| | ||||
|
||||||
|
|||||| |||| ||| | | || | ||||| |||||||||| |||| || || | | ||||||| | || | | || || ||||\-+-+--+--++++-+-+-+++++++++/| | |||||||||||||| | ||||
|
||||||
|
|||||| |||| ||| | | || | ||||| |||\++++++-++++----++-++-+-+-+++++++-+--++-+-+-++-++-++++--+-+--+--++++-+-+-+++++++++-+--+-++++++++++++++--/ ||||
|
||||||
|
|||||| |||| ||| | | ||/+-+++++-+++-++++++-++++----++-++-+-+-+++++++-+--++-+-+-++-++-++++--+-+--+--++++-+-+-+++++++++-+\ | |||||||||||||| ||||
|
||||||
|
|||||| |||| ||| | | |||\-+++++-+++-++++++-/||| || || | |/+++++++-+--++-+-+-++-++-++++--+-+--+--++++-+\| ||||||||| || | |||||v||||||v| ||||
|
||||||
|
|||||| \+++--+++-+--+-+++--+++++-+++-+++++/ ||| || || | ||||||||| | \+-+-+-++-++-++++--+-+--+--++++-+++-++++/|||| || | |||||||||||||| ||||
|
||||||
|
|||||| ||| ||| | | ||| ||||| ||| ||||| ||| || || | ||||||||| | | | | || || |||| | | | |||| ||| |||| |||| || | |||||||||||||| ||||
|
||||||
|
/++++++----+++--+++-+--+-+++--+++++-+++-+++++---+++----++-++-+-+++++++++-+\ | | |/++-++-++++--+-+--+--++++-+++-++++\|||| || | |||||||||||||| ||||
|
||||||
|
||||||| ||| ||| | | \++--+++++-+++-+++++---+++----++-++-+-+++++++++-++--+-+-++++-++-++++--+-+--+--++++-+++-+++++++++-++-+-+++++/|||||||| ||||
|
||||||
|
||||||| ||| ||| | | || ||||| |||/+++++---+++----++\||/+-+++++++++-++--+-+-++++-++-++++--+-+--+--++++-+++-+++++++++-++-+-+++++-++++++++\ ||||
|
||||||
|
||||||| ||| ||| | | || ||||| ||||||||| ||| |||||||/+++++++++-++--+-+\|||| || |||| | | | |||| ||| ||||||||| || | ||||| ||||||||| ||||
|
||||||
|
||||||| ||| ||| | | || \++++-+++++++++---+++----+++++++++++++++++-++--+-++++++-++-+++/ | | \--++++-+++-+++++++++-++-+-+++/| ||||||||| ||||
|
||||||
|
|||||||/---+++--+++-+--+--++---++++-+++++++++---+++----+++++++++++++++++-++--+-++++++-++-+++--\| | |||| ||| ||||||||| || | ||| | ||||||||| ||||
|
||||||
|
|||||||| ||| \++-+--+--++---++++-+/||||||| ||| \++++++++++++++++-++--+-++++++-++-+++--++-+-----+++/ ||| ||||||||| || | ||| | ||||||||| ||||
|
||||||
|
|||||||| ||| || | | || |||| | ||||||\---+++-----+++++++/|\++++++-++--+-++++++-++-+++--++-+-----+++--+++-+++++++++-++-+-+/| | ||||||||| ||||
|
||||||
|
|||||||| ||| || | | || |||| | |||||| ||| ||||||| | |||||| || | |||||| || ||| || | /+++--+++<+++++++++-++\| | | | ||||||||| ||||
|
||||||
|
|||||||| ||| || | | || |||| | |||||| ||| ||||||| | |||||| || | |||||| || ||| || | |||| ||| ||||||||| |||| | | | ||||||||| ||||
|
||||||
|
||||||||/--+++---++\| | || |||| | |||||| ||| ||||||| | |||||| || | ||\+++-++-+++--++-+----++++--+++-+++++++/| |||| | | | ||||||||| ||||
|
||||||
|
||||||||| ||| |||| | || |||| | |||||| \++-----+++++++-+-++++++-++--+-++-+/| || ||| || | |||| ||| ||||||| | |||| | | | ||||||||| ||||
|
||||||
|
||||||||| ||| |||| | || |||| | |||||| || ||||||| | |||||| || | || | | || ||| /++-+----++++--+++-+++++++-+\|||| | | | ||||||||| ||||
|
||||||
|
||||||||| ||| |||| | || |||| | |\++++-----++-----+/||||| | |||||| || | || | | || ||| ||| | |||| ||| ||||||| |||||| | | | ||||||||| ||||
|
||||||
|
||||||||| ||| |||| | || |||| | | ||||/----++-----+-+++++-+-++++++-++--+-++-+-+\|| ||| ||| | |||| ||| |||||\+-++++++-+-+-+-+++++++++---++/|
|
||||||
|
||||||||| ||| |||| | || |||\-+-+-+++++----++-----+-+++++-+-++++++-++--+-++-+-++++-+++-+++-+----++++--+++-+++++-+-++++++-+-+-+-++++/|||| || |
|
||||||
|
||||||||| ||| /-++++--+--++---+++--+-+-+++++---\|| \-+++++-+-+++/|| || | || | |||| ||| ||| | |||| ||| ||||| | |||||| | | | |||| |||| || |
|
||||||
|
|||||\+++--+++-+-+++/ | |\---+++--+-+-+++++---+++-------+++++-+-+++-++-++--+-++<+-++++-+++-+++-+----++++--+++-+++++-+-+++/|| | | | |||| |||| || |
|
||||||
|
|||\+-+++--+++-+-+++---+--+----++/ | | ||||| ||| ||||| | ||| || || | || | |||| ||| ||| | |||| ||| ||||| | ||| || | | | |||| |||| || |
|
||||||
|
||| | ||| ||| | ||| | | || | | ||||| ||| ||||| | ||| || || | || | |||| ||| ||| \----++++--+++-++/|| | ||| || | | | |||| |||| || |
|
||||||
|
||| | ||| ||| | \++---+--+----++---+-+-+++++---+++-------+++++-+-+++-++-++--/ || | |||| \++-+++------++++--+++-++-++-+-/|| || | | | |||| |||| || |
|
||||||
|
||| | ||| ||| | || | | /++---+-+\||||| ||| ||||| | ||| || || || | ||\+--++-+++------++++--+++-++-++-+--++-++-+-+-+-+/|| |||| || |
|
||||||
|
||| | ||| ||| | || | | ||| | ||||||| ||| ||||| | ||| || || /--++-+-++-+--++-+++------++++--+++-++-++\| || || | | | | || |||| || |
|
||||||
|
||| | ||| |\+-+--++---+--+---+++---+-+++++++---+++-------+++/| | ||| |\-++-+--++-+-++-+--++-+++------++++--+++-++-+++/ || || | | | | || |||| || |
|
||||||
|
||| | ||| | | | || | | ||| | ||||||v ||| ||| | | ||| | || | || | || | || ||| |||| ||| || ||| || || | | | | || |||| || |
|
||||||
|
||| | ||| | | | || | \---+++---+-+++++++---+++-------+/| | | ||| | || | || | || | || ||| |||| ||| || ||| || || | | | | || |||| || |
|
||||||
|
||| | ||| | | |/-++---+---\ ||| | ||||||| ||| | | | | ||| | || | || | || | || ||| \+++--+++-++-+++---++-/| | | | | || |||| || |
|
||||||
|
||| | ||| | | || || | | ||| | ||||||| /+++------\| | | | ||| | || | || | || | || ||| ||| ||| || ||| || | | | | | || |||| || |
|
||||||
|
||| | ||| | | || || | | ||| | ||\++++--++++------++-+-+-+-+++-+--++-+--++-+-++-+--++-+++-------+++--++/ || ||| || | | | | | || |||| || |
|
||||||
|
||| | ||| | | || || | | ||| /+-++-++++--++++------++-+-+-+-+++-+--++-+--++-+-++-+-\|| ||| ||| /++--++-+++---++--+-+-+-+-+-++-++++--\|| |
|
||||||
|
||| \-+++--+-/ || || | | ^|\--++-++-++++--++++------++-+-+-+-+++-+--++-+--++-+-++-+-+++-+++-------+++-+++--++-+++---++--+-+-+-+-+-/| |||| ||| |
|
||||||
|
|\+---+++--+---++-++---+---+--++---++-++-++++--++++------++-+-+-+-++/ | || | || | || | ||| ||| ||| ||| || ||| || | | | | | | |||| ||| |
|
||||||
|
\-+---+++--+---++-++---+---+--++---++-++-++++--++++------++-+-+-+-++--+--+/ | || \-++-+-+++-+++-------+++-+++--++-+/| || | | | | | | |||| ||| |
|
||||||
|
| ||| /+---++-++---+---+--++---++-++-++++--++++------++-+-+-+-++--+--+--+--++--\|| | ||| ||| ||| ||| || | | || | | | | | | |||| ||| |
|
||||||
|
| ||| || ||/++---+---+--++---++-++-++++--++++------++-+-+-+-++--+-\| \--++--+++-+-+++-+++-------+++-+++--++-+-/ || | | | | | | |||| ||| |
|
||||||
|
| ||| || |\+++---+---/ || || || |||| |||| || | | | || | || || ||| | ||\-+++-------+++-+++--++-+-----+/ | | | | | | |||| ||| |
|
||||||
|
| ||| || | ||| | || || || |||| |||| || | | | || | || || ||| \-++--+++-------+++-+++--++-+-----+---+-+-+-/ | | |||| ||| |
|
||||||
|
/-+---+++-++--\| ||| | /-++---++-++-++++--++++------++-+-+-+-++\ | || || ||| || ||| ||| ||| || | | | \-+---+--+-++++--+/| |
|
||||||
|
| | ||| || || ||| | | || || || |||| |||| || | | | ||| | || || ||| || ||| ||| ||| || | | | | | | |||| | | |
|
||||||
|
| | ||| || || ||| | | || || || |||| |||| || | | | ||| | || || ||| || ||| |\+-+++--++-+-----+---+---+---+--+-++/| | | |
|
||||||
|
| \---+++-++--++-+++---+----+-++---++-++-+/|| |||| || | | | |\+-+-++-----++--+++---++--+++-------+-+-+++--++-+-----+---+---+---+--+-++-+--+-/ |
|
||||||
|
| ||| || || ||| | | \+---++-+/ | || |||| || | | | | | | || || |||/--++--+++-------+-+-+++--++-+-----+--\| | | | || | | |
|
||||||
|
| ||| || || ||| | | | || | | || |||| || | | | | | | || || |||| || ||| | | ||| || | | || | | | || | | |
|
||||||
|
| ||| || || ||| | | | || | \-++--++++------++-+-+-+-+-+-+-++-----++--++++--++--+++-------+-+-+++--++-+-----+--+/ | | | || | | |
|
||||||
|
| ||| || || \++---+----+--+---++-+----++--++++------++-+-+-+-+-+-+-/| || |||| || ||| | | ||| || | | | | | | || | | |
|
||||||
|
| ||| || || || | | | || | \+--++++------++-+-+-+-+-+-+--+-----++--++++--++--+++-------+-+-+++--++-+-----+--+----+---+--+-/| | | |
|
||||||
|
| ||| || || || | | \---++-+-----+--++++------++-+-+-+-+-+-+--+-----++--++++--++--+++-------+-+-+++--++-+-----+--+----+---+--/ | | | |
|
||||||
|
\-----+++-++--/| || | | || \-----+--++++------++-+-+-+-+-+-+--+-----++--++++--++--+++-------+-+-+++--++-+-----+--+----+---/ | | | |
|
||||||
|
||| || | || | | || | |||| || \-+-+-+-+-+--+-----++--++++--++--+++-------+-+-+++--++-+-----+--+----+---------+-/ | |
|
||||||
|
||| \+---+--++---+----+------++-------+--++++------++---+-+-+-+-+--+-----++--/||| || ||| | | ||| || | | | | | | |
|
||||||
|
||| \---+--++---+----+------++-------+--++++------+/ | | | | \--+-----/| ||| || ||| /---+-+-+++--++-+-----+--+----+----\ | | |
|
||||||
|
||| | || | | || | |||| | | | | | | | ||| || \++---+---+-+-+++--++-+-----/ | | | | | |
|
||||||
|
||| | || | | || | |||\------+----+-+-+-+----/ | ||| || || | | | ||| || | | | | | | |
|
||||||
|
||| | || | | || | ||| | \-+-+-+-----------/ ||| |\---++---+---/ | \++--++-+--------+----+----+----+----/ |
|
||||||
|
||| | || | | |\-------+--+++-------+------+-+-+---------------+++--+----+/ | | || || | | | | | |
|
||||||
|
||| | || \----+------+--------+--+++-------+------+-/ | \++--+----+----+-----+--++--++-+--------+----/ | | |
|
||||||
|
|\+------+--++--------+------+--------+--+++-------+------+---+----------------++--+----/ | | || |\-+--------+---------+----/ |
|
||||||
|
| \------+--+/ \------+--------+--+++-------+------+---/ |\--+---------+-----+--++--+--+--------/ | |
|
||||||
|
\--------+--+----------------+--------+--+++-------+------+--------------------+---+---------+-----+--++--/ | | |
|
||||||
|
| | | | ||| | | | | \-----+--++-----+----------<-------/ |
|
||||||
|
\--+----------------+--------+--+/| | | | | | || | |
|
||||||
|
\----------------+--------+--+-+-------+------+--------------------+---+---------------+--/| | |
|
||||||
|
| | | | | | | | | | | |
|
||||||
|
| | \-+-------/ | | | | | | |
|
||||||
|
| | | \--------------------+---+---------------+---/ | |
|
||||||
|
| \----+-----------------------------------/ | \---------+--------------------------------/
|
||||||
|
| \---------------------------------------+-------------------------/
|
||||||
|
\-----------------------------------------------------/
|
|
@ -0,0 +1,204 @@
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::{BufRead, BufReader};
|
||||||
|
|
||||||
|
const MAP_SIZE: usize = 150;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
struct Cart {
|
||||||
|
x: usize,
|
||||||
|
y: usize,
|
||||||
|
x_delta: i8,
|
||||||
|
y_delta: i8,
|
||||||
|
intersection: u8,
|
||||||
|
removed: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Cart {
|
||||||
|
pub fn turn_right(&mut self) {
|
||||||
|
if self.x_delta == 0 {
|
||||||
|
if self.y_delta == 1 {
|
||||||
|
self.x_delta = -1;
|
||||||
|
} else {
|
||||||
|
self.x_delta = 1;
|
||||||
|
}
|
||||||
|
self.y_delta = 0;
|
||||||
|
} else {
|
||||||
|
if self.x_delta == 1 {
|
||||||
|
self.y_delta = 1;
|
||||||
|
} else {
|
||||||
|
self.y_delta = -1;
|
||||||
|
}
|
||||||
|
self.x_delta = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn turn_left(&mut self) {
|
||||||
|
if self.x_delta == 0 {
|
||||||
|
if self.y_delta == 1 {
|
||||||
|
self.x_delta = 1;
|
||||||
|
} else {
|
||||||
|
self.x_delta = -1;
|
||||||
|
}
|
||||||
|
self.y_delta = 0;
|
||||||
|
} else {
|
||||||
|
if self.x_delta == 1 {
|
||||||
|
self.y_delta = -1;
|
||||||
|
} else {
|
||||||
|
self.y_delta = 1;
|
||||||
|
}
|
||||||
|
self.x_delta = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn change_direction_at_intersection(&mut self) {
|
||||||
|
match self.intersection {
|
||||||
|
0 => self.turn_left(),
|
||||||
|
2 => self.turn_right(),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
self.intersection = (self.intersection + 1) % 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_collision(
|
||||||
|
map: &[[char; MAP_SIZE]; MAP_SIZE],
|
||||||
|
carts: &mut Vec<Cart>,
|
||||||
|
find_last: bool,
|
||||||
|
) -> (usize, usize, u32) {
|
||||||
|
let mut ticks = 0;
|
||||||
|
let cart_len = carts.len();
|
||||||
|
loop {
|
||||||
|
carts.sort_by(|a, b| {
|
||||||
|
if a.y == b.y {
|
||||||
|
a.x.cmp(&b.x)
|
||||||
|
} else {
|
||||||
|
a.y.cmp(&b.y)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for i in 0..cart_len {
|
||||||
|
if carts[i].removed {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let next_x = carts[i].x + carts[i].x_delta as usize;
|
||||||
|
let next_y = carts[i].y + carts[i].y_delta as usize;
|
||||||
|
|
||||||
|
for j in 0..cart_len {
|
||||||
|
if i != j && !carts[j].removed && carts[j].x == next_x && carts[j].y == next_y {
|
||||||
|
if find_last {
|
||||||
|
carts[j].removed = true;
|
||||||
|
carts[i].removed = true;
|
||||||
|
} else {
|
||||||
|
return (next_x, next_y, ticks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
match map[next_x][next_y] {
|
||||||
|
'/' => {
|
||||||
|
if carts[i].x_delta == 0 {
|
||||||
|
carts[i].turn_right();
|
||||||
|
} else {
|
||||||
|
carts[i].turn_left();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'\\' => {
|
||||||
|
if carts[i].x_delta == 0 {
|
||||||
|
carts[i].turn_left();
|
||||||
|
} else {
|
||||||
|
carts[i].turn_right();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'+' => {
|
||||||
|
carts[i].change_direction_at_intersection();
|
||||||
|
}
|
||||||
|
' ' => {
|
||||||
|
panic!("off the rails!");
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
carts[i].x = next_x;
|
||||||
|
carts[i].y = next_y;
|
||||||
|
|
||||||
|
if find_last {
|
||||||
|
let mut remaining_count = 0;
|
||||||
|
let mut remaining_index = 0;
|
||||||
|
for j in 0..cart_len {
|
||||||
|
if carts[j].removed == false {
|
||||||
|
remaining_count += 1;
|
||||||
|
remaining_index = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if remaining_count == 1 {
|
||||||
|
return (carts[remaining_index].x, carts[remaining_index].y, ticks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ticks += 1; // gross
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let lines: Vec<String> = BufReader::new(File::open("input").unwrap())
|
||||||
|
.lines()
|
||||||
|
.map(|line| line.unwrap())
|
||||||
|
.collect();
|
||||||
|
let mut map = [[' '; MAP_SIZE]; MAP_SIZE];
|
||||||
|
let mut carts: Vec<Cart> = Vec::with_capacity(20);
|
||||||
|
let mut line_number = 0;
|
||||||
|
for line in lines.iter() {
|
||||||
|
for (j, c) in line.char_indices() {
|
||||||
|
if c == 'v' {
|
||||||
|
carts.push(Cart {
|
||||||
|
x: j,
|
||||||
|
y: line_number,
|
||||||
|
x_delta: 0,
|
||||||
|
y_delta: 1,
|
||||||
|
intersection: 0,
|
||||||
|
removed: false,
|
||||||
|
});
|
||||||
|
map[j][line_number] = '|';
|
||||||
|
} else if c == '^' {
|
||||||
|
carts.push(Cart {
|
||||||
|
x: j,
|
||||||
|
y: line_number,
|
||||||
|
x_delta: 0,
|
||||||
|
y_delta: -1,
|
||||||
|
intersection: 0,
|
||||||
|
removed: false,
|
||||||
|
});
|
||||||
|
map[j][line_number] = '|';
|
||||||
|
} else if c == '<' {
|
||||||
|
carts.push(Cart {
|
||||||
|
x: j,
|
||||||
|
y: line_number,
|
||||||
|
x_delta: -1,
|
||||||
|
y_delta: 0,
|
||||||
|
intersection: 0,
|
||||||
|
removed: false,
|
||||||
|
});
|
||||||
|
map[j][line_number] = '-';
|
||||||
|
} else if c == '>' {
|
||||||
|
carts.push(Cart {
|
||||||
|
x: j,
|
||||||
|
y: line_number,
|
||||||
|
x_delta: 1,
|
||||||
|
y_delta: 0,
|
||||||
|
intersection: 0,
|
||||||
|
removed: false,
|
||||||
|
});
|
||||||
|
map[j][line_number] = '-';
|
||||||
|
} else {
|
||||||
|
map[j][line_number] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
line_number += 1;
|
||||||
|
}
|
||||||
|
let (x, y, ticks) = find_collision(&map, &mut carts.clone(), false);
|
||||||
|
println!("found collision at {},{} after {} ticks", x, y, ticks);
|
||||||
|
let (x, y, ticks) = find_collision(&map, &mut carts.clone(), true);
|
||||||
|
println!(
|
||||||
|
"found last remaining cart at {},{} after {} ticks",
|
||||||
|
x, y, ticks
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
[[package]]
|
||||||
|
name = "day14"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
[package]
|
||||||
|
name = "day14"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Andrew Coleman <penguincoder@gmail.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
|
@ -0,0 +1 @@
|
||||||
|
939601
|
|
@ -0,0 +1,51 @@
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::{BufRead, BufReader};
|
||||||
|
|
||||||
|
fn mutate_chocolate(scores: &mut Vec<u8>, recipes: i32) -> (String, usize) {
|
||||||
|
let mut elf1: usize = 0;
|
||||||
|
let mut elf2: usize = 1;
|
||||||
|
loop {
|
||||||
|
let elf1score = scores[elf1];
|
||||||
|
let elf2score = scores[elf2];
|
||||||
|
let sum = elf1score + elf2score;
|
||||||
|
let sum_str = format!("{}", sum);
|
||||||
|
for c in sum_str.chars() {
|
||||||
|
scores.push(c as u8 - 48);
|
||||||
|
}
|
||||||
|
|
||||||
|
if scores.len() > recipes as usize + 100000000 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
elf1 = (elf1 + (1 + elf1score as usize)) % scores.len();
|
||||||
|
elf2 = (elf2 + (1 + elf2score as usize)) % scores.len();
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut result = String::new();
|
||||||
|
for i in 0..10 {
|
||||||
|
result.push((scores[recipes as usize + i] + 48) as char);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut score_str = String::with_capacity(scores.len());
|
||||||
|
for s in scores.iter() {
|
||||||
|
score_str.push((s + 48) as char);
|
||||||
|
}
|
||||||
|
let recipe_str = format!("{}", recipes);
|
||||||
|
let recipe_index = score_str.find(recipe_str.as_str()).unwrap();
|
||||||
|
|
||||||
|
(result, recipe_index)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut line = String::new();
|
||||||
|
BufReader::new(File::open("input").unwrap())
|
||||||
|
.read_line(&mut line)
|
||||||
|
.unwrap();
|
||||||
|
let recipes = line.trim().parse::<i32>().unwrap();
|
||||||
|
let mut scores: Vec<u8> = Vec::with_capacity(1000000);
|
||||||
|
scores.push(3);
|
||||||
|
scores.push(7);
|
||||||
|
let (final_score, final_index) = mutate_chocolate(&mut scores.clone(), recipes);
|
||||||
|
println!("part 1 final score {}", final_score);
|
||||||
|
println!("recipe repeated at index {}", final_index);
|
||||||
|
}
|
Loading…
Reference in New Issue