1
- import { demo } from '@/17 /input'
1
+ import { input } from '@/16 /input'
2
2
3
3
const valves = new Map < string , Valve > ( )
4
4
5
5
class Valve {
6
6
public id : string
7
7
public flowRate : number
8
- public minutesOpen : number
8
+ public minutesOpen : number | null
9
9
private readonly connectionIds : string [ ]
10
10
11
11
public constructor ( input : string ) {
@@ -41,7 +41,7 @@ class Valve {
41
41
}
42
42
43
43
public get totalFlowRate ( ) : number {
44
- return this . minutesOpen * this . flowRate
44
+ return ( this . minutesOpen ?? 0 ) * this . flowRate
45
45
}
46
46
}
47
47
@@ -91,40 +91,89 @@ function buildDistancesMap(): Map<string, Map<string, number>> {
91
91
return distancesMap
92
92
}
93
93
94
- function getAllPermutations ( ids : string [ ] , minutesRemaining : number ) : string [ ] [ ] {
94
+ function getValveSequences ( ids : string [ ] , minutesRemaining : number ) : string [ ] [ ] {
95
95
if ( ! ids . length || minutesRemaining <= 0 ) {
96
96
return [ [ ] ]
97
97
}
98
98
99
- function openValve ( valve : Valve ) : void {
100
- minutesRemaining --
101
- valve . minutesOpen = minutesRemaining
102
- }
103
-
104
99
return ids . flatMap ( id => {
105
- const distances = distancesMap . get ( id )
106
- const remaining = ids . filter ( x => x !== id )
107
- const [ nextId ] = remaining
108
- const nextValve = valves . get ( nextId )
109
-
110
- if ( nextValve && nextValve . flowRate > 0 ) {
111
- openValve ( nextValve )
100
+ const distancesFromValve = distancesMap . get ( id )
101
+ const remainingValves = ids . filter ( x => x !== id )
102
+ const valve = valves . get ( id )
103
+ const [ nextId ] = remainingValves
104
+
105
+ if ( valve && valve . flowRate > 0 ) {
106
+ const timeToOpenValve = 1
107
+ minutesRemaining -= timeToOpenValve
112
108
}
113
109
114
- const distanceToNextValve = distances ?. get ( nextId ) ?? 0
110
+ const distanceToNextValve = distancesFromValve ?. get ( nextId ) ?? 0
115
111
116
- return getAllPermutations ( remaining , minutesRemaining - distanceToNextValve )
112
+ return getValveSequences ( remainingValves , minutesRemaining - distanceToNextValve )
117
113
. map ( x => [ id , ...x ] )
118
114
} )
119
115
}
120
116
121
- function solve ( ) : void {
122
- const valveIds = Array . from ( valves . values ( ) ) . map ( valve => valve . id )
123
- const allPermutations = getAllPermutations ( valveIds , 30 )
117
+ function resetValves ( ) : void {
118
+ for ( const [ , valve ] of valves ) {
119
+ valve . minutesOpen = null
120
+ }
121
+ }
124
122
125
- console . log ( allPermutations . length )
123
+ function calculateFlow ( sequence : string [ ] ) : number {
124
+ resetValves ( )
125
+ setValvesOpen ( sequence )
126
+
127
+ return sequence . reduce ( ( sum , id ) => sum += valves . get ( id ) ! . totalFlowRate , 0 )
126
128
}
127
129
128
- demo . split ( '\n' ) . map ( input => new Valve ( input ) )
130
+ function setValvesOpen ( sequence : string [ ] ) : void {
131
+ let current = valves . get ( 'AA' ) !
132
+ let minutesRemaining = 30
133
+
134
+ for ( const id of sequence ) {
135
+ const distancesFromValve = distancesMap . get ( current . id ) !
136
+ const distanceToNextValve = distancesFromValve . get ( id ) !
137
+ if ( minutesRemaining - 1 <= distanceToNextValve ) {
138
+ return
139
+ }
140
+ minutesRemaining -= distanceToNextValve
141
+
142
+ const valve = valves . get ( id ) !
143
+
144
+ if ( valve . flowRate > 0 ) {
145
+ minutesRemaining --
146
+ valve . minutesOpen = minutesRemaining
147
+ }
148
+
149
+ if ( minutesRemaining <= 0 ) {
150
+ return
151
+ }
152
+
153
+ current = valve
154
+ }
155
+ }
156
+
157
+ function solve ( ) : void {
158
+ const valveIds = Array . from ( valves . values ( ) )
159
+ . filter ( valve => valve . flowRate > 0 )
160
+ . map ( valve => valve . id )
161
+
162
+ const sequences = getValveSequences ( valveIds , 30 )
163
+ let maxFlowRate = 0
164
+ for ( const sequence of sequences ) {
165
+ const result = calculateFlow ( sequence )
166
+
167
+ if ( result > maxFlowRate ) {
168
+ maxFlowRate = result
169
+ console . log ( maxFlowRate , sequence )
170
+ }
171
+ }
172
+ }
173
+
174
+ input . split ( '\n' ) . map ( input => new Valve ( input ) )
129
175
const distancesMap = buildDistancesMap ( )
130
- solve ( )
176
+ solve ( )
177
+
178
+ // 1251 too low
179
+ // 1601 too low
0 commit comments