Jan 3rd, 2022 under Programming Rust Advent of Code
With 2021 done, wanted to go back and put together a gist list of the input parsing, using standard crate Rust, for future reference
List of numbers
Day 1
Easy enough, leverage parse::<type>
turbo fish for your correct type size:
let stdin = io::stdin();
let mut numbers: Vec<i32> = Vec::new();
for line in stdin.lock().lines() {
numbers.push(line.unwrap().parse::<i32>().unwrap());
}
List of commands
Day 2, Day 13 (element 2), Day 21. These vary a bit, based upon the command structure, number of options, but effectivly use split()
or replacen()
for each line.
Below is an example of two-part command, direction and magnituded, separated by space:
let stdin = io::stdin();
let lines: Vec<String> = stdin.lock().lines().flatten().collect();
lines.iter().for_each(|line| {
let mut command = line.split_whitespace();
let direction = command.next().unwrap();
let magnitude = command.next().unwrap().parse::<i32>().unwrap();
match direction {
"forward" => horizontal += magnitude,
"up" => depth -= magnitude,
"down" => depth += magnitude,
_ => println!("Throw the switch Vern, she's pumping mud")
}
});
List of bits
Day 3. Bit packed integers
let stdin = io::stdin();
let bits: Vec<u32> = stdin.lock().lines().flatten()
.flat_map(|bstr| u32::from_str_radix(&bstr, 2)).collect();
List of coordinates
List of coordinates: Day 13 (element 1), Day 19. Pretty common to leverage a struct, called Point
for storing:
let stdin = io::stdin();
let lines: Vec<String> = stdin.lock().lines().flatten().collect();
let mut points: Vec<Point> = lines.iter().filter_map(|line| {
match line.contains(",") {
false => None,
true => {
let mut cord = line.split(",");
let x = cord.next().unwrap().parse::<u16>().unwrap();
let y = cord.next().unwrap().parse::<u16>().unwrap();
return Some(Point { x: x, y: y});
}
}
}).collect();
Single-line CSV of numbers
Day 4 (element 1), Day 6, Day 7
let start = Instant::now();
let stdin = io::stdin();
let mut numbers: Vec<i32> = stdin.lock().lines().next().unwrap().unwrap().split(",").flat_map(|s| s.trim().parse::<i32>()).collect();
Matrix of numbers/characters
Day 4 (element 2), Day 9, Day 11, Day 15, Day 20 (element 2). Generally create single dim array and leverage calculation for row/column offsets.
Below is a matrix of characters:
let stdin = io::stdin();
let map: Vec<Vec<char>> = stdin.lock().lines().map(|line| line.unwrap().chars().collect::<Vec<char>>()).collect();
List of pair of string sequences/expressions
Day 8, Day 10, Day 12, Day 14 (element 2), Day 18. These are pretty specific to the implementation, but vary from above
Single line sequence/expression
Day 14 (element 1), Day 16, Day 17, Day 20 (element 1). Same. These are pretty specific to the implementation, but vary from above
Multi-element
Day 4, Day 13, Day 14, Day 19, Day 20. Just combinations of the above