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