package Ġeu . jan v db . a oc 2 0 2 1 . day 1 3 Ċ Ċ import Ġeu . jan v db . a oc util . kotlin . point 2 d . Point 2 D Ċ import Ġeu . jan v db . a oc util . kotlin . read Group ed Lines Ċ Ċ const Ġval ĠFIL ENAME Ġ= Ġ" input 1 3 . txt " Ċ Ċ // Ġ< Ġ 9 1 2 Ċ Ċ fun Ġmain () Ġ{ Ċ ĉ val Ġgrouped Lines Ġ= Ġread Group ed Lines ( 2 0 2 1 , ĠFIL ENAME ) Ċ ĉ val Ġsheet Ġ= ĠSheet . create ( grouped Lines [ 0 ]) Ċ ĉ val Ġinstructions Ġ= Ġgrouped Lines [ 1 ]. map ( Instruction :: create ) ĊĊ ĉ val Ġresult 1 Ġ= Ġinstructions [ 0 ]. apply ( sheet ) Ċ ĉ println ( result 1 . points . size ) ĊĊ ĉ var Ġresult 2 Ġ= Ġsheet Ċ ĉ instructions . forEach Ġ{ Ġresult 2 Ġ= Ġit . apply ( result 2 ) Ġ} Ċ ĉ result 2 . print () Ċ } Ċ Ċ data Ġclass ĠSheet ( val Ġpoints : ĠSet < Point 2 D >) Ġ{ Ċ ĉ fun Ġprint () Ġ{ Ċĉ ĉ val Ġmin X Ġ= Ġpoints . min Of Ġ{ Ġit . x Ġ} Ċĉ ĉ val Ġmax X Ġ= Ġpoints . max Of Ġ{ Ġit . x Ġ} Ċĉ ĉ val Ġmin Y Ġ= Ġpoints . min Of Ġ{ Ġit . y Ġ} Ċĉ ĉ val Ġmax Y Ġ= Ġpoints . max Of Ġ{ Ġit . y Ġ} Ċĉ ĉ for ( y Ġin Ġmin Y Ġ.. Ġmax Y ) Ġ{ Ċĉĉ ĉ for ( x Ġin Ġmin X .. max X ) Ġ{ Ċĉĉĉ ĉ if ( points . contains ( Point 2 D ( x , y ))) Ġ{ Ċĉĉĉĉ ĉ print (" ## ") Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ print Ġ(" Ġ Ġ") Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ println () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ fun Ġcreate ( coordinates : ĠList < String >): ĠSheet Ġ{ Ċĉĉ ĉ val Ġpoints Ġ= Ġcoordinates . as Sequence (). map ( Point 2 D . Companion :: create Comma Separ ated ). toSet () Ċĉĉ ĉ return ĠSheet ( points ) Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ data Ġclass ĠInstruction ( val Ġaxis : ĠAxis , Ġval Ġvalue : ĠInt ) Ġ{ Ċ ĉ fun Ġapply ( sheet : ĠSheet ): ĠSheet Ġ{ Ċĉ ĉ return Ġwhen Ġ( axis ) Ġ{ Ċĉĉ ĉ Axis . X Ġ-> Ġfold ( sheet ) Ġ{ Ġpoint Ġ-> Ċĉĉĉ ĉ if Ġ( point . x Ġ<= Ġvalue ) Ġpoint Ġelse ĠPoint 2 D ( 2 Ġ* Ġvalue Ġ- Ġpoint . x , Ġpoint . y ) Ċĉĉ ĉ } Ċĉĉ ĉ Axis . Y Ġ-> Ġfold ( sheet ) Ġ{ Ġpoint Ġ-> Ċĉĉĉ ĉ if Ġ( point . y Ġ<= Ġvalue ) Ġpoint Ġelse ĠPoint 2 D ( point . x , Ġ 2 Ġ* Ġvalue Ġ- Ġpoint . y ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġfold ( sheet : ĠSheet , Ġfold Function : Ġ( Point 2 D ) Ġ-> ĠPoint 2 D ): ĠSheet Ġ{ Ċĉ ĉ val Ġnew Points Ġ= Ġsheet . points . as Sequence (). map ( fold Function ). toSet () Ċĉ ĉ return ĠSheet ( new Points ) Ċ ĉ } ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ private Ġval ĠREG EX Ġ= ĠRegex (" fold Ġalong Ġ([ xy ]) =( \\ d + )") ĊĊĉ ĉ fun Ġcreate ( description : ĠString ): ĠInstruction Ġ{ Ċĉĉ ĉ val Ġmatch Ġ= ĠREG EX . match Ent ire ( description ) !! Ċĉĉ ĉ val Ġaxis Ġ= ĠAxis . valueOf ( match . group Values [ 1 ]. uppercase ()) Ċĉĉ ĉ val Ġvalue Ġ= Ġmatch . group Values [ 2 ]. toInt () Ċĉĉ ĉ return ĠInstruction ( axis , Ġvalue ) Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ enum Ġclass ĠAxis Ġ{ ĠX , ĠY Ġ}