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