package Ġcom . dam bra . ad vent of code 2 0 1 8 . day 1 0 Ċ Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . jupiter . api . Test Ċ Ċ internal Ġclass ĠSky Writing Ġ{ ĊĠĠĠ Ġprivate Ġval Ġpuzzle Input : ĠList < String > Ġ= Ġjava Class . getResource ("/ day 1 0 Part 1 Input . txt ") ĊĠĠĠĠĠĠĠ Ġ. read Text () ĊĠĠĠĠĠĠĠ Ġ. split ("\ n ") ĊĊĠĠĠ Ġprivate Ġval Ġexample Input Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 9 , ĠĠ 1 > Ġvelocity =< Ġ 0 , ĠĠ 2 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 7 , ĠĠ 0 > Ġvelocity =< - 1 , ĠĠ 0 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 3 , Ġ- 2 > Ġvelocity =< - 1 , ĠĠ 1 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 6 , Ġ 1 0 > Ġvelocity =< - 2 , Ġ- 1 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 2 , Ġ- 4 > Ġvelocity =< Ġ 2 , ĠĠ 2 >", ĊĠĠĠĠĠĠĠ Ġ" position =< - 6 , Ġ 1 0 > Ġvelocity =< Ġ 2 , Ġ- 2 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 1 , ĠĠ 8 > Ġvelocity =< Ġ 1 , Ġ- 1 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 1 , ĠĠ 7 > Ġvelocity =< Ġ 1 , ĠĠ 0 >", ĊĠĠĠĠĠĠĠ Ġ" position =< - 3 , Ġ 1 1 > Ġvelocity =< Ġ 1 , Ġ- 2 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 7 , ĠĠ 6 > Ġvelocity =< - 1 , Ġ- 1 >", ĊĠĠĠĠĠĠĠ Ġ" position =< - 2 , ĠĠ 3 > Ġvelocity =< Ġ 1 , ĠĠ 0 >", ĊĠĠĠĠĠĠĠ Ġ" position =< - 4 , ĠĠ 3 > Ġvelocity =< Ġ 2 , ĠĠ 0 >", ĊĠĠĠĠĠĠĠ Ġ" position =< 1 0 , Ġ- 3 > Ġvelocity =< - 1 , ĠĠ 1 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 5 , Ġ 1 1 > Ġvelocity =< Ġ 1 , Ġ- 2 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 4 , ĠĠ 7 > Ġvelocity =< Ġ 0 , Ġ- 1 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 8 , Ġ- 2 > Ġvelocity =< Ġ 0 , ĠĠ 1 >", ĊĠĠĠĠĠĠĠ Ġ" position =< 1 5 , ĠĠ 0 > Ġvelocity =< - 2 , ĠĠ 0 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 1 , ĠĠ 6 > Ġvelocity =< Ġ 1 , ĠĠ 0 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 8 , ĠĠ 9 > Ġvelocity =< Ġ 0 , Ġ- 1 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 3 , ĠĠ 3 > Ġvelocity =< - 1 , ĠĠ 1 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 0 , ĠĠ 5 > Ġvelocity =< Ġ 0 , Ġ- 1 >", ĊĠĠĠĠĠĠĠ Ġ" position =< - 2 , ĠĠ 2 > Ġvelocity =< Ġ 2 , ĠĠ 0 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 5 , Ġ- 2 > Ġvelocity =< Ġ 1 , ĠĠ 2 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 1 , ĠĠ 4 > Ġvelocity =< Ġ 2 , ĠĠ 1 >", ĊĠĠĠĠĠĠĠ Ġ" position =< - 2 , ĠĠ 7 > Ġvelocity =< Ġ 2 , Ġ- 2 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 3 , ĠĠ 6 > Ġvelocity =< - 1 , Ġ- 1 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 5 , ĠĠ 0 > Ġvelocity =< Ġ 1 , ĠĠ 0 >", ĊĠĠĠĠĠĠĠ Ġ" position =< - 6 , ĠĠ 0 > Ġvelocity =< Ġ 2 , ĠĠ 0 >", ĊĠĠĠĠĠĠĠ Ġ" position =< Ġ 5 , ĠĠ 9 > Ġvelocity =< Ġ 1 , Ġ- 2 >", ĊĠĠĠĠĠĠĠ Ġ" position =< 1 4 , ĠĠ 7 > Ġvelocity =< - 2 , ĠĠ 0 >", ĊĠĠĠĠĠĠĠ Ġ" position =< - 3 , ĠĠ 6 > Ġvelocity =< Ġ 2 , Ġ- 1 >" ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` example Ġmotion Ġcan Ġbe Ġdescribed `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// At Ġ` 0 Ġseconds `, Ġeach Ġpoint Ġhas Ġthe Ġposition Ġgiven . ĊĠĠĠĠĠĠĠ Ġ// Each Ġsecond , Ġeach Ġpoint 's Ġvelocity Ġis Ġadded Ġto Ġits Ġposition . ĊĠĠĠĠĠĠĠ Ġ// So , Ġa Ġpoint Ġwith Ġvelocity Ġ`< 1 , Ġ- 2 >` Ġis Ġmoving Ġto Ġthe Ġright , Ġbut Ġis Ġmoving Ġup ward Ġtwice Ġas Ġquickly . ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthis Ġpoint 's Ġinitial Ġposition Ġwere Ġ`< 3 , Ġ 9 >`, Ġregisters After Ġ 3 Ġseconds , ĊĠĠĠĠĠĠĠ Ġ// Ġits Ġposition Ġwould Ġbecome Ġ`< 6 , Ġ 3 >`. ĊĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠPosition ( 3 , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġval Ġvelocity Ġ= ĠVe locity ( 1 , Ġ- 2 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġparticle Ġ= ĠStar ( position , Ġvelocity ) ĊĊĠĠĠĠĠĠĠ Ġparticle . move () ĊĠĠĠĠĠĠĠ Ġparticle . move () ĊĠĠĠĠĠĠĠ Ġparticle . move () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( particle . position ). isEqualTo ( Position ( 6 , Ġ 3 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` stars Ġcan Ġbe Ġparsed Ġfrom Ġinput `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ" position =< Ġ 9 , ĠĠ 1 > Ġvelocity =< Ġ 0 , ĠĠ 2 >" ĊĠĠĠĠĠĠĠ Ġval Ġstar Ġ= ĠStar . parse ( input ) ĊĠĠĠĠĠĠĠ ĠassertThat ( star . position ). isEqualTo ( Position ( 9 , 1 )) ĊĠĠĠĠĠĠĠ ĠassertThat ( star . velocity ). isEqualTo ( Velocity ( 0 , 2 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` stars Ġwith Ġlarge Ġcoordinates Ġcan Ġbe Ġparsed Ġfrom Ġinput `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġ" position =< Ġ 9 1 2 3 , ĠĠ 1 0 0 3 4 5 > Ġvelocity =< Ġ 0 , ĠĠ 2 >" ĊĠĠĠĠĠĠĠ Ġval Ġstar Ġ= ĠStar . parse ( input ) ĊĠĠĠĠĠĠĠ ĠassertThat ( star . position ). isEqualTo ( Position ( 9 1 2 3 , 1 0 0 3 4 5 )) ĊĠĠĠĠĠĠĠ ĠassertThat ( star . velocity ). isEqualTo ( Velocity ( 0 , 2 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` single Ġstar Ġcan Ġbe Ġdrawn `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstar Map Ġ= ĠStar Map ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" position =< Ġ 0 , ĠĠ 0 > Ġvelocity =< Ġ 0 , ĠĠ 2 >" ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( star Map . toString ()). isEqualTo (""" Ċ # Ċ """. trim Indent ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` simple Ġstar Ġmap Ġcan Ġbe Ġdrawn `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstar Map Ġ= ĠStar Map ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" position =< - 1 , ĠĠ 0 > Ġvelocity =< Ġ 0 , ĠĠ 2 >", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" position =< Ġ 1 , ĠĠ 0 > Ġvelocity =< Ġ 0 , ĠĠ 2 >" ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( star Map . toString ()). isEqualTo (""" Ċ # .# Ċ """. trim Indent ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` the Ġstars Ġcan Ġbe Ġdrawn Ġat Ġ 0 Ġseconds `() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġstar Map Ġ= ĠStar Map ( exampleInput ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( star Map . toString ()). isEqualTo (""" ........ # ........ ..... Ċ ................ # ..... Ċ .... ..... # .# .. # ....... Ċ ................ ...... Ċ # ........ .. # .# ....... # Ċ ........ ....... # ...... Ċ .... # ........ .... ..... Ċ .. # .# .... # ........ .... Ċ ....... # ........ ...... Ċ ...... # ........ ....... Ċ ... # ... # .# ... # ........ Ċ .... # .. # .. # .... ..... #. Ċ ....... # ........ ...... Ċ ........ ... # .. # ....... Ċ # ........ ... # .... ..... Ċ ... # ....... # ........ .. """. trim Indent ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` the Ġstars Ġcan Ġbe Ġdrawn Ġat Ġ 1 Ġseconds `() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġstar Map Ġ= ĠStar Map ( exampleInput ) ĊĠĠĠĠĠĠĠ Ġstar Map . move () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( star Map . toString ()). isEqualTo (""" ........ # .... # .... Ċ ...... # ..... # ..... Ċ # .... ..... # ...... # Ċ ................ .. Ċ .... # ........ ..... Ċ .. ## .... ..... # .... Ċ .... # .# ........ ... Ċ ... ## . ## .. # ....... Ċ ...... # .# .... ..... Ċ ...... # ... # ..... #. Ċ # ........ ... # ..... Ċ .. # ..... # .# ....... """. trim Indent ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` the Ġexample Ġsky Ġwriting Ġcan Ġbe Ġgues sed Ġat Ġ 3 Ġseconds `() Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstar Map Ġ= ĠStar Map ( exampleInput ) ĊĠĠĠĠĠĠĠ Ġval Ġminimum Area At Ġ= Ġstar Map . seek Sky Writing () ĊĠĠĠĠĠĠĠ ĠassertThat ( minimum Area At ). isEqualTo ( 3 ) ĊĊĠĠĠĠĠĠĠ Ġ// reset Ġit ĊĠĠĠĠĠĠĠ Ġstar Map Ġ= ĠStar Map ( exampleInput ) ĊĠĠĠĠĠĠĠ Ġstar Map . move ( minimum Area At ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( star Map . toString ()). isEqualTo (""" Ċ # ... # .. ### Ċ # ... # ... #. Ċ # ... # ... #. Ċ ##### ... #. Ċ # ... # ... #. Ċ # ... # ... #. Ċ # ... # ... #. Ċ # ... # .. ### ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` the Ġpuzzle Ġinput Ġsky Ġwriting Ġcan Ġbe Ġsearched Ġfor Ġwriting `() Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstar Map Ġ= ĠStar Map ( pu zzle Input ) ĊĠĠĠĠĠĠĠ Ġval Ġminimum Area At Ġ= Ġstar Map . seek Sky Writing () ĊĠĠĠĠĠĠĠ ĠassertThat ( minimum Area At ). isEqualTo ( 1 0 8 3 1 ) ĊĊĠĠĠĠĠĠĠ Ġ// reset Ġit ĊĠĠĠĠĠĠĠ Ġstar Map Ġ= ĠStar Map ( pu zzle Input ) ĊĠĠĠĠĠĠĠ Ġstar Map . move ( minimum Area At ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( star Map . toString ()). isEqualTo (""" Ċ ##### ... # .... # .. ##### ...... ### ... #### ... # ....... ##### ... ###### Ċ # .... # .. # .... # .. # .... # ...... # ... # .... # .. # ....... # .... # .. # ..... Ċ # .... # .. # .... # .. # .... # ...... # ... # ....... # ....... # .... # .. # ..... Ċ # .... # .. # .... # .. # .... # ...... # ... # ....... # ....... # .... # .. # ..... Ċ ##### ... ###### .. ##### ....... # ... # ....... # ....... ##### ... ##### . Ċ # .... # .. # .... # .. # ........ ... # ... # .. ### .. # ....... # ....... # ..... Ċ # .... # .. # .... # .. # ........ ... # ... # .... # .. # ....... # ....... # ..... Ċ # .... # .. # .... # .. # ....... # ... # ... # .... # .. # ....... # ....... # ..... Ċ # .... # .. # .... # .. # ....... # ... # ... # ... ## .. # ....... # ....... # ..... Ċ ##### ... # .... # .. # ........ ### ..... ### .# .. ###### .. # ....... ###### Ċ """. trim Indent ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠBounding Box ( val Ġmin X : ĠLong , Ġval Ġmax X : ĠLong , Ġval Ġmin Y : ĠLong , Ġval Ġmax Y : ĠLong ) Ġ{ ĊĠĠĠ Ġfun Ġsize () Ġ= Ġmax X Ġ- Ġmin X Ġ+ Ġmax Y Ġ- Ġmin Y Ċ } Ċ Ċ class ĠStar Map ( starting Positions : ĠList < String >) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġstars : ĠMutable List < Star > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġvar Ġby Y : ĠMap < Long , ĠMap < Long , ĠList < Star >>> ĊĠĠĠ Ġprivate Ġvar Ġstarting Bounds : ĠBounding Box ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparsed Ġ= Ġstarting Positions . map ( Star . Companion :: parse ) ĊĠĠĠĠĠĠĠ Ġstars . addAll ( parsed ) ĊĊĠĠĠĠĠĠĠ Ġstarting Bounds Ġ= Ġget BoundingBox ( stars ) ĊĊĠĠĠĠĠĠĠ Ġby Y Ġ= Ġstars By Coordinate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstars By Coordinate (): ĠMap < Long , ĠMap < Long , ĠList < Star >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstars ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . position . y Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . key Ġto Ġit . value . groupBy Ġ{ Ġys Ġ-> Ġys . position . x Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget BoundingBox ( stars : ĠMutable List < Star >): ĠBounding Box Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmin X Ġ= Ġstars . min By Ġ{ Ġit . position . x Ġ} !!. position . x ĊĠĠĠĠĠĠĠ Ġval Ġmax X Ġ= Ġstars . max By Ġ{ Ġit . position . x Ġ} !!. position . x ĊĊĠĠĠĠĠĠĠ Ġval Ġmin Y Ġ= Ġstars . min By Ġ{ Ġit . position . y Ġ} !!. position . y ĊĠĠĠĠĠĠĠ Ġval Ġmax Y Ġ= Ġstars . max By Ġ{ Ġit . position . y Ġ} !!. position . y ĊĊĠĠĠĠĠĠĠ Ġreturn ĠBounding Box ( min X , Ġmax X , Ġmin Y , Ġmax Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmove ( seconds : ĠInt Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 1 .. seconds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstars . forEach ( Star :: move ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġseek Sky Writing (): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġmap Is Grow ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġlast BoundingBox Ġ= Ġstarting Bounds ĊĊĠĠĠĠĠĠĠ Ġvar Ġseconds Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(! map Is Grow ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstars . forEach ( Star :: move ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseconds ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew BoundingBox Ġ= Ġget BoundingBox ( stars ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new BoundingBox . size () Ġ> Ġlast BoundingBox . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Is Grow ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast BoundingBox Ġ= Ġnew BoundingBox ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġseconds Ġ- Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġby Y Ġ= Ġstars By Coordinate () ĊĊĠĠĠĠĠĠĠ Ġval Ġbounds Ġ= Ġget BoundingBox ( stars ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( bounds . min Y .. bounds . max Y ). fold ("") Ġ{ Ġo , Ġy Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Any For This Row Ġ= Ġby Y . containsKey ( y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġ( bounds . min X .. bounds . max X ). fold ("") Ġ{ Ġs , Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Any For This Row Ġ&& Ġby Y [ y ] !!. contains ( x )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ s #" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ s ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ o \ n $ row " ĊĠĠĠĠĠĠĠ Ġ}. trim Indent () ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠPosition ( val Ġx : ĠLong , Ġval Ġy : ĠLong ) Ċ Ċ data Ġclass ĠVe locity ( val Ġx : ĠInt , Ġval Ġy : ĠInt ) Ċ Ċ data Ġclass ĠStar ( var Ġposition : ĠPosition , Ġval Ġvelocity : ĠVe locity ) Ġ{ ĊĠĠĠ Ġfun Ġmove () Ġ{ ĊĠĠĠĠĠĠĠ Ġposition Ġ= ĠPosition ( position . x Ġ+ Ġvelocity . x , Ġposition . y Ġ+ Ġvelocity . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġparse ( s : ĠString ): ĠStar Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġe . g . Ġfrom Ġ" position =< Ġ 9 , ĠĠ 1 > Ġvelocity =< Ġ 0 , ĠĠ 2 >" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim End (' >') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split ("> Ġv ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . split (" =< ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . drop ( 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . map Ġ{ Ġs -> s . split (",") Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatten () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . map Ġ{ Ġs Ġ-> Ġs . trim () Ġ} Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos X Ġ= Ġparts [ 0 ][ 0 ]. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Y Ġ= Ġparts [ 0 ][ 1 ]. to Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvel X Ġ= Ġparts [ 1 ][ 0 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvel Y Ġ= Ġparts [ 1 ][ 1 ]. toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStar ( Position ( pos X , Ġpos Y ), ĠVe locity ( vel X , Ġvel Y )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }