Skip to content

Commit a851c22

Browse files
committed
23th day (part_one optimization)
1 parent 41ac51f commit a851c22

File tree

1 file changed

+16
-25
lines changed

1 file changed

+16
-25
lines changed

Diff for: src/bin/23.rs

+16-25
Original file line numberDiff line numberDiff line change
@@ -40,36 +40,27 @@ fn parse_data(input: &str) -> FastMap<usize, FastSet<usize>> {
4040
pub fn part_one(input: &str) -> Option<u32> {
4141
let nodes = parse_data(input);
4242

43-
let keys = nodes.keys().copied().collect::<Vec<_>>();
44-
4543
let mut result = 0;
4644

4745
let mut visited_t = FastSet::new();
4846

49-
// TODO: poglej samo sosede
50-
// TODO: spremeni hashmap-e v arraye (hitrejsi dostop)
5147
for computer_i in Computer::encode("ta")..=Computer::encode("tz") {
52-
if !nodes.contains_key(&computer_i) {
53-
continue;
54-
}
55-
56-
visited_t.insert(computer_i);
48+
if let Some(computer_i_connections) = nodes.get(&computer_i) {
49+
visited_t.insert(computer_i);
5750

58-
for (j, computer_j) in keys.iter().enumerate() {
59-
if visited_t.contains(computer_j) {
60-
continue;
61-
}
62-
63-
for computer_k in keys.iter().skip(j + 1) {
64-
if visited_t.contains(computer_k) {
51+
for (j, computer_j) in computer_i_connections.iter().enumerate() {
52+
if visited_t.contains(computer_j) {
6553
continue;
6654
}
6755

68-
if nodes[&computer_i].contains(computer_j)
69-
&& nodes[&computer_i].contains(computer_k)
70-
&& nodes[computer_j].contains(computer_k)
71-
{
72-
result += 1;
56+
for computer_k in computer_i_connections.iter().skip(j) {
57+
if visited_t.contains(computer_k) {
58+
continue;
59+
}
60+
61+
if nodes[computer_j].contains(computer_k) {
62+
result += 1;
63+
}
7364
}
7465
}
7566
}
@@ -95,9 +86,9 @@ fn bors_kerbosch(
9586
let pivot = p.union(&x).max_by_key(|v| g[v].len()).unwrap();
9687

9788
for v in p.difference(&g[pivot]).copied().collect::<Vec<_>>() {
98-
let next_r = r.iter().chain(once(&v)).copied().collect::<Vec<_>>();
99-
let next_p = p.intersection(&g[&v]).copied().collect::<FastSet<_>>();
100-
let next_x = x.intersection(&g[&v]).copied().collect::<FastSet<_>>();
89+
let next_r = r.iter().chain(once(&v)).copied().collect();
90+
let next_p = p.intersection(&g[&v]).copied().collect();
91+
let next_x = x.intersection(&g[&v]).copied().collect();
10192

10293
let result = bors_kerbosch(next_r, next_p, next_x, g);
10394
if result.len() > max_result.len() {
@@ -114,7 +105,7 @@ fn bors_kerbosch(
114105
pub fn part_two(input: &str) -> Option<String> {
115106
let nodes = parse_data(input);
116107

117-
let keys = nodes.keys().copied().collect::<FastSet<_>>();
108+
let keys = nodes.keys().copied().collect();
118109
let result = bors_kerbosch(vec![], keys, FastSet::new(), &nodes);
119110

120111
let mut result = result.into_iter().map(Computer::decode).collect::<Vec<_>>();

0 commit comments

Comments
 (0)