77 lines
1.4 KiB
Rust
77 lines
1.4 KiB
Rust
use std::io::{self, Read};
|
|
use std::collections::HashMap;
|
|
|
|
|
|
fn main() {
|
|
let mut input = String::new();
|
|
|
|
io::stdin().read_to_string(&mut input).unwrap();
|
|
|
|
let count = process(&input, 2);
|
|
|
|
println!("count={}", count);
|
|
}
|
|
|
|
fn process(input: &str, versions: usize) -> usize {
|
|
let mut houses: HashMap<(i32, i32), i32> = HashMap::new();
|
|
|
|
houses.insert((0, 0), versions as i32);
|
|
|
|
let mut index = (0..versions).cycle();
|
|
let mut pos = vec![(0, 0); versions];
|
|
|
|
for step in input.chars() {
|
|
let i = index.next().unwrap();
|
|
|
|
pos[i] = match step {
|
|
'>' => (pos[i].0 + 1, pos[i].1),
|
|
'<' => (pos[i].0 - 1, pos[i].1),
|
|
'^' => (pos[i].0, pos[i].1 + 1),
|
|
'v' => (pos[i].0, pos[i].1 - 1),
|
|
_ => pos[i],
|
|
};
|
|
|
|
let count = houses.entry(pos[i]).or_insert(0);
|
|
|
|
*count += 1;
|
|
}
|
|
|
|
houses.len()
|
|
}
|
|
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::process;
|
|
|
|
#[test]
|
|
fn example_01() {
|
|
assert_eq!(2, process(">", 1));
|
|
}
|
|
|
|
#[test]
|
|
fn example_02() {
|
|
assert_eq!(4, process("^>v<", 1));
|
|
}
|
|
|
|
#[test]
|
|
fn example_03() {
|
|
assert_eq!(2, process("^v^v^v^v^v", 1));
|
|
}
|
|
|
|
#[test]
|
|
fn example_04() {
|
|
assert_eq!(3, process("^v", 2));
|
|
}
|
|
|
|
#[test]
|
|
fn example_05() {
|
|
assert_eq!(3, process("^>v<", 2));
|
|
}
|
|
|
|
#[test]
|
|
fn example_06() {
|
|
assert_eq!(11, process("^v^v^v^v^v", 2));
|
|
}
|
|
}
|