class ĠDay 1 3 Ġ: ĠDay < Day 1 3 . Paper Fold ing >(" 1 3 ") Ġ{ ĊĠĠĠ Ġdata Ġclass ĠFold Instruction ( val Ġaxis : ĠChar , Ġval Ġline : ĠInt ) ĊĊĠĠĠ Ġin fix Ġfun ĠChar . fold By ( amount : ĠInt ) Ġ= ĠFold Instruction ( this , Ġamount ) ĊĊĠĠĠ Ġdata Ġclass ĠPaper Fold ing ( val Ġdots : ĠTwo Dimension al Array < Boolean >, Ġval Ġfold s : ĠList < Fold Instruction >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Fold ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġfold s . first () ĊĊĠĠĠĠĠĠĠ Ġval Ġnext Fold Axis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġnext Fold . axis ĊĊĠĠĠĠĠĠĠ Ġfun Ġfold (): ĠPaper Fold ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmerge Rows Ġ= Ġ( 0 Ġuntil Ġdots . rows ). associate By Ġ{ Ġit Ġ}. to Mutable Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmerge Cols Ġ= Ġ( 0 Ġuntil Ġdots . cols ). associate By Ġ{ Ġit Ġ}. to Mutable Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Fold Axis Ġ== Ġ' y ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( fold s [ 0 ]. line Ġ+ Ġ 1 Ġuntil Ġdots . rows ). forEach Indexed Ġ{ Ġi , Ġr Ġ-> Ġmerge Rows [ fold s [ 0 ]. line Ġ- Ġ 1 Ġ- Ġi ] Ġ= Ġr Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( fold s [ 0 ]. line Ġ+ Ġ 1 Ġuntil Ġdots . cols ). forEach Indexed Ġ{ Ġi , Ġc Ġ-> Ġmerge Cols [ fold s [ 0 ]. line Ġ- Ġ 1 Ġ- Ġi ] Ġ= Ġc Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġif Ġ( next Fold Axis Ġ== Ġ' y ') Ġfold s [ 0 ]. line Ġelse Ġdots . rows ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcols Ġ= Ġif Ġ( next Fold Axis Ġ== Ġ' y ') Ġdots . cols Ġelse Ġfold s [ 0 ]. line ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPaper Fold ing ( Two Dimension al Array ( rows , Ġcols ) Ġ{ Ġrow , Ġcol Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdots [ row , Ġcol ] Ġor Ġdots [ merge Rows [ row ] !! , Ġmerge Cols [ col ] !! ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġfold s . drop ( 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġ 0 Ġuntil Ġdots . rows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( col Ġin Ġ 0 Ġuntil Ġdots . cols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( if Ġ( dots [ row , Ġcol ]) Ġ"#" Ġelse Ġ". ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdata Star 1 ( lines : ĠList < String >): ĠPaper Fold ing Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfold Pattern Ġ= Ġ""" fold Ġalong Ġ( .) =( \ d +) """. to Regex () ĊĠĠĠĠĠĠĠ Ġval Ġpositions Ġ= Ġlines . take While Ġ{ Ġ! fold Pattern . matches ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . ints ("," ). run Ġ{ Ġget ( 1 ) Ġto Ġget ( 0 ) Ġ} Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġval Ġfold Instructions Ġ= Ġlines . drop While Ġ{ Ġ! fold Pattern . matches ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfold Pattern . find ( it ) !!. group Values . run Ġ{ Ġget ( 1 )[ 0 ] Ġfold By Ġget ( 2 ). toInt () Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPaper Fold ing ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTwo Dimension al Array ( positions . max Of Ġ{ Ġit . first Ġ} Ġ+ Ġ 1 , Ġpositions . max Of Ġ{ Ġit . second Ġ} Ġ+ Ġ 1 ) Ġ{ Ġrow , Ġcol Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Ġto Ġcol Ġin Ġpositions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġfold Instructions ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdata Star 2 ( lines : ĠList < String >) Ġ= Ġdata Star 1 ( lines ) ĊĊĠĠĠ Ġoverride Ġfun Ġstar 1 ( data : ĠPaper Fold ing ): ĠNumber Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdata . fold (). apply Ġ{ Ġprintln ( this ) Ġ}. dots . count Ġ{ Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstar 2 ( data : ĠPaper Fold ing ): ĠPaper Fold ing Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcur Ġ= Ġdata ĊĠĠĠĠĠĠĠ Ġwhile Ġ( cur . fold s . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcur Ġ= Ġcur . fold () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcur ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ ĠDay 1 3 () () Ċ }