Day 1. Success!
commit
12d6457332
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,37 @@
|
|||||||
|
app [main] {
|
||||||
|
pf: platform "https://github.com/roc-lang/basic-cli/releases/download/0.17.0/lZFLstMUCUvd5bjnnpYromZJXkQUrdhbva4xdBInicE.tar.br",
|
||||||
|
}
|
||||||
|
|
||||||
|
import pf.Stdout
|
||||||
|
import "data.txt" as data : Str
|
||||||
|
|
||||||
|
main =
|
||||||
|
lines = Str.splitOn data "\n"
|
||||||
|
|> List.keepIf (\l -> Str.countUtf8Bytes l > 0) # the last line is empty. only keep non-empties
|
||||||
|
# |> List.dropLast 1 # cleaner but scarier
|
||||||
|
|
||||||
|
# split the lines into a 2-tuple of lists
|
||||||
|
lists = List.walk lines ([], []) \state, elem ->
|
||||||
|
parts = Str.splitOn elem " "
|
||||||
|
# man I gotta figure out how to deal with errors better, this is not pretty
|
||||||
|
# tried using try but couldn't get walk to work with functions that return errors
|
||||||
|
left = Str.toU64 (Result.withDefault (List.first parts) "0")
|
||||||
|
right = Str.toU64 (Result.withDefault (List.last parts) "0")
|
||||||
|
(List.appendIfOk state.0 left, List.appendIfOk state.1 right)
|
||||||
|
|
||||||
|
sorted = (List.sortAsc lists.0, List.sortAsc lists.1)
|
||||||
|
|
||||||
|
Stdout.line! "Distance: $(Num.toStr (part1 sorted))"
|
||||||
|
Stdout.line! "Similarity: $(Num.toStr (part2 sorted))"
|
||||||
|
|
||||||
|
# tried to dry this up by having 1 walk and a record for part1 and part2, but it got ugly
|
||||||
|
part1 = \(left, right) ->
|
||||||
|
List.map2 left right Pair
|
||||||
|
|> List.walk 0 \state, (Pair l r) ->
|
||||||
|
state + (Num.absDiff l r)
|
||||||
|
|
||||||
|
part2 = \(left, right) ->
|
||||||
|
List.map2 left right Pair
|
||||||
|
|> List.walk 0 \state, (Pair l _) ->
|
||||||
|
count = List.countIf right (\e -> e == l)
|
||||||
|
state + count * l
|
@ -0,0 +1,6 @@
|
|||||||
|
3 4
|
||||||
|
4 3
|
||||||
|
2 5
|
||||||
|
1 3
|
||||||
|
3 9
|
||||||
|
3 3
|
Loading…
Reference in New Issue