use std::env::args; use std::fs::File; use std::io::BufRead; use std::io::BufReader; fn print_map(map: &Vec, rows: usize, cols: usize) { for row in 0..rows { for col in 0..cols { print!("{}", match map[row * cols + col] { 1 => '>', 2 => 'v', _ => '.', }); } println!(""); } println!(""); } fn main() { let path = args().nth(1).unwrap(); let file = File::open(path).unwrap(); let mut map: Vec = vec![]; let mut rows = 0; let mut cols = 0; for line in BufReader::new(file).lines() { let l = line.unwrap(); cols = l.len(); rows += 1; for c in l.chars() { map.push(match c { '>' => 1, 'v' => 2, _ => 0, }); } } print_map(&map, rows, cols); for i in 1.. { let mut move_x = vec![]; for row in 0..rows { for col in 0..cols { let i = row * cols + col; let j = row * cols + (col + 1) % cols; if map[i] == 1 && map[j] == 0 { move_x.push((i, j)); } } } for (i, j) in move_x.iter() { map[*i] = 0; map[*j] = 1; } let mut move_y = vec![]; for col in 0..cols { for row in 0..rows { let i = row * cols + col; let j = (row + 1) % rows * cols + col; if map[i] == 2 && map[j] == 0 { move_y.push((i, j)); } } } for (i, j) in move_y.iter() { map[*i] = 0; map[*j] = 2; } println!("{}", i); print_map(&map, rows, cols); if move_x.len() == 0 && move_y.len() == 0 { break; } } }