aoc

My solutions for the Advent of Code
git clone https://git.tronto.net/aoc
Download | Log | Files | Refs | README

common.rs (1859B)


      1 pub type Grid = Vec<Vec<char>>;
      2 
      3 fn read_rows() -> Vec<Vec<char>> {
      4     let mut rows = Vec::<Vec::<char>>::new();
      5     let mut line = String::new();
      6     loop {
      7         let mut row = Vec::<char>::new();
      8 
      9         std::io::stdin().read_line(&mut line).unwrap();
     10         let line_chars = line.as_bytes();
     11         if line_chars[1] == '1' as u8 {
     12             let _ = std::io::stdin().read_line(&mut line);
     13             break;
     14         }
     15 
     16         let mut i = 0;
     17         while i < line_chars.len() {
     18             row.push(line_chars[i+1] as char);
     19             i += 4;
     20         }
     21 
     22         rows.push(row);
     23         line.clear();
     24     }
     25 
     26     rows
     27 }
     28 
     29 fn rows_to_grid(rows: &Vec<Vec<char>>) -> Grid {
     30     let mut grid = vec![Vec::<char>::new(); rows[0].len()];
     31     for row in rows.iter().rev() {
     32         for i in 0..row.len() {
     33             if row[i] != ' ' {
     34                 grid[i].push(row[i]);
     35             }
     36         }
     37     }
     38     grid
     39 }
     40 
     41 fn next_usize(line: &str, s: usize) -> (usize, usize) {
     42     let i = line[s..].find(|c: char| c.is_digit(10)).unwrap() + s;
     43     let j = line[i..].find(|c: char| c.is_whitespace()).unwrap() + i;
     44     (line[i..j].parse::<usize>().unwrap(), j)
     45 }
     46 
     47 pub fn read_move(line: &str) -> (usize, usize, usize) {
     48     let (n, i) = next_usize(line, 0);
     49     let (from, i) = next_usize(line, i);
     50     let (to, _) = next_usize(line, i);
     51 
     52     (n, from, to)
     53 }
     54 
     55 pub fn get_grid_from_stdin() -> Grid {
     56     rows_to_grid(&read_rows())
     57 }
     58 
     59 pub fn apply_moves_from_stdin<F: Fn(&mut Grid, &str) -> ()>(grid: &mut Grid, apply_move: F) {
     60     let mut line = String::new();
     61     while std::io::stdin().read_line(&mut line).unwrap() > 0 {
     62         apply_move(grid, &line);
     63         line.clear();
     64     }
     65 }
     66 
     67 pub fn print_top(grid: &Grid) {
     68     for column in grid {
     69         let c = match column.last() { Some(d) => d, None => &'_' };
     70         print!("{}", c);
     71     }
     72     println!();
     73 }