Last active
December 31, 2018 08:26
-
-
Save 3v0k4/32076ae8fc4b005ca39fbabbfdeb4933 to your computer and use it in GitHub Desktop.
AdventOfCode 2018 PureScript - Day 10
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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