solution: refactor day6 with 2d array

This commit is contained in:
Matej Janezic 2022-12-03 22:01:47 +01:00
parent 0000012039
commit 0000013076
Signed by: janezicmatej
GPG Key ID: 4298E230ED37B2C0
1 changed files with 18 additions and 32 deletions

View File

@ -1,17 +1,15 @@
use hashbrown::HashMap;
use lazy_static::lazy_static;
use regex::Regex;
use Instruction::*;
#[derive(Debug)]
struct Point {
x: u32,
y: u32,
x: usize,
y: usize,
}
impl FromIterator<u32> for Point {
fn from_iter<T: IntoIterator<Item = u32>>(iter: T) -> Self {
impl FromIterator<usize> for Point {
fn from_iter<T: IntoIterator<Item = usize>>(iter: T) -> Self {
let mut it = iter.into_iter();
Point {
x: it.next().unwrap(),
@ -52,15 +50,9 @@ impl From<&str> for Command {
_ => unreachable!(),
};
let from: Point = capture[2]
.split(',')
.map(|x| x.parse::<u32>().unwrap())
.collect();
let from: Point = capture[2].split(',').map(|x| x.parse().unwrap()).collect();
let to: Point = capture[3]
.split(',')
.map(|x| x.parse::<u32>().unwrap())
.collect();
let to: Point = capture[3].split(',').map(|x| x.parse().unwrap()).collect();
Command {
instruction,
@ -71,7 +63,7 @@ impl From<&str> for Command {
}
pub fn part_one(input: &str) -> Option<u32> {
let mut map = HashMap::<(u32, u32), bool>::new();
let mut a = [[0; 1000]; 1000];
for line in input.trim().split('\n') {
let Command {
instruction,
@ -81,20 +73,18 @@ pub fn part_one(input: &str) -> Option<u32> {
for x in from.x..=to.x {
for y in from.y..=to.y {
match instruction {
On => *map.entry((x, y)).or_default() = true,
Off => *map.entry((x, y)).or_default() = false,
Toggle => {
map.entry((x, y)).or_default();
map.insert((x, y), !map[&(x, y)]);
On => a[x][y] = 1,
Off => a[x][y] = 0,
Toggle => a[x][y] = 1 - a[x][y],
}
}
}
}
}
Some(map.values().filter(|&x| *x).count() as u32)
Some(a.iter().map(|x| -> u32 { x.iter().sum() }).sum())
}
pub fn part_two(input: &str) -> Option<u32> {
let mut map = HashMap::<(u32, u32), u32>::new();
let mut a = [[0; 1000]; 1000];
for line in input.trim().split('\n') {
let Command {
instruction,
@ -104,19 +94,15 @@ pub fn part_two(input: &str) -> Option<u32> {
for x in from.x..=to.x {
for y in from.y..=to.y {
match instruction {
On => *map.entry((x, y)).or_default() += 1,
Toggle => *map.entry((x, y)).or_default() += 2,
Off => {
map.entry((x, y)).or_default();
if map[&(x, y)] > 0 {
*map.entry((x, y)).or_default() -= 1;
On => a[x][y] = 1,
Off if a[x][y] > 0 => a[x][y] -= 1,
Off => (),
Toggle => a[x][y] += 2,
}
}
}
}
}
}
Some(map.values().into_iter().sum())
Some(a.iter().map(|x| -> u32 { x.iter().sum() }).sum())
}
fn main() {
let input = &aoc::read_file("inputs", 6);