package Ġcom . github . w aking ru f us . a oc Ċ Ċ import Ġmu . K Logging Ċ import Ġjava . util .* Ċ Ċ class ĠDay 8 Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠK Logging () ĊĊĠĠĠ Ġfun Ġpart 1 ( input : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild NodeList ( parse Input ( input )). flatMap Ġ{ Ġit . metadata Ġ}. sum () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Input ( input : ĠString ): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinput . split (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . toInt () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild NodeList ( data : ĠList < Int >): ĠList < Node > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstack Ġ= ĠStack < Node >() ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġcompleted Nodes : ĠMutable List < Node > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġdata . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stack . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push ( Node ( data [ i ], Ġdata [ i Ġ+ Ġ 1 ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stack . peek (). has All Nodes ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stack . peek (). has All Metadata ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompleted Node Ġ= Ġstack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted Nodes . add ( completed Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stack . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . peek (). children . add ( completed Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . peek (). metadata . add ( data [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push ( Node ( data [ i ], Ġdata [ i Ġ+ Ġ 1 ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( stack . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompleted Node Ġ= Ġstack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted Nodes . add ( completed Node ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcompleted Nodes . toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpart 2 ( input : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild NodeList ( parse Input ( input )). last (). value () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ data Ġclass ĠNode ( val Ġtotal Children : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Metadata : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren : ĠMutable List < Node > Ġ= Ġmutable ListOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata : ĠMutable List < Int > Ġ= Ġmutable ListOf ()) Ġ{ ĊĠĠĠ Ġfun Ġhas All Nodes () Ġ= Ġchildren . size Ġ== Ġtotal Children ĊĠĠĠ Ġfun Ġhas All Metadata () Ġ= Ġmetadata . size Ġ== Ġtotal Metadata ĊĠĠĠ Ġfun Ġvalue () Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( total Children Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . get OrNull ( it - 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġit ?. value () Ġ?: Ġ 0 Ġ}. sum () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata . sum () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }