advent-of-code

Perserverance, or the lack thereof

git clone git://git.shimmy1996.com/advent-of-code.git

main.rs (3194B)

    1 use std::collections::HashSet;
    2 
    3 #[derive(Debug, Copy, Clone)]
    4 enum FoldInstruction {
    5     X(i32),
    6     Y(i32),
    7 }
    8 
    9 impl FoldInstruction {
   10     fn new(s: &str) -> FoldInstruction {
   11         let mut it = s.split("=");
   12         let axis = it.next().unwrap();
   13         let coord = it.next().unwrap().parse::<i32>().unwrap();
   14         match axis.chars().last() {
   15             Some('x') => FoldInstruction::X(coord),
   16             Some('y') => FoldInstruction::Y(coord),
   17             _ => unreachable!(),
   18         }
   19     }
   20 
   21     fn fold(&self, paper: &HashSet<(i32, i32)>) -> HashSet<(i32, i32)> {
   22         let mut folded_paper = HashSet::new();
   23         for (x, y) in paper {
   24             match self {
   25                 Self::X(x_fold) => match x.cmp(x_fold) {
   26                     std::cmp::Ordering::Less => {
   27                         folded_paper.insert((*x, *y));
   28                     }
   29                     std::cmp::Ordering::Greater => {
   30                         folded_paper.insert((x_fold - (*x - x_fold), *y));
   31                     }
   32                     // folded axis is discarded
   33                     std::cmp::Ordering::Equal => (),
   34                 },
   35                 Self::Y(y_fold) => match y.cmp(y_fold) {
   36                     std::cmp::Ordering::Less => {
   37                         folded_paper.insert((*x, *y));
   38                     }
   39                     std::cmp::Ordering::Greater => {
   40                         folded_paper.insert((*x, y_fold - (*y - y_fold)));
   41                     }
   42                     std::cmp::Ordering::Equal => (),
   43                 },
   44             }
   45         }
   46         folded_paper
   47     }
   48 }
   49 
   50 fn main() {
   51     let input = std::fs::read_to_string("input.txt")
   52         .unwrap()
   53         .trim()
   54         .split('\n')
   55         .map(|s| s.to_string())
   56         .collect::<Vec<String>>();
   57     let split = input.iter().position(|s| s == "").unwrap();
   58     let paper = input[..split]
   59         .iter()
   60         .map(|s| {
   61             let mut it = s.split(",");
   62             (
   63                 it.next().unwrap().parse::<i32>().unwrap(),
   64                 it.next().unwrap().parse::<i32>().unwrap(),
   65             )
   66         })
   67         .collect::<HashSet<_>>();
   68     let fold_instructions = input[(split + 1)..]
   69         .iter()
   70         .map(|s| FoldInstruction::new(s))
   71         .collect::<Vec<_>>();
   72     // 842
   73     println!("Part 1: {}", part_1(&paper, &fold_instructions));
   74     // BFKRCJZU
   75     println!("Part 2:");
   76     part_2(&paper, &fold_instructions);
   77 }
   78 
   79 fn part_1(paper: &HashSet<(i32, i32)>, fold_instructions: &Vec<FoldInstruction>) -> usize {
   80     fold_instructions[0].fold(paper).len()
   81 }
   82 
   83 fn plot(paper: &HashSet<(i32, i32)>) {
   84     let x_max = *paper.iter().map(|(x, _)| x).max().unwrap();
   85     let y_max = *paper.iter().map(|(_, y)| y).max().unwrap();
   86     // need to flip x and y for letters to show up
   87     for y in 0..=y_max {
   88         for x in 0..=x_max {
   89             print!("{}", if paper.contains(&(x, y)) { '#' } else { '.' });
   90         }
   91         println!();
   92     }
   93 }
   94 
   95 fn part_2(paper: &HashSet<(i32, i32)>, fold_instructions: &Vec<FoldInstruction>) {
   96     let mut folded_paper = paper.clone();
   97     for fi in fold_instructions {
   98         folded_paper = fi.fold(&folded_paper);
   99     }
  100     plot(&folded_paper);
  101 }