-
Notifications
You must be signed in to change notification settings - Fork 0
/
day06.elm
156 lines (123 loc) · 3.47 KB
/
day06.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
module Main exposing (..)
import Array
import Dict
import Tuple
import Html exposing (program, text, textarea, div, button, pre)
import View exposing (renderProblem)
import Inputs exposing (problemInputs)
main : Program Never Model Msg
main =
program { init = init, view = view, update = update, subscriptions = subscriptions }
subscriptions : Model -> Sub msg
subscriptions model =
Sub.none
type Msg
= Solve
| Solve2
update : Msg -> Model -> ( Model, Cmd msg )
update msg model =
case msg of
Solve ->
let
solution =
solverPart1 model
|> toString
in
( { model | solutionPart1 = solution }, Cmd.none )
Solve2 ->
let
solution =
solverPart2 model
|> toString
in
( { model | solutionPart2 = solution }, Cmd.none )
type alias Model =
{ problemDay : Int
, input : String
, solutionPart1 : String
, solutionPart2 : String
}
problemDay : Int
problemDay =
6
init : ( Model, Cmd msg )
init =
( { problemDay = problemDay
, input = Array.get (problemDay - 1) problemInputs |> Maybe.withDefault ""
, solutionPart1 = ""
, solutionPart2 = ""
}
, Cmd.none
)
sentenceLength : Int
sentenceLength =
8
getMessageLetters : Model -> List ( Int, String )
getMessageLetters model =
model.input
|> String.split "\n"
|> List.map String.trim
|> List.map (String.split "")
|> List.concat
|> List.indexedMap (,)
getLettersColumns : List ( Int, String ) -> Model -> List (List String)
getLettersColumns messageLetters model =
List.range 0 (sentenceLength - 1)
|> List.map
(\div ->
List.filter
(\( i, _ ) ->
i % sentenceLength == div
)
messageLetters
|> List.map (\( _, x ) -> x)
)
counter : List comparable -> Dict.Dict comparable Int
counter list =
list
|> List.foldr
(\x dict ->
case Dict.get x dict of
Just i ->
Dict.insert x (i + 1) dict
Nothing ->
Dict.insert x 1 dict
)
Dict.empty
mostCommon : Dict.Dict comparable Int -> List ( comparable, Int )
mostCommon dict =
Dict.toList dict
|> List.sortBy (\( _, v ) -> v)
|> List.reverse
solverPart1 : Model -> String
solverPart1 model =
let
messageLetters =
getMessageLetters model
in
getLettersColumns messageLetters model
|> List.map counter
|> List.map mostCommon
|> List.map (List.map Tuple.first)
|> List.map List.head
|> List.map (Maybe.withDefault "")
|> String.join ""
solverPart2 : Model -> String
solverPart2 model =
let
messageLetters =
getMessageLetters model
in
getLettersColumns messageLetters model
|> List.map counter
|> List.map mostCommon
|> List.map List.reverse
|> List.map (List.map Tuple.first)
|> List.map List.head
|> List.map (Maybe.withDefault "")
|> String.join ""
view : Model -> Html.Html Msg
view model =
div []
[ renderProblem model ( Solve, Solve2 )
]