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 }