[dependencies]
advent_of_code_common = { path = "advent_of_code_common" }
-itertools = "0.13"
+itertools = "0.14"
regex = "1"
-nalgebra = "0.33"
+nalgebra = "0.34"
num = "0.4"
rustc-hash = "2.1"
let ids: Vec<i32> = l
.unwrap()
.split_whitespace()
- .into_iter()
.map(|n| n.parse::<i32>().unwrap())
.collect();
let mut diff: Vec<i32> = levels.iter().tuple_windows().map(|(a, b)| b - a).collect();
if diff.iter().map(|v| v.signum()).sum::<i32>() < 0 {
for v in diff.iter_mut() {
- *v = *v * -1;
+ *v *= -1;
}
}
if diff[p - 1] > 3 {
diff[p - 1] += diff[p];
}
+ } else if diff[p - 1] > diff[p + 1] {
+ diff[p - 1] += diff[p];
+ if diff[p - 1] == 0 {
+ return nb;
+ }
} else {
- if diff[p - 1] > diff[p + 1] {
- diff[p - 1] += diff[p];
- if diff[p - 1] == 0 {
- return nb;
- }
- } else {
- diff[p + 1] += diff[p];
- if diff[p + 1] == 0 {
- return nb;
- }
+ diff[p + 1] += diff[p];
+ if diff[p + 1] == 0 {
+ return nb;
}
}
}
let mut lines_iter = lines.iter();
let mut page_ordering = PageOrdering::new();
- while let Some(l) = lines_iter.next() {
+ for l in lines_iter.by_ref() {
if l.is_empty() {
break;
}
- let pages = utils::split_to_vec(&l, "|");
+ let pages = utils::split_to_vec(l, "|");
page_ordering.add_page_order(pages[0], pages[1]);
}
let mut updates: Updates = vec![];
- while let Some(l) = lines_iter.next() {
- updates.push(utils::split_to_vec(&l, ","));
+ for l in lines_iter.by_ref() {
+ updates.push(utils::split_to_vec(l, ","));
}
(page_ordering, updates)
{
updates_corrected.swap(i, i + 1);
modified = true;
- if i > 0 {
- i -= 1;
- }
+ i = i.saturating_sub(1);
} else {
i += 1;
}
if inside(map, obstacle_pos)
&& !map[(obstacle_pos.x as usize, obstacle_pos.y as usize)]
&& map_visited[(obstacle_pos.x as usize, obstacle_pos.y as usize)].is_none()
- {
- if does_it_loop(
+ && does_it_loop(
PathIterator::new(map, pos, dir, Some(obstacle_pos)),
&map_visited,
- ) {
- nb_loops += 1;
- }
+ )
+ {
+ nb_loops += 1;
}
}
nb_loops
let mut map_visited = map_visited.clone();
for (pos, dir) in path {
let visited = map_visited[(pos.x as usize, pos.y as usize)];
- if visited.is_none() {
+
+ if let Some(visited) = visited {
+ if visited == dir {
+ return true;
+ }
+ } else {
map_visited[(pos.x as usize, pos.y as usize)] = Some(dir);
- } else if visited.unwrap() == dir {
- return true;
}
}
- return false;
+ false
}
#[cfg(test)]
.lines()
.map(|l| {
let l = l.unwrap();
- let mut result_and_rest = l.split(": ").into_iter();
+ let mut result_and_rest = l.split(": ");
Equation {
result: result_and_rest.next().unwrap().parse().unwrap(),
operands: utils::split_to_vec(result_and_rest.next().unwrap(), " "),
return result == operands[0];
}
let last = operands[l - 1];
- if result % last == 0 {
- if is_valid(result / last, &operands[0..l - 1]) {
- return true;
- }
+ if result % last == 0 && is_valid(result / last, &operands[0..l - 1]) {
+ return true;
}
let sub = result - last;
if sub >= 0 {
return result == operands[0];
}
let last = operands[l - 1];
- if result % last == 0 {
- if is_valid(result / last, &operands[0..l - 1]) {
- return true;
- }
+ if result % last == 0 && is_valid(result / last, &operands[0..l - 1]) {
+ return true;
}
let sub = result - last;
if sub >= 0 {
}
let p = 10i64.pow(utils::nb_of_digits_i64(last));
- if sub % p == 0 {
- if is_valid(sub / p, &operands[0..l - 1]) {
- return true;
- }
+ if sub % p == 0 && is_valid(sub / p, &operands[0..l - 1]) {
+ return true;
}
}
false
for i in 0..nr {
let current = antennae[(i, j)];
if current != EMPTY {
- antennae_positions
- .entry(current)
- .or_insert(Vec::new())
- .push((i, j));
+ antennae_positions.entry(current).or_default().push((i, j));
}
}
}
for (x, y) in positions
.iter()
.combinations(2)
- .map(|positions| antinode_positions(positions, &mode, (nr, nc)))
- .flatten()
+ .flat_map(|positions| antinode_positions(positions, &mode, (nr, nc)))
{
if !antinodes[(x as usize, y as usize)] {
antinodes[(x as usize, y as usize)] = true;
pub fn defrag_v1(mut memory: Vec<u32>) -> Vec<u32> {
fn next_empty_space_pos(from: usize, memory: &[u32]) -> usize {
- for i in from..memory.len() {
- if memory[i] == EMPTY {
+ for (i, v) in memory.iter().enumerate().skip(from) {
+ if *v == EMPTY {
return i;
}
}
}
start_positions
- .into_iter()
+ .iter()
.map(|pos| {
- let n = get_nb_summits(
+ get_nb_summits(
*pos,
map,
&mut if multiple_paths {
} else {
Some(DMatrix::<bool>::repeat(map.nrows(), map.ncols(), false))
},
- );
- n
+ )
})
.sum()
}
add_or_set(&mut stones, 1, n);
} else {
let nb_digits = utils::nb_of_digits_u64(stone);
- if nb_digits % 2 == 0 {
+ if nb_digits.is_multiple_of(2) {
let base = 10u64.pow(nb_digits / 2);
add_or_set(&mut stones, stone / base, n);
add_or_set(&mut stones, stone % base, n);
let mut equations = Vec::new();
let mut iter = reader.lines();
- loop {
- if let Some(Ok(line1)) = iter.next() {
- let a_cap = button_a.captures(&line1).unwrap();
- let a_factors = Vector2::new(
- a_cap[1].parse::<i64>().unwrap(),
- a_cap[2].parse::<i64>().unwrap(),
- );
- let line2 = iter.next().unwrap().unwrap();
- let b_cap = button_b.captures(&line2).unwrap();
- let b_factors = Vector2::new(
- b_cap[1].parse::<i64>().unwrap(),
- b_cap[2].parse::<i64>().unwrap(),
- );
- let line3 = iter.next().unwrap().unwrap();
- let prize_cap = prize.captures(&line3).unwrap();
- let prize_xy = Vector2::new(
- prize_cap[1].parse::<i64>().unwrap(),
- prize_cap[2].parse::<i64>().unwrap(),
- );
- let _ = iter.next();
- equations.push((a_factors, b_factors, prize_xy));
- } else {
- break;
- }
+ while let Some(Ok(line1)) = iter.next() {
+ let a_cap = button_a.captures(&line1).unwrap();
+ let a_factors = Vector2::new(
+ a_cap[1].parse::<i64>().unwrap(),
+ a_cap[2].parse::<i64>().unwrap(),
+ );
+ let line2 = iter.next().unwrap().unwrap();
+ let b_cap = button_b.captures(&line2).unwrap();
+ let b_factors = Vector2::new(
+ b_cap[1].parse::<i64>().unwrap(),
+ b_cap[2].parse::<i64>().unwrap(),
+ );
+ let line3 = iter.next().unwrap().unwrap();
+ let prize_cap = prize.captures(&line3).unwrap();
+ let prize_xy = Vector2::new(
+ prize_cap[1].parse::<i64>().unwrap(),
+ prize_cap[2].parse::<i64>().unwrap(),
+ );
+ let _ = iter.next();
+ equations.push((a_factors, b_factors, prize_xy));
}
equations
}
area_size: (i64, i64),
seconds: i64,
) -> impl Iterator<Item = (i64, i64)> + use<'a> {
- robots.into_iter().map(move |(pos, vel)| {
+ robots.iter().map(move |(pos, vel)| {
let pos = pos + vel * seconds;
(
pos[0].rem_euclid(area_size.0),