Skip to content

Commit

Permalink
[2023] Complete Day 13
Browse files Browse the repository at this point in the history
  • Loading branch information
connorslade committed Dec 13, 2023
1 parent ee8ffb4 commit 3cf9f48
Showing 1 changed file with 36 additions and 34 deletions.
70 changes: 36 additions & 34 deletions aoc_2023/src/day_13.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ impl Solution for Day13 {

let mut out = 0;
for valley in valleys {
if let Some(r) = valley.horizontal_reflection() {
if let Some(r) = valley.horizontal_reflection(0) {
out += 100 * r;
continue;
}

if let Some(r) = valley.vertical_reflection() {
if let Some(r) = valley.vertical_reflection(0) {
out += r;
}
}
Expand All @@ -26,7 +26,21 @@ impl Solution for Day13 {
}

fn part_b(&self, input: &str) -> Answer {
Answer::Unimplemented
let valleys = parse(input);

let mut out = 0;
for valley in valleys {
if let Some(r) = valley.horizontal_reflection(1) {
out += 100 * r;
continue;
}

if let Some(r) = valley.vertical_reflection(1) {
out += r;
}
}

out.into()
}
}

Expand All @@ -48,59 +62,45 @@ fn parse(input: &str) -> Vec<Valley> {
impl Valley {
// Find a horizontal reflection in the valley.
// Horizontal reflections is from left to right.
fn horizontal_reflection(&self) -> Option<usize> {
'outer: for mid in 1..self.tiles.len() - 1 {
fn horizontal_reflection(&self, error: usize) -> Option<usize> {
for mid in 1..=self.tiles.len() - 1 {
let side_len = mid.min(self.tiles.len() - mid);
let start = mid - side_len;

for a in start..=mid {
let mut diff = 0;
for a in start..mid {
let b = mid * 2 - a - 1;
if b >= self.tiles.len() {
continue;
}

let mut diff = 0;
for i in 0..self.tiles[a].len() {
if self.tiles[a][i] != self.tiles[b][i] {
diff += 1;
}
}

if diff != 0 {
continue 'outer;
diff += (self.tiles[a][i] != self.tiles[b][i]) as usize
}
}

return Some(mid);
if diff == error {
return Some(mid);
}
}

None
}

fn vertical_reflection(&self) -> Option<usize> {
'outer: for mid in 1..=self.tiles[0].len() - 1 {
fn vertical_reflection(&self, error: usize) -> Option<usize> {
for mid in 1..=self.tiles[0].len() - 1 {
let side_len = mid.min(self.tiles[0].len() - mid);
let start = mid - side_len;

for a in start..=mid {
let mut diff = 0;
for a in start..mid {
let b = mid * 2 - a - 1;
if b >= self.tiles[0].len() {
continue;
}

let mut diff = 0;
for i in 0..self.tiles.len() {
if self.tiles[i][a] != self.tiles[i][b] {
diff += 1;
}
}

if diff != 0 {
continue 'outer;
diff += (self.tiles[i][a] != self.tiles[i][b]) as usize
}
}

return Some(mid);
if diff == error {
return Some(mid);
}
}

None
Expand Down Expand Up @@ -139,6 +139,8 @@ mod test {

#[test]
fn part_b() {
assert_eq!(Day13.part_b(CASE), ().into());
assert_eq!(Day13.part_b(CASE), 400.into());
}
}

// 31974

0 comments on commit 3cf9f48

Please sign in to comment.