package Ġdev . pet us ka . a oc . engine Ċ Ċ import Ġdev . pet us ka . k lip . core . ext . File Ċ import Ġdev . pet us ka . k lip . core . ext . newline Ċ import Ġdev . pet us ka . k lip . core . ext . read Text Ċ import Ġdev . pet us ka . k lip . core . ext . separator ĊĊ Ċ internal Ġclass ĠDataLoader ( private Ġval Ġroot : ĠFile ) Ġ{ ĊĠ Ġdata Ġclass ĠData ( val Ġinput : ĠList < String >, Ġval Ġpart 1 Output : ĠInt ?, Ġval Ġpart 2 Output : ĠInt ?) ĊĠĠĊĠ Ġprivate Ġfun Ġfind ( day : ĠInt , Ġid : ĠInt , Ġext : ĠString ): ĠFile Ġ{ ĊĠĠĠ Ġval Ġinput FilePath Ġ= Ġroot . getPath () Ġ+ Ġ"/ inputs / day $ day /$ id .$ ext ". replace ("/", Ġroot . separator ) ĊĠĠĠ Ġreturn Ġinput FilePath . let (:: File ). take If ( File :: exists ) ĊĠĠĠĠĠ Ġ?: Ġerror (" File Ġ[ day =$ day , Ġid =$ id , Ġpath =$ input FilePath ] Ġnot Ġfound ") ĊĠ Ġ} ĊĠĠĊĠ Ġfun Ġload Input ( day : ĠInt , Ġid : ĠInt ): ĠList < String > Ġ{ ĊĠĠĠ Ġval Ġinput File Ġ= Ġfind ( day , Ġid , Ġ" in ") ĊĠĠĠ Ġreturn Ġinput File . read Text (). split ( inputFile . newline ). let Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it . last OrNull ()?. isBlank () Ġ== Ġtrue ) Ġit . drop Last ( 1 ) Ġelse Ġit ĊĠĠĠ Ġ}. take If Ġ{ Ġit . any ( String :: isNotBlank ) Ġ} ĊĠĠĠĠĠ Ġ?: Ġerror (" Input File Ġ[ day =$ day , Ġid =$ id , Ġpath =${ inputFile . getPath ()} ] Ġis Ġblank ") ĊĠ Ġ} ĊĠĠĊĠ Ġfun Ġload Output ( day : ĠInt , Ġid : ĠInt ): ĠPair < Int ?, ĠInt ?> Ġ{ ĊĠĠĠ Ġval ĠoutputFile Ġ= Ġfind ( day , Ġid , Ġ" out ") ĊĠĠĠ Ġreturn ĠoutputFile . read Text (). split ( outputFile . newline ). filter Not ( String :: isBlank ). let Ġ{ ĊĠĠĠĠĠ Ġit . get OrNull ( 0 )?. toInt () Ġto Ġit . get OrNull ( 1 )?. toInt () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠĠĊĠ Ġfun Ġload Data ( day : ĠInt , Ġid : ĠInt ): ĠData Ġ{ ĊĠĠĠ Ġval Ġ( pt One , Ġpt Two ) Ġ= Ġload Output ( day , Ġid ) ĊĠĠĠ Ġreturn ĠData ( load Input ( day , Ġid ), Ġpt One , Ġpt Two ) ĊĠ Ġ} Ċ } Ċ