File tree Expand file tree Collapse file tree 1 file changed +28
-0
lines changed Expand file tree Collapse file tree 1 file changed +28
-0
lines changed Original file line number Diff line number Diff line change
1
+ # frozen_string_literal: true
2
+
3
+ input = File . readlines ( ARGV [ 0 ] )
4
+
5
+ RULE = /^Step ([a-zA-Z]+) .* step ([a-zA-Z]+) can begin.$/ . freeze
6
+ input . map! { |line | line . match ( RULE ) . captures }
7
+
8
+ dependents = input . group_by ( &:first ) . transform_values { |it | it . map ( &:last ) }
9
+ dependencies = input . group_by ( &:last ) . transform_values { |it | it . map ( &:first ) }
10
+
11
+ dependents . default_proc = proc { |h , k | h [ k ] = [ ] }
12
+ dependencies . default_proc = proc { |h , k | h [ k ] = [ ] }
13
+
14
+ steps_done = [ ]
15
+ steps_current = dependents . keys . select { |k | dependencies [ k ] . empty? }
16
+
17
+ while steps_done . size < dependencies . size
18
+ steps_current . sort!
19
+
20
+ next_task = steps_current . find do |task |
21
+ ( dependencies [ task ] - steps_done ) . empty?
22
+ end
23
+
24
+ steps_done << steps_current . delete ( next_task )
25
+ steps_current += dependents [ next_task ]
26
+ end
27
+
28
+ puts steps_done . join
You can’t perform that action at this time.
0 commit comments