|  | 
|  | 1 | +ExUnit.start() | 
|  | 2 | + | 
|  | 3 | +defmodule Whales do | 
|  | 4 | + def load_file(path) do | 
|  | 5 | + File.read!(path) | 
|  | 6 | + |> String.split(",", trim: true) | 
|  | 7 | + |> Enum.map(&Integer.parse/1) | 
|  | 8 | + |> Enum.map(&elem(&1, 0)) | 
|  | 9 | + end | 
|  | 10 | + | 
|  | 11 | + def distance_to(a, b), do: abs(a - b) | 
|  | 12 | + | 
|  | 13 | + def find_cheapest_route(positions), | 
|  | 14 | + do: find_cheapest_route(positions, Enum.min(positions), nil) | 
|  | 15 | + | 
|  | 16 | + def find_cheapest_route(positions, target, cheapest) do | 
|  | 17 | + if target == Enum.max(positions) + 1 do | 
|  | 18 | + cheapest | 
|  | 19 | + else | 
|  | 20 | + current = | 
|  | 21 | + if target == Enum.max(positions) + 1 do | 
|  | 22 | + cheapest | 
|  | 23 | + else | 
|  | 24 | + positions | 
|  | 25 | + |> Enum.map(fn position -> distance_to(position, target) end) | 
|  | 26 | + |> Enum.sum() | 
|  | 27 | + end | 
|  | 28 | + | 
|  | 29 | + new_cheapest = | 
|  | 30 | + if current < cheapest do | 
|  | 31 | + current | 
|  | 32 | + else | 
|  | 33 | + cheapest | 
|  | 34 | + end | 
|  | 35 | + | 
|  | 36 | + find_cheapest_route(positions, target + 1, new_cheapest) | 
|  | 37 | + end | 
|  | 38 | + end | 
|  | 39 | + | 
|  | 40 | + @spec first() :: Integer | 
|  | 41 | + def first() do | 
|  | 42 | + positions = load_file("../input.txt") | 
|  | 43 | + find_cheapest_route(positions) | 
|  | 44 | + end | 
|  | 45 | + | 
|  | 46 | + @spec second() :: Integer | 
|  | 47 | + def second() do | 
|  | 48 | + end | 
|  | 49 | +end | 
|  | 50 | + | 
|  | 51 | +defmodule WhalesTest do | 
|  | 52 | + use ExUnit.Case | 
|  | 53 | +end | 
0 commit comments