package Ġpl . sh ock ah . a oc . y 2 0 1 8 Ċ Ċ import Ġorg . junit . jupiter . api . Assertions Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġpl . sh ock ah . a oc . Ad vent Task Ċ import Ġpl . sh ock ah . a oc . parse 2 Ċ import Ġjava . util .* Ċ import Ġjava . util . regex . Pattern Ċ Ċ class ĠDay 1 2 : ĠAd vent Task < Day 1 2 . Input , ĠLong , ĠLong >( 2 0 1 8 , Ġ 1 2 ) Ġ{ Ċ ĉ private Ġval Ġreplacement Input Pattern : ĠPattern Ġ= ĠPattern . compile (" ([ .# ]+) Ġ=> Ġ([ .# ]) ") ĊĊ ĉ data Ġclass ĠInput ( Ċĉ ĉ val Ġstate : ĠSet < Int >, Ċĉ ĉ val Ġcombinations : ĠList < Pair < Boolean Array , ĠBoolean >> Ċ ĉ ) ĊĊ ĉ override Ġfun Ġparse Input ( raw Input : ĠString ): ĠInput Ġ{ Ċĉ ĉ val Ġlines Ġ= ĠLinkedList ( raw Input . lines ()) ĊĊĉ ĉ val Ġraw InitialState Ġ= Ġlines . remove First (). replace (" initial Ġstate : Ġ", Ġ"") Ċĉ ĉ val ĠinitialState Ġ= Ġraw InitialState . map Indexed Ġ{ Ġindex : ĠInt , Ġc : ĠChar Ġ-> Ġindex Ġto Ġ( c Ġ== Ġ'# ') Ġ}. filter Ġ{ Ġit . second Ġ}. map Ġ{ Ġit . first Ġ}. toSet () Ċĉ ĉ lines . remove First () ĊĊĉ ĉ val Ġreplacement s Ġ= Ġlines . map Ġ{ Ċĉĉ ĉ val Ġ( raw Combination , Ġraw Combination Output ) Ġ= Ġreplacement Input Pattern . parse 2 < String , ĠChar >( it ) Ċĉĉ ĉ return @ map Ġboolean ArrayOf (* raw Combination . map Ġ{ Ġit Ġ== Ġ'#' Ġ}. to Boolean Array ()) Ġto Ġ( raw Combination Output Ġ== Ġ'# ') Ċĉ ĉ } ĊĊĉ ĉ return ĠInput ( initialState , Ġreplacement s ) Ċ ĉ } ĊĊ ĉ private Ġfun Ġtask ( input : ĠInput , Ġiterations : ĠLong ): ĠLong Ġ{ Ċĉ ĉ fun Ġadvance ( input : ĠSet < Int >, Ġcombinations : ĠList < Pair < Boolean Array , ĠBoolean >> ): ĠSet < Int > Ġ{ Ċĉĉ ĉ val Ġmin X Ġ= Ġinput . min OrNull () !! Ċĉĉ ĉ val Ġmax X Ġ= Ġinput . max OrNull () !! Ċĉĉ ĉ val Ġmax Combination Length Ġ= Ġcombinations . max Of Ġ{ Ġit . first . size Ġ} Ċĉĉ ĉ val Ġmax Offset Ġ= Ġ( max Combination Length Ġ- Ġ 1 ) Ġ/ Ġ 2 ĊĊĉĉ ĉ val Ġoutput Ġ= Ġmutable Set Of < Int >() Ċĉĉ ĉ positions @ Ġfor Ġ( x Ġin Ġ( min X Ġ- Ġmax Offset ) .. ( max X Ġ+ Ġmax Offset )) Ġ{ Ċĉĉĉ ĉ combin ations @ Ġfor Ġ(( combin ation , Ġcombination Output ) Ġin Ġcombinations ) Ġ{ Ċĉĉĉĉ ĉ val Ġcombination Length Ġ= Ġcombination . size Ċĉĉĉĉ ĉ val Ġcombination Offset Ġ= Ġ( combin ation Length Ġ- Ġ 1 ) Ġ/ Ġ 2 Ċĉĉĉĉ ĉ for Ġ( i Ġin Ġ 0 Ġuntil Ġcombination Length ) Ġ{ Ċĉĉĉĉĉ ĉ if Ġ(( x Ġ- Ġcombination Offset Ġ+ Ġi ) Ġin Ġinput Ġ!= Ġcombination [ i ]) Ċĉĉĉĉĉĉ ĉ continue @ combin ations Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ if Ġ( combin ation Output ) Ċĉĉĉĉĉ ĉ output Ġ+= Ġx Ċĉĉĉĉ ĉ continue @ positions Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĉĉ ĉ return Ġoutput Ċĉ ĉ } ĊĊĉ ĉ fun ĠgetString State ( input : ĠSet < Int >, Ġwith MinMax : ĠBoolean ): ĠString Ġ{ Ċĉĉ ĉ val Ġmin X Ġ= Ġinput . min OrNull () !! Ċĉĉ ĉ val Ġmax X Ġ= Ġinput . max OrNull () !! Ċĉĉ ĉ val Ġjoined Ġ= Ġ( min X .. max X ). map Ġ{ Ġif Ġ( it Ġin Ġinput ) Ġ'#' Ġelse Ġ'.' Ġ}. join ToString ("") Ċĉĉ ĉ return Ġif Ġ( with MinMax ) Ġ" [$ min X ] Ġ$ joined Ġ[$ max X ]" Ġelse Ġjoined Ċĉ ĉ } ĊĊĉ ĉ var Ġcurrent Ġ= Ġinput . state Ċĉ ĉ var Ġlast String State : ĠString ? Ġ= Ġnull Ċĉ ĉ println ("> Ġ# 0 : Ġ${ getString State ( current , Ġtrue )} ") ĊĊĉ ĉ var Ġcurrent Mod Ġ= Ġ 1 L Ċĉ ĉ for Ġ( i Ġin Ġ 1 .. iterations ) Ġ{ Ċĉĉ ĉ val ĠnewState Ġ= Ġadvance ( current , Ġinput . combin ations ) Ċĉĉ ĉ val Ġnew String State Ġ= ĠgetString State ( newState , Ġfalse ) Ċĉĉ ĉ val Ġare Equal Ġ= Ġlast String State Ġ!= Ġnull Ġ&& Ġlast String State Ġ== Ġnew String State Ċĉĉ ĉ val Ġsum Difference Ġ= ĠnewState . sum () Ġ- Ġcurrent . sum () ĊĊĉĉ ĉ if Ġ( i Ġ% Ġcurrent Mod Ġ== Ġ 0 L Ġ|| Ġare Equal ) Ġ{ Ċĉĉĉ ĉ println ("> Ġ#$ i : Ġ${ getString State ( newState , Ġtrue )} ") Ċĉĉĉ ĉ if Ġ( i Ġ>= Ġcurrent Mod Ġ* Ġ 1 0 0 ) Ċĉĉĉĉ ĉ current Mod Ġ*= Ġ 1 0 L Ċĉĉ ĉ } Ċĉĉ ĉ current Ġ= ĠnewState Ċĉĉ ĉ last String State Ġ= Ġnew String State ĊĊĉĉ ĉ if Ġ( are Equal ) Ġ{ Ċĉĉĉ ĉ println ("> ĠFinish ing Ġearly ") Ċĉĉĉ ĉ println ("> ĠCurrent Ġsum : Ġ${ current . sum () }") Ċĉĉĉ ĉ println ("> ĠIter ations Ġleft : Ġ${ iterations Ġ- Ġi }, Ġ${ if Ġ( sum Difference Ġ> Ġ 0 ) Ġ" +" Ġelse Ġ"" }$ sum Difference Ġeach ") Ċĉĉĉ ĉ return Ġcurrent . sum () Ġ+ Ġ( iterations Ġ- Ġi ) Ġ* Ġsum Difference Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġcurrent . sum (). to Long () Ċ ĉ } ĊĊ ĉ override Ġfun Ġpart 1 ( input : ĠInput ): ĠLong Ġ{ Ċĉ ĉ return Ġtask ( input , Ġ 2 0 L ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġpart 2 ( input : ĠInput ): ĠLong Ġ{ Ċĉ ĉ return Ġtask ( input , Ġ 5 0 _ 0 0 0 _ 0 0 0 _ 0 0 0 L ) Ċ ĉ } ĊĊ ĉ class ĠTests Ġ{ Ċĉ ĉ private Ġval Ġtask Ġ= ĠDay 1 2 () ĊĊĉ ĉ private Ġval Ġraw Input Ġ= Ġ""" Ċĉĉ ĉ initial Ġstate : Ġ# .. # .# .. ## ...... ### ... ### ĊĊĉĉ ĉ ... ## Ġ=> Ġ# Ċĉĉ ĉ .. # .. Ġ=> Ġ# Ċĉĉ ĉ .# ... Ġ=> Ġ# Ċĉĉ ĉ .# .# . Ġ=> Ġ# Ċĉĉ ĉ .# . ## Ġ=> Ġ# Ċĉĉ ĉ . ## .. Ġ=> Ġ# Ċĉĉ ĉ . #### Ġ=> Ġ# Ċĉĉ ĉ # .# .# Ġ=> Ġ# Ċĉĉ ĉ #. ### Ġ=> Ġ# Ċĉĉ ĉ ## .# . Ġ=> Ġ# Ċĉĉ ĉ ## . ## Ġ=> Ġ# Ċĉĉ ĉ ### .. Ġ=> Ġ# Ċĉĉ ĉ ### .# Ġ=> Ġ# Ċĉĉ ĉ #### . Ġ=> Ġ# Ċĉ ĉ """. trim Indent () ĊĊĉ ĉ @ Test Ċĉ ĉ fun Ġpart 1 () Ġ{ Ċĉĉ ĉ val Ġinput Ġ= Ġtask . parse Input ( raw Input ) Ċĉĉ ĉ Assertions . assertEquals ( 3 2 5 , Ġtask . part 1 ( input )) Ċĉ ĉ } Ċ ĉ } Ċ }