: befores( seq--hash)
H{} clone [[[ first2 ] dip push-at ] curry each ] keep ;: afters( seq--graph)
H{} clone [[[ first2 swap ] dip push-at ] curry each ] keep ;: roots( seqbefores--roots)[ concat members ][ keys ] bi* diff ;: cost-p1( str--n) drop 0;: cost-p2( str--n) first CHAR: A - 61 + ;: init-heap( seqbefores--heap)
roots [t] H{} map>assoc <min-heap> [ heap-push-all ] keep ;:: schedule( cost-quot:(str--cost) workers -- order time )
"/tmp/input" ascii file-lines
["" split {17} swap nths ] map :> seq
seq befores :> b
seq afters :> a
seq b init-heap :> h
<min-heap> :> working
0 :> curtime!
seq concat members fast-set :> remaining
<linked-hash> :> r
[ remaining null? ][[ working heap-size workers < h heap-size 0 > and ][
h heap-pop nip :> cur
cur cur cost-quot call curtime + working heap-push
] while
working heap-pop curtime! :> cur
t cur r set-at
cur remaining delete
cur a at [| after |
after b at [ r at ] all?
[t after h heap-push ] when
] each
] until
r keys concat
curtime ; inline
"p1:" print [ cost-p1 ]1 schedule . . nl
"p2:" print [ cost-p2 ]5 schedule . .