From b13127e3f324d1527ec77691b15d0177124d55d0 Mon Sep 17 00:00:00 2001 From: Doruk Gurleyen Date: Wed, 1 Dec 2021 13:30:35 -0600 Subject: [PATCH] Add timer for Elixir functions --- .tool-versions | 4 ++-- challenges/2021/01.exs | 18 +++++++----------- challenges/2021/template.exs | 14 +++++++------- utils/utils.exs | 19 ++++++++++++++++--- 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/.tool-versions b/.tool-versions index 74204aa..5725af7 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ -erlang 23.2.3 -elixir 1.11.3-otp-23 +erlang 24.1.7 +elixir 1.12.3-otp-24 diff --git a/challenges/2021/01.exs b/challenges/2021/01.exs index 9925ab1..757eb99 100644 --- a/challenges/2021/01.exs +++ b/challenges/2021/01.exs @@ -1,14 +1,10 @@ -Code.compile_file("./utils/utils.exs") +Code.compile_file(Path.join([__ENV__.file], ["../../../utils/utils.exs"])) defmodule Challenge do @moduledoc false - def input do - Utils.load_input(__ENV__.file) - end - - def first_result do - input() + def first_result(input) do + input |> Enum.reduce([0, nil], fn val, [sum, prev] -> val = String.to_integer(val) @@ -17,8 +13,8 @@ defmodule Challenge do |> List.first() end - def second_result do - input() + def second_result(input) do + input |> Enum.reduce([0, nil, nil, nil], fn val, [sum, prev3, prev2, prev1] = acc -> val = String.to_integer(val) @@ -32,5 +28,5 @@ defmodule Challenge do end end -IO.inspect(Challenge.first_result(), label: "Q1") -IO.inspect(Challenge.second_result(), label: "Q2") +Utils.execute(&Challenge.first_result/1, __ENV__.file, "Q1") +Utils.execute(&Challenge.second_result/1, __ENV__.file, "Q2") diff --git a/challenges/2021/template.exs b/challenges/2021/template.exs index 86d7396..35b3f17 100644 --- a/challenges/2021/template.exs +++ b/challenges/2021/template.exs @@ -1,4 +1,4 @@ -Code.compile_file("./utils/utils.exs") +Code.compile_file(Path.join([__ENV__.file], ["../../../utils/utils.exs"])) defmodule Challenge do @moduledoc false @@ -7,14 +7,14 @@ defmodule Challenge do Utils.load_input(__ENV__.file) end - def first_result do - input() + def first_result(input) do + input end - def second_result do - input() + def second_result(input) do + input end end -IO.inspect(Challenge.first_result(), label: "Q1") -IO.inspect(Challenge.second_result(), label: "Q2") +Utils.execute(&Challenge.first_result/1, __ENV__.file, "Q1") +Utils.execute(&Challenge.second_result/1, __ENV__.file, "Q2") diff --git a/utils/utils.exs b/utils/utils.exs index af56cbf..7233499 100644 --- a/utils/utils.exs +++ b/utils/utils.exs @@ -1,12 +1,25 @@ defmodule Utils do def load_input(file) do - {file_name, folder} = file |> String.split("/") |> List.pop_at(-1) + {file_name, folder} = file |> Path.split() |> List.pop_at(-1) challenge = file_name |> String.split(".") |> List.first() folder - |> Enum.join("/") - |> Path.join("inputs/#{challenge}.txt") + |> Kernel.++(["inputs/#{challenge}.txt"]) + |> Path.join() |> File.read!() |> String.split("\n") end + + def execute(function, file, label) do + input = load_input(file) + + fn -> function.(input) end + |> :timer.tc() + |> log_result(label) + end + + defp log_result({time, result}, label) do + IO.inspect(result, label: label) + IO.puts("#{label} completed in #{time / 1_000}ms") + end end