-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathlib.rs
105 lines (90 loc) · 2.5 KB
/
lib.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
extern crate core;
use std::collections::{HashMap, HashSet};
pub fn fn1(s: &str) -> i32 {
let mut visited: HashMap<i32, HashSet<i32>> = HashMap::new();
visited.entry(0).or_insert(HashSet::new()).insert(0);
let mut x = 0;
let mut y = 0;
let mut sum = 1;
for c in s.chars() {
match c {
'<' => x -= 1,
'>' => x += 1,
'^' => y += 1,
'v' => y -= 1,
_ => panic!("unknown"),
}
let set = visited.entry(x).or_insert(HashSet::new());
if !set.contains(&y) {
sum += 1;
set.insert(y);
}
}
sum
}
pub fn fn2(s: &str) -> i32 {
let mut visited: HashMap<i32, HashSet<i32>> = HashMap::new();
visited.entry(0).or_insert(HashSet::new()).insert(0);
let mut santa_x = 0;
let mut santa_y = 0;
let mut robosanta_x = 0;
let mut robosanta_y = 0;
let mut sum = 1;
for (i, c) in s.chars().enumerate() {
if i % 2 == 0 {
match c {
'<' => santa_x -= 1,
'>' => santa_x += 1,
'^' => santa_y += 1,
'v' => santa_y -= 1,
_ => panic!("unknown"),
}
let set = visited.entry(santa_x).or_insert(HashSet::new());
if !set.contains(&santa_y) {
sum += 1;
set.insert(santa_y);
}
} else {
match c {
'<' => robosanta_x -= 1,
'>' => robosanta_x += 1,
'^' => robosanta_y += 1,
'v' => robosanta_y -= 1,
_ => panic!("unknown"),
}
let set = visited.entry(robosanta_x).or_insert(HashSet::new());
if !set.contains(&robosanta_y) {
sum += 1;
set.insert(robosanta_y);
}
}
}
sum
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs;
#[test]
fn test_fn1_unit() {
assert_eq!(fn1(">"), 2);
assert_eq!(fn1("^>v<"), 4);
assert_eq!(fn1("^v^v^v^v^v"), 2);
}
#[test]
fn test_fn1_input() {
let s = fs::read_to_string("input.txt").unwrap();
assert_eq!(fn1(s.as_str()), 1);
}
#[test]
fn test_fn2_unit() {
assert_eq!(fn2("^v"), 3);
assert_eq!(fn2("^>v<"), 3);
assert_eq!(fn2("^v^v^v^v^v"), 11);
}
#[test]
fn test_fn2_input() {
let s = fs::read_to_string("input.txt").unwrap();
assert_eq!(fn2(s.as_str()), 2631);
}
}