package Ġio . github . lun ar watcher . a oc . day 8 Ċ Ċ import Ġio . github . lun ar watcher . a oc . commons . readFile Ċ import Ġjava . util .* Ċ Ċ data Ġclass ĠNode ( val Ġchildren : ĠList < Node >, Ġval Ġmetadata : ĠList < Int > ){ ĊĠĠĠ Ġval Ġchild Count : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġchildren . size ĊĊĠĠĠ Ġval Ġhas Children : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġchildren . size Ġ> Ġ 0 ĊĠĠĠ Ġval Ġhas Metadata : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmetadata . size Ġ> Ġ 0 Ċ } Ċ Ċ fun Ġday 8 part 1 processor ( raw : ĠList < String >) Ġ: ĠInt { ĊĠĠĠ Ġval Ġstack Ġ= Ġload Stack ( raw ); ĊĊĠĠĠ Ġ/* ĊĠĠĠ ĠHeader Ġ( children Count , Ġmetadata Count ) Ġ=> Ġchildren Ġif Ġchildren Count Ġ> Ġ 0 Ġ=> Ġmetadata Ġif Ġmetadata Count Ġ> Ġ 0 ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġval Ġnodes Ġ= Ġparse Nodes ( stack ); ĊĠĠĠ Ġreturn Ġnodes . map Ġ{ Ġsum Node Part 1 ( it ) Ġ}. sum () Ċ } Ċ Ċ fun Ġday 8 part 2 processor ( raw : ĠList < String >) Ġ: ĠInt Ġ{ ĊĠĠĠ Ġval Ġstack Ġ= Ġload Stack ( raw ); ĊĠĠĠ Ġval Ġnodes Ġ= Ġparse Nodes ( stack ) ĊĠĠĠ Ġreturn Ġnodes . map Ġ{ Ġsum Node Part 2 ( it ) Ġ}. sum () Ċ } Ċ Ċ fun Ġload Stack ( raw : ĠList < String >) Ġ= ĠLinkedList < Int >(). also Ġ{ ĊĠĠĠ Ġraw . first (). split (" Ġ") ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ str Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add ( str . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġif ( it . size Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (); Ċ } Ċ fun Ġsum Node Part 1 ( node : ĠNode ) Ġ: ĠInt Ġ{ ĊĠĠĠ Ġvar Ġsum Ġ= Ġ 0 ; ĊĠĠĠ Ġsum Ġ+= Ġnode . metadata . sum () ĊĊĠĠĠ Ġif ( node . children . isNotEmpty ()){ ĊĠĠĠĠĠĠĠ Ġfor ( child Ġin Ġnode . children ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsum Ġ+= Ġsum Node Part 1 ( child ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġsum ; Ċ } Ċ Ċ fun Ġsum Node Part 2 ( node : ĠNode ) Ġ: ĠInt Ġ{ ĊĠĠĠ Ġvar Ġsum Ġ= Ġ 0 ; ĊĠĠĠ Ġif ( node . has Children Ġ&& Ġnode . has Metadata ){ ĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġnode . children ; ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġnode . metadata ; ĊĊĠĠĠĠĠĠĠ Ġfor ( index Ġin Ġmetadata ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( children . size Ġ<= Ġindex Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġchildren [ index Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( child . has Metadata Ġ&& Ġchild . has Children ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsum Ġ+= Ġsum Node Part 2 ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġsum Ġ+= Ġchild . metadata . sum (); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġsum ; Ċ } Ċ Ċ fun Ġparse Nodes ( stack : ĠLinkedList < Int >, Ġnested : ĠBoolean Ġ= Ġfalse ) Ġ: ĠList < Node > Ġ{ ĊĠĠĠ Ġval Ġbase Nodes Ġ= Ġmutable ListOf < Node >() ĊĠĠĠ Ġwhile ( stack . size Ġ> Ġ 0 ){ ĊĠĠĠĠĠĠĠ Ġval Ġchildren Count Ġ= Ġstack . poll First () ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Count Ġ= Ġstack . poll First () ĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġif ( children Count Ġ== Ġ 0 ) ĠlistOf < Node >() Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġmutable ListOf < Node >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġchildren Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl . addAll ( parse Nodes ( stack , Ġtrue )); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġif ( metadata Count Ġ== Ġ 0 ) ĠlistOf < Int >() Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġmutable ListOf < Int >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġmetadata Count ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl . add ( stack . poll First ()); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl ; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbase Nodes . add ( Node ( children , Ġmetadata )) ĊĠĠĠĠĠĠĠ Ġif ( nested ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbase Nodes ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbase Nodes ; Ċ } Ċ Ċ fun Ġday 8 ( part : ĠBoolean ){ ĊĠĠĠ Ġval Ġdata Ġ= ĠreadFile (" day 8 . txt "); ĊĠĠĠ Ġval Ġres Ġ= Ġif (! part ) Ġday 8 part 1 processor ( data ) Ġelse Ġday 8 part 2 processor ( data ) ĊĠĠĠ Ġprintln ( res ); Ċ }