Skip to content

Instantly share code, notes, and snippets.

@3v0k4
Last active December 31, 2018 08:26
Show Gist options
  • Save 3v0k4/32076ae8fc4b005ca39fbabbfdeb4933 to your computer and use it in GitHub Desktop.
Save 3v0k4/32076ae8fc4b005ca39fbabbfdeb4933 to your computer and use it in GitHub Desktop.
AdventOfCode 2018 PureScript - Day 10
module Main where
import Prelude
import Effect (Effect)
import Effect.Console (logShow)
import Data.List (List(..), fromFoldable)
import Data.Array ((..))
import Text.Parsing.StringParser.CodeUnits (anyDigit, char, string)
import Text.Parsing.StringParser (Parser, runParser, ParseError, fail)
import Text.Parsing.StringParser.Combinators (many1, many, optionMaybe)
import Data.Int (fromString)
import Data.String.Yarn (fromChars)
import Data.Maybe (Maybe(..), fromJust)
import Data.Either (Either(..))
import Data.Traversable (sequence)
import Data.Foldable (minimum, maximum, any, traverse_)
import Data.Tuple (Tuple(..), snd)
import Partial.Unsafe (unsafePartial)
import Data.List.Lazy (List, take, iterate, filter, zip) as Lazy
testInput :: List String
testInput = fromFoldable [ "position=< 9, 1> velocity=< 0, 2>" , "position=< 7, 0> velocity=<-1, 0>" , "position=< 3, -2> velocity=<-1, 1>" , "position=< 6, 10> velocity=<-2, -1>" , "position=< 2, -4> velocity=< 2, 2>" , "position=<-6, 10> velocity=< 2, -2>" , "position=< 1, 8> velocity=< 1, -1>" , "position=< 1, 7> velocity=< 1, 0>" , "position=<-3, 11> velocity=< 1, -2>" , "position=< 7, 6> velocity=<-1, -1>" , "position=<-2, 3> velocity=< 1, 0>" , "position=<-4, 3> velocity=< 2, 0>" , "position=<10, -3> velocity=<-1, 1>" , "position=< 5, 11> velocity=< 1, -2>" , "position=< 4, 7> velocity=< 0, -1>" , "position=< 8, -2> velocity=< 0, 1>" , "position=<15, 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=<14, 7> velocity=<-2, 0>" , "position=<-3, 6> velocity=< 2, -1>" ]
input :: List String
input = fromFoldable [ "position=< -9767, 50146> velocity=< 1, -5>" , "position=< 20243, 20134> velocity=<-2, -2>" , "position=< -9771, 50141> velocity=< 1, -5>" , "position=< 20206, -49884> velocity=<-2, 5>" , "position=< 30233, 40142> velocity=<-3, -4>" , "position=<-29829, 30132> velocity=< 3, -3>" , "position=<-39787, -19879> velocity=< 4, 2>" , "position=< 40188, 30138> velocity=<-4, -3>" , "position=<-19811, -49890> velocity=< 2, 5>" , "position=< -9771, -19880> velocity=< 1, 2>" , "position=< 30188, -39880> velocity=<-3, 4>" , "position=<-29788, -29882> velocity=< 3, 3>" , "position=<-19790, -39886> velocity=< 2, 4>" , "position=< 10179, -39881> velocity=<-1, 4>" , "position=< 10211, -9871> velocity=<-1, 1>" , "position=< 30238, 20137> velocity=<-3, -2>" , "position=< 50239, -19878> velocity=<-5, 2>" , "position=< 40204, 30135> velocity=<-4, -3>" , "position=< 40225, 40139> velocity=<-4, -4>" , "position=< 40231, 50143> velocity=<-4, -5>" , "position=<-19793, 40141> velocity=< 2, -4>" , "position=< 50247, 50146> velocity=<-5, -5>" , "position=< 50203, 20129> velocity=<-5, -2>" , "position=< 10238, 10132> velocity=<-1, -1>" , "position=< 30217, -39888> velocity=<-3, 4>" , "position=< 50193, 30132> velocity=<-5, -3>" , "position=<-49803, -39881> velocity=< 5, 4>" , "position=<-29820, -29877> velocity=< 3, 3>" , "position=< 30238, 20138> velocity=<-3, -2>" , "position=< 20207, 10126> velocity=<-2, -1>" , "position=<-39803, 40136> velocity=< 4, -4>" , "position=< 50248, -39888> velocity=<-5, 4>" , "position=<-19801, -29884> velocity=< 2, 3>" , "position=< 40244, -9876> velocity=<-4, 1>" , "position=<-49799, 50145> velocity=< 5, -5>" , "position=<-19806, 50140> velocity=< 2, -5>" , "position=< 20223, 20134> velocity=<-2, -2>" , "position=<-29813, -49891> velocity=< 3, 5>" , "position=<-29809, -49883> velocity=< 3, 5>" , "position=< -9819, 30141> velocity=< 1, -3>" , "position=< 40220, 10130> velocity=<-4, -1>" , "position=< -9771, 10131> velocity=< 1, -1>" , "position=< 50192, -49883> velocity=<-5, 5>" , "position=< 30244, -19877> velocity=<-3, 2>" , "position=< 50247, 50143> velocity=<-5, -5>" , "position=< 10240, 50138> velocity=<-1, -5>" , "position=<-49830, -19874> velocity=< 5, 2>" , "position=<-19780, 20129> velocity=< 2, -2>" , "position=< 40241, 50147> velocity=<-4, -5>" , "position=< 50217, -29882> velocity=<-5, 3>" , "position=< 40228, 40141> velocity=<-4, -4>" , "position=<-39804, 50141> velocity=< 4, -5>" , "position=< 40198, -49887> velocity=<-4, 5>" , "position=< -9803, -49886> velocity=< 1, 5>" , "position=<-19817, -49890> velocity=< 2, 5>" , "position=<-49835, 10135> velocity=< 5, -1>" , "position=< 10219, 50146> velocity=<-1, -5>" , "position=< 40188, -39884> velocity=<-4, 4>" , "position=<-29832, -9880> velocity=< 3, 1>" , "position=< 40201, 40136> velocity=<-4, -4>" , "position=<-49791, 20129> velocity=< 5, -2>" , "position=< 20222, 30134> velocity=<-2, -3>" , "position=< 20207, 30132> velocity=<-2, -3>" , "position=<-29817, -19880> velocity=< 3, 2>" , "position=< 20206, -29881> velocity=<-2, 3>" , "position=<-29833, 10127> velocity=< 3, -1>" , "position=< 40249, 30136> velocity=<-4, -3>" , "position=<-19820, 30137> velocity=< 2, -3>" , "position=< 30237, -9873> velocity=<-3, 1>" , "position=< 20217, -39884> velocity=<-2, 4>" , "position=< 50191, 10130> velocity=<-5, -1>" , "position=<-29825, 50146> velocity=< 3, -5>" , "position=< 10192, 10135> velocity=<-1, -1>" , "position=< 50191, 10130> velocity=<-5, -1>" , "position=< 50223, 20129> velocity=<-5, -2>" , "position=< 20238, 40138> velocity=<-2, -4>" , "position=< 30221, -9872> velocity=<-3, 1>" , "position=<-49803, -39881> velocity=< 5, 4>" , "position=<-39836, -39887> velocity=< 4, 4>" , "position=<-29820, -29885> velocity=< 3, 3>" , "position=<-29806, -9876> velocity=< 3, 1>" , "position=<-29791, -19883> velocity=< 3, 2>" , "position=<-49835, 50147> velocity=< 5, -5>" , "position=<-39825, -19874> velocity=< 4, 2>" , "position=<-49806, -39887> velocity=< 5, 4>" , "position=< -9766, 10134> velocity=< 1, -1>" , "position=<-19819, -49892> velocity=< 2, 5>" , "position=<-49778, 10135> velocity=< 5, -1>" , "position=< 20231, -29886> velocity=<-2, 3>" , "position=< -9817, -19883> velocity=< 1, 2>" , "position=< -9778, 20133> velocity=< 1, -2>" , "position=< 50220, -19881> velocity=<-5, 2>" , "position=< 10211, 40144> velocity=<-1, -4>" , "position=<-39783, 30133> velocity=< 4, -3>" , "position=<-19769, 40135> velocity=< 2, -4>" , "position=<-39791, 30135> velocity=< 4, -3>" , "position=<-19814, -49888> velocity=< 2, 5>" , "position=<-49829, -49883> velocity=< 5, 5>" , "position=<-19790, -9872> velocity=< 2, 1>" , "position=< 40216, -49892> velocity=<-4, 5>" , "position=< 20238, -39882> velocity=<-2, 4>" , "position=< 10235, 50138> velocity=<-1, -5>" , "position=<-19814, -29878> velocity=< 2, 3>" , "position=< 30217, 10129> velocity=<-3, -1>" , "position=< 10235, 30133> velocity=<-1, -3>" , "position=< 10188, 40144> velocity=<-1, -4>" , "position=< 10235, -19874> velocity=<-1, 2>" , "position=<-19793, 30135> velocity=< 2, -3>" , "position=< 20198, 30141> velocity=<-2, -3>" , "position=<-39815, 40135> velocity=< 4, -4>" , "position=< 50252, 40138> velocity=<-5, -4>" , "position=< 30222, -19880> velocity=<-3, 2>" , "position=< 20190, -19883> velocity=<-2, 2>" , "position=< 10216, -29878> velocity=<-1, 3>" , "position=< 20187, -39888> velocity=<-2, 4>" , "position=< 10179, 40143> velocity=<-1, -4>" , "position=< 20203, -29886> velocity=<-2, 3>" , "position=< 40188, 50143> velocity=<-4, -5>" , "position=< 50228, -29885> velocity=<-5, 3>" , "position=< 10237, -9877> velocity=<-1, 1>" , "position=<-49804, -19877> velocity=< 5, 2>" , "position=<-29793, -49888> velocity=< 3, 5>" , "position=< 20235, 30140> velocity=<-2, -3>" , "position=<-39788, 10133> velocity=< 4, -1>" , "position=<-19793, 10132> velocity=< 2, -1>" , "position=< 30201, 40143> velocity=<-3, -4>" , "position=< 40212, 50138> velocity=<-4, -5>" , "position=<-19786, -9875> velocity=< 2, 1>" , "position=< -9810, -19879> velocity=< 1, 2>" , "position=< 30219, -49888> velocity=<-3, 5>" , "position=< 50218, -49892> velocity=<-5, 5>" , "position=< 40225, -29883> velocity=<-4, 3>" , "position=< 30233, 30136> velocity=<-3, -3>" , "position=< 10211, -19881> velocity=<-1, 2>" , "position=< 10216, -9878> velocity=<-1, 1>" , "position=<-19794, 20136> velocity=< 2, -2>" , "position=< 10188, 40141> velocity=<-1, -4>" , "position=< -9819, 50145> velocity=< 1, -5>" , "position=< -9774, -9877> velocity=< 1, 1>" , "position=< 10227, -39883> velocity=<-1, 4>" , "position=< -9816, 40139> velocity=< 1, -4>" , "position=<-39775, 10133> velocity=< 4, -1>" , "position=< -9778, -9880> velocity=< 1, 1>" , "position=< 10228, 20129> velocity=<-1, -2>" , "position=< 20207, 30136> velocity=<-2, -3>" , "position=< 10188, -39883> velocity=<-1, 4>" , "position=< 30209, -39888> velocity=<-3, 4>" , "position=<-39826, -19874> velocity=< 4, 2>" , "position=<-19790, 20135> velocity=< 2, -2>" , "position=<-39775, -49889> velocity=< 4, 5>" , "position=<-19771, 50143> velocity=< 2, -5>" , "position=< 20238, 20131> velocity=<-2, -2>" , "position=< 40249, -49885> velocity=<-4, 5>" , "position=< 50235, 10127> velocity=<-5, -1>" , "position=<-19806, 20138> velocity=< 2, -2>" , "position=<-19789, -19882> velocity=< 2, 2>" , "position=< 30237, 20135> velocity=<-3, -2>" , "position=< 10230, -49887> velocity=<-1, 5>" , "position=<-29825, -39880> velocity=< 3, 4>" , "position=< 50219, 30132> velocity=<-5, -3>" , "position=< 40244, -39885> velocity=<-4, 4>" , "position=< -9811, -39888> velocity=< 1, 4>" , "position=< 50228, 10127> velocity=<-5, -1>" , "position=< 10231, -9880> velocity=<-1, 1>" , "position=< 10232, 20131> velocity=<-1, -2>" , "position=< 40232, 40136> velocity=<-4, -4>" , "position=< 20214, 20136> velocity=<-2, -2>" , "position=< -9811, -49885> velocity=< 1, 5>" , "position=< 50207, 20135> velocity=<-5, -2>" , "position=<-49799, -39884> velocity=< 5, 4>" , "position=<-39820, 30137> velocity=< 4, -3>" , "position=< 40236, -19882> velocity=<-4, 2>" , "position=< 20243, -39884> velocity=<-2, 4>" , "position=< 40236, -19875> velocity=<-4, 2>" , "position=< 40197, -29880> velocity=<-4, 3>" , "position=<-49787, -29879> velocity=< 5, 3>" , "position=<-49794, 10129> velocity=< 5, -1>" , "position=<-29804, 20132> velocity=< 3, -2>" , "position=<-29824, -49892> velocity=< 3, 5>" , "position=<-19785, -29879> velocity=< 2, 3>" , "position=< 40236, 40144> velocity=<-4, -4>" , "position=<-19830, 10131> velocity=< 2, -1>" , "position=<-39785, 30132> velocity=< 4, -3>" , "position=< -9816, 30141> velocity=< 1, -3>" , "position=< 10197, 50141> velocity=<-1, -5>" , "position=< 20198, -49883> velocity=<-2, 5>" , "position=< 30217, 50146> velocity=<-3, -5>" , "position=<-39799, 40140> velocity=< 4, -4>" , "position=<-19774, -49885> velocity=< 2, 5>" , "position=< 30212, -9880> velocity=<-3, 1>" , "position=<-19772, -9876> velocity=< 2, 1>" , "position=< 50228, 10126> velocity=<-5, -1>" , "position=< -9790, -29878> velocity=< 1, 3>" , "position=<-19826, -49892> velocity=< 2, 5>" , "position=< -9771, -39888> velocity=< 1, 4>" , "position=<-19795, -49887> velocity=< 2, 5>" , "position=<-19793, -9880> velocity=< 2, 1>" , "position=<-19801, 40137> velocity=< 2, -4>" , "position=<-39812, 50145> velocity=< 4, -5>" , "position=< 50239, -9876> velocity=<-5, 1>" , "position=<-29833, -29880> velocity=< 3, 3>" , "position=< 50210, 40142> velocity=<-5, -4>" , "position=< 40220, 20130> velocity=<-4, -2>" , "position=<-29809, -49888> velocity=< 3, 5>" , "position=< 40193, -19875> velocity=<-4, 2>" , "position=< -9803, 50143> velocity=< 1, -5>" , "position=< 30230, -49890> velocity=<-3, 5>" , "position=< 10187, 20138> velocity=<-1, -2>" , "position=< 40244, 40144> velocity=<-4, -4>" , "position=< 30212, -39885> velocity=<-3, 4>" , "position=<-49823, 30134> velocity=< 5, -3>" , "position=< 40199, 40135> velocity=<-4, -4>" , "position=< 20230, 10128> velocity=<-2, -1>" , "position=< 10211, 20132> velocity=<-1, -2>" , "position=< 40231, 30137> velocity=<-4, -3>" , "position=< 30185, 20135> velocity=<-3, -2>" , "position=< 30217, 40137> velocity=<-3, -4>" , "position=< 20194, -19883> velocity=<-2, 2>" , "position=< 10216, 30141> velocity=<-1, -3>" , "position=<-39820, 40137> velocity=< 4, -4>" , "position=<-39794, 10131> velocity=< 4, -1>" , "position=< 50239, 30134> velocity=<-5, -3>" , "position=<-39828, -49892> velocity=< 4, 5>" , "position=< 20224, -29881> velocity=<-2, 3>" , "position=<-49802, 10128> velocity=< 5, -1>" , "position=< 40196, 30140> velocity=<-4, -3>" , "position=<-49837, 40144> velocity=< 5, -4>" , "position=<-19777, 30135> velocity=< 2, -3>" , "position=< 50233, 40140> velocity=<-5, -4>" , "position=< 30227, 40135> velocity=<-3, -4>" , "position=< 30226, 10127> velocity=<-3, -1>" , "position=< 30246, -29881> velocity=<-3, 3>" , "position=< 30209, 50138> velocity=<-3, -5>" , "position=< -9827, -9879> velocity=< 1, 1>" , "position=< 10235, 40136> velocity=<-1, -4>" , "position=<-19785, -9871> velocity=< 2, 1>" , "position=<-49815, -49889> velocity=< 5, 5>" , "position=<-49839, -29885> velocity=< 5, 3>" , "position=<-19795, 50143> velocity=< 2, -5>" , "position=< 50231, -9873> velocity=<-5, 1>" , "position=<-19786, -49891> velocity=< 2, 5>" , "position=< 30186, -29877> velocity=<-3, 3>" , "position=<-19813, 10130> velocity=< 2, -1>" , "position=<-49788, 30136> velocity=< 5, -3>" , "position=< 10203, -19881> velocity=<-1, 2>" , "position=< 20198, -9876> velocity=<-2, 1>" , "position=<-39783, 40137> velocity=< 4, -4>" , "position=<-39804, -19876> velocity=< 4, 2>" , "position=<-39784, -9880> velocity=< 4, 1>" , "position=<-39817, 20131> velocity=< 4, -2>" , "position=< 40196, 30132> velocity=<-4, -3>" , "position=< 30242, -9879> velocity=<-3, 1>" , "position=<-39786, 50142> velocity=< 4, -5>" , "position=<-29833, -9876> velocity=< 3, 1>" , "position=< 40200, 40138> velocity=<-4, -4>" , "position=< 10211, -49885> velocity=<-1, 5>" , "position=< 20222, -49888> velocity=<-2, 5>" , "position=< 50239, 10134> velocity=<-5, -1>" , "position=<-49794, 50145> velocity=< 5, -5>" , "position=<-39833, -49892> velocity=< 4, 5>" , "position=< 50223, -29885> velocity=<-5, 3>" , "position=<-29796, -39888> velocity=< 3, 4>" , "position=<-29793, 10135> velocity=< 3, -1>" , "position=< 30211, -29886> velocity=<-3, 3>" , "position=<-29772, -29883> velocity=< 3, 3>" , "position=< -9818, -9880> velocity=< 1, 1>" , "position=< 40236, 30139> velocity=<-4, -3>" , "position=< 40240, 50144> velocity=<-4, -5>" , "position=< 50226, 10132> velocity=<-5, -1>" , "position=<-29815, 20135> velocity=< 3, -2>" , "position=< 40217, -19882> velocity=<-4, 2>" , "position=<-39812, 20138> velocity=< 4, -2>" , "position=< -9817, 40140> velocity=< 1, -4>" , "position=<-39808, 20129> velocity=< 4, -2>" , "position=< 50212, 30141> velocity=<-5, -3>" , "position=< 20243, 50144> velocity=<-2, -5>" , "position=< -9787, 10133> velocity=< 1, -1>" , "position=< 30209, 50144> velocity=<-3, -5>" , "position=<-49815, -39884> velocity=< 5, 4>" , "position=<-29820, -29886> velocity=< 3, 3>" , "position=< 20182, 40142> velocity=<-2, -4>" , "position=< 10235, 20135> velocity=<-1, -2>" , "position=< 10179, 30135> velocity=<-1, -3>" , "position=<-29792, 20130> velocity=< 3, -2>" , "position=<-39820, -19881> velocity=< 4, 2>" , "position=<-19794, -39882> velocity=< 2, 4>" , "position=<-19796, -29883> velocity=< 2, 3>" , "position=< 10231, 30136> velocity=<-1, -3>" , "position=< -9779, 30141> velocity=< 1, -3>" , "position=< -9771, 30140> velocity=< 1, -3>" , "position=< -9779, -9880> velocity=< 1, 1>" , "position=< 50207, -19883> velocity=<-5, 2>" , "position=< 40204, 30132> velocity=<-4, -3>" , "position=<-19806, -49888> velocity=< 2, 5>" , "position=<-39784, 40142> velocity=< 4, -4>" , "position=<-19769, 30136> velocity=< 2, -3>" , "position=< 30236, -9880> velocity=<-3, 1>" , "position=<-49794, 20138> velocity=< 5, -2>" , "position=<-49826, 30141> velocity=< 5, -3>" , "position=<-19769, -49886> velocity=< 2, 5>" , "position=< 20201, 20131> velocity=<-2, -2>" , "position=<-19798, 30137> velocity=< 2, -3>" , "position=<-19774, 40140> velocity=< 2, -4>" , "position=<-39824, 40135> velocity=< 4, -4>" , "position=<-49794, -19878> velocity=< 5, 2>" , "position=<-49815, -9877> velocity=< 5, 1>" , "position=< -9784, -9880> velocity=< 1, 1>" , "position=<-19769, -9878> velocity=< 2, 1>" , "position=<-29831, -29886> velocity=< 3, 3>" , "position=< 30217, 40135> velocity=<-3, -4>" , "position=< 40244, -49885> velocity=<-4, 5>" , "position=<-19785, 50145> velocity=< 2, -5>" , "position=< 50191, -39881> velocity=<-5, 4>" , "position=<-39796, 30138> velocity=< 4, -3>" , "position=< 10205, -9880> velocity=<-1, 1>" , "position=<-49806, 40136> velocity=< 5, -4>" , "position=< 10231, 10132> velocity=<-1, -1>" , "position=< 20194, -29877> velocity=<-2, 3>" , "position=<-49786, 20132> velocity=< 5, -2>" , "position=< 50228, 20133> velocity=<-5, -2>" , "position=<-49794, -49890> velocity=< 5, 5>" , "position=< 30209, 40142> velocity=<-3, -4>" , "position=< 20219, -29877> velocity=<-2, 3>" , "position=<-29780, 20130> velocity=< 3, -2>" , "position=<-29831, -19883> velocity=< 3, 2>" , "position=<-29817, -39889> velocity=< 3, 4>" , "position=<-39785, 30137> velocity=< 4, -3>" , "position=<-49838, -49892> velocity=< 5, 5>" , "position=< 50204, -29884> velocity=<-5, 3>" , "position=< 50234, 50138> velocity=<-5, -5>" , "position=<-49815, 40142> velocity=< 5, -4>" , "position=< 40216, 30136> velocity=<-4, -3>" , "position=<-19769, -19883> velocity=< 2, 2>" , "position=<-29798, 30138> velocity=< 3, -3>" , "position=< -9782, 30140> velocity=< 1, -3>" , "position=<-49810, -49889> velocity=< 5, 5>" , "position=<-19805, -29886> velocity=< 2, 3>" , "position=< 50240, -19879> velocity=<-5, 2>" , "position=<-39776, -9873> velocity=< 4, 1>" , "position=<-19813, 50143> velocity=< 2, -5>" , "position=<-49786, -29884> velocity=< 5, 3>" , "position=< 40233, -49883> velocity=<-4, 5>" , "position=<-39785, -9880> velocity=< 4, 1>" , "position=<-19810, 50146> velocity=< 2, -5>" , "position=< -9803, -29885> velocity=< 1, 3>" , "position=<-19793, 40142> velocity=< 2, -4>" , "position=< 20230, -39880> velocity=<-2, 4>" , "position=<-49807, -19877> velocity=< 5, 2>" , "position=<-49822, -19878> velocity=< 5, 2>" , "position=<-49791, 50141> velocity=< 5, -5>" , "position=< 30226, -19878> velocity=<-3, 2>" , "position=< 30222, -49885> velocity=<-3, 5>" , "position=< 30229, 50143> velocity=<-3, -5>" , "position=< -9782, 50141> velocity=< 1, -5>" , "position=< -9795, -19883> velocity=< 1, 2>" , "position=< 40190, -29877> velocity=<-4, 3>" , "position=< 10179, 30134> velocity=<-1, -3>" , "position=<-49823, -9874> velocity=< 5, 1>" , "position=<-29799, 40139> velocity=< 3, -4>" , "position=<-39776, -39882> velocity=< 4, 4>" , "position=<-19782, 50144> velocity=< 2, -5>" , "position=< -9811, -9876> velocity=< 1, 1>" , "position=< 20219, -29877> velocity=<-2, 3>" , "position=<-49779, 20137> velocity=< 5, -2>" , "position=< -9779, 10134> velocity=< 1, -1>" , "position=< 20201, -49885> velocity=<-2, 5>" , "position=<-39832, 20138> velocity=< 4, -2>" , "position=< 20243, 50139> velocity=<-2, -5>" , "position=<-39780, 50144> velocity=< 4, -5>" , "position=< 20215, -39887> velocity=<-2, 4>" , "position=<-39788, -49892> velocity=< 4, 5>" , "position=<-29776, 50140> velocity=< 3, -5>" , "position=< 40220, -49887> velocity=<-4, 5>" , "position=<-19820, 40135> velocity=< 2, -4>" , "position=< 50200, -9871> velocity=<-5, 1>" , "position=<-49836, -39880> velocity=< 5, 4>" , "position=< 50236, -19875> velocity=<-5, 2>" , "position=< 50228, -29884> velocity=<-5, 3>" , "position=< 30230, -39883> velocity=<-3, 4>" ]
data Coord = Coord Int Int
instance showCoord :: Show Coord where
show (Coord x y) = "<" <> show x <> ", " <> show y <> ">"
instance eqCoord :: Eq Coord where
eq (Coord x1 y1) (Coord x2 y2) = x1 == x2 && y1 == y2
data Light = Light Coord Coord
instance showLight :: Show Light where
show (Light p v) = show p <> " " <> show v
coordParser :: Parser Coord
coordParser = do
_ <- char '<'
x <- intParser
_ <- char ','
y <- intParser
_ <- char '>'
pure $ Coord x y
intParser :: Parser Int
intParser = do
_ <- many (char ' ')
sign <- optionMaybe (char '-')
ds <- many1 anyDigit
case fromString $ fromChars ds of
Just i -> if sign == Just '-' then pure (-i) else pure i
Nothing -> fail "I was expecting an int!"
lightParser :: Parser Light
lightParser = do
_ <- string "position="
p <- coordParser
_ <- string " velocity="
v <- coordParser
pure $ Light p v
parseInput :: List String -> Either ParseError (List Light)
parseInput = sequence <<< map (runParser lightParser)
boundingBox :: List Light -> Tuple Coord Coord
boundingBox sky = Tuple topLeft bottomRight
where xs = map (\(Light (Coord x _) _) -> x) sky
ys = map (\(Light (Coord _ y) _) -> y) sky
minX = unsafePartial fromJust $ minimum $ xs
maxX = unsafePartial fromJust $ maximum $ xs
minY = unsafePartial fromJust $ minimum $ ys
maxY = unsafePartial fromJust $ maximum $ ys
topLeft = Coord minX minY
bottomRight = Coord maxX maxY
renderSky :: List Light -> List String
renderSky sky =
if not isVisualizable bbox then Nil else renderSky' sky bbox
where bbox = boundingBox sky
renderSky' :: List Light -> Tuple Coord Coord -> List String
renderSky' sky bbox = fromFoldable do
row <- minY..maxY
let line = fromChars do
col <- minX..maxX
let c = if isLighted (Coord col row) then '#' else '.'
pure c
pure line
where (Tuple (Coord minX minY) (Coord maxX maxY)) = bbox
isLighted c = any (\(Light p _) -> p == c) sky
isVisualizable :: Tuple Coord Coord -> Boolean
isVisualizable bbox = maxX - minX < 100 && maxY - minY < 100
where (Tuple (Coord minX minY) (Coord maxX maxY)) = bbox
allSkies :: List Light -> Lazy.List (List Light)
allSkies first = Lazy.iterate moveAll first
where moveAll lights = map moveOne lights
moveOne (Light (Coord x y) v@(Coord vx vy)) = Light (Coord (x + vx) (y + vy)) v
allInts :: Lazy.List Int
allInts = Lazy.iterate ((+) 1) 0
solve :: List Light -> Lazy.List (Tuple Int (List String))
solve lights =
Lazy.take 5 $ Lazy.filter (\t -> snd t /= Nil) $ renderedWithIndexes
where renderedWithIndexes = Lazy.zip allInts $ map renderSky $ allSkies lights
main :: Effect Unit
main = do
case map solve einput of
Right skies -> traverse_ logSecondPoints skies
Left _ -> logShow "err"
where einput = parseInput input
logSecondPoints (Tuple second sky) = logShow second >>= (\_ -> traverse_ logShow sky)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment