tangled
alpha
login
or
join now
bwc9876.dev
/
advent
0
fork
atom
Advent of Code solutions
0
fork
atom
overview
issues
pulls
pipelines
Day 23
bwc9876.dev
1 year ago
daac2043
8af887ad
verified
This commit was signed with the committer's
known signature
.
bwc9876.dev
SSH Key Fingerprint:
SHA256:DanMEP/RNlSC7pAVbnXO6wzQV00rqyKj053tz4uH5gQ=
+117
-6
2 changed files
expand all
collapse all
unified
split
years
2024
src
day_23.rs
lib.rs
+116
-6
years/2024/src/day_23.rs
···
1
1
+
use std::collections::{HashMap, HashSet};
1
2
2
2
-
use advent_core::{Day, day_stuff, ex_for_day};
3
3
+
use advent_core::{day_stuff, ex_for_day, Day};
4
4
+
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
3
5
4
6
pub struct Day23;
5
7
8
8
+
type Edges = HashMap<String, HashSet<String>>;
9
9
+
10
10
+
fn find_self_in_3<'a>(node: &'a String, edges: &'a Edges) -> Vec<[&'a String; 3]> {
11
11
+
edges
12
12
+
.get(node)
13
13
+
.unwrap()
14
14
+
.iter()
15
15
+
.flat_map(|adj| {
16
16
+
edges.get(adj).unwrap().iter().filter_map(|sadj| {
17
17
+
if edges.get(sadj).unwrap().contains(node) {
18
18
+
let mut v = [node, adj, sadj];
19
19
+
v.sort();
20
20
+
Some(v)
21
21
+
} else {
22
22
+
None
23
23
+
}
24
24
+
})
25
25
+
})
26
26
+
.collect()
27
27
+
}
28
28
+
29
29
+
fn represent<'a>(
30
30
+
node: &'a String,
31
31
+
friends: HashSet<&'a String>,
32
32
+
edges: &'a Edges,
33
33
+
size: usize,
34
34
+
seen: &mut HashSet<&'a String>,
35
35
+
) -> Option<HashSet<&'a String>> {
36
36
+
if friends.len() == size {
37
37
+
return Some(friends);
38
38
+
} else if friends.iter().all(|f| seen.contains(f)) {
39
39
+
return None;
40
40
+
}
41
41
+
42
42
+
seen.insert(node);
43
43
+
44
44
+
edges.get(node).unwrap().iter().find_map(|dep| {
45
45
+
if edges
46
46
+
.get(dep)
47
47
+
.is_some_and(|e| friends.iter().all(|f| e.contains(*f)))
48
48
+
{
49
49
+
let mut new_friends = friends.clone();
50
50
+
new_friends.insert(dep);
51
51
+
represent(dep, new_friends, edges, size, seen)
52
52
+
} else {
53
53
+
None
54
54
+
}
55
55
+
})
56
56
+
}
57
57
+
6
58
impl Day for Day23 {
59
59
+
day_stuff!(23, "", "", Edges);
7
60
8
8
-
day_stuff!(23, "", "");
61
61
+
fn part_1(input: Self::Input) -> Option<String> {
62
62
+
let groups = input
63
63
+
.keys()
64
64
+
.flat_map(|k| find_self_in_3(k, &input))
65
65
+
.collect::<HashSet<_>>();
9
66
10
10
-
fn part_1(_input: Self::Input) -> Option<String> {
11
11
-
None
67
67
+
let ans = groups
68
68
+
.into_iter()
69
69
+
.filter(|g| g.iter().any(|c| c.starts_with('t')))
70
70
+
.count();
71
71
+
72
72
+
Some(ans.to_string())
73
73
+
}
74
74
+
75
75
+
fn part_2(input: Self::Input) -> Option<String> {
76
76
+
let verts = input.keys().cloned().collect::<Vec<_>>();
77
77
+
let max_group_size = verts
78
78
+
.iter()
79
79
+
.map(|v| input.get(v).unwrap().len())
80
80
+
.max()
81
81
+
.unwrap()
82
82
+
+ 1;
83
83
+
84
84
+
let mut group = (0..max_group_size)
85
85
+
.rev()
86
86
+
.find_map(|s| {
87
87
+
verts.par_iter().find_map_any(|node| {
88
88
+
represent(
89
89
+
node,
90
90
+
HashSet::from_iter([node]),
91
91
+
&input,
92
92
+
s,
93
93
+
&mut HashSet::with_capacity(s),
94
94
+
)
95
95
+
})
96
96
+
})
97
97
+
.unwrap()
98
98
+
.into_iter()
99
99
+
.collect::<Vec<_>>();
100
100
+
101
101
+
group.sort();
102
102
+
let len = group.len();
103
103
+
let s = ",".to_string();
104
104
+
Some(group.into_iter().intersperse(&s).fold(
105
105
+
String::with_capacity(len * 2 + (len - 1)),
106
106
+
|mut acc, computer| {
107
107
+
acc.push_str(computer.as_str());
108
108
+
acc
109
109
+
},
110
110
+
))
12
111
}
13
112
14
14
-
fn part_2(_input: Self::Input) -> Option<String> {
15
15
-
None
113
113
+
fn parse_input(input: &str) -> Self::Input {
114
114
+
input
115
115
+
.lines()
116
116
+
.fold(HashMap::with_capacity(50), |mut acc, l| {
117
117
+
let (l, r) = l.split_once('-').unwrap();
118
118
+
acc.entry(l.to_string())
119
119
+
.or_insert(HashSet::new())
120
120
+
.insert(r.to_string());
121
121
+
acc.entry(r.to_string())
122
122
+
.or_insert(HashSet::new())
123
123
+
.insert(l.to_string());
124
124
+
acc
125
125
+
})
16
126
}
17
127
}
+1
years/2024/src/lib.rs
···
1
1
#![feature(let_chains)]
2
2
+
#![feature(iter_intersperse)]
2
3
3
4
use macros::year;
4
5