diff --git a/challenges/2021/01.exs b/challenges/2021/01.exs index 757eb99..911f9dd 100644 --- a/challenges/2021/01.exs +++ b/challenges/2021/01.exs @@ -28,5 +28,5 @@ defmodule Challenge do end end -Utils.execute(&Challenge.first_result/1, __ENV__.file, "Q1") -Utils.execute(&Challenge.second_result/1, __ENV__.file, "Q2") +Utils.run(&Challenge.first_result/1, __ENV__.file, "Q1") +Utils.run(&Challenge.second_result/1, __ENV__.file, "Q2") diff --git a/challenges/2021/02.exs b/challenges/2021/02.exs new file mode 100644 index 0000000..dd3152c --- /dev/null +++ b/challenges/2021/02.exs @@ -0,0 +1,20 @@ +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(input) do + input + end + + def second_result(input) do + input + end +end + +Utils.run(&Challenge.first_result/1, __ENV__.file, "Q1") +Utils.run(&Challenge.second_result/1, __ENV__.file, "Q2") diff --git a/challenges/2021/inputs/02.txt b/challenges/2021/inputs/02.txt new file mode 100644 index 0000000..e69de29 diff --git a/challenges/2021/template.exs b/challenges/2021/template.exs index 35b3f17..41af157 100644 --- a/challenges/2021/template.exs +++ b/challenges/2021/template.exs @@ -3,10 +3,6 @@ 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(input) do input end @@ -16,5 +12,5 @@ defmodule Challenge do end end -Utils.execute(&Challenge.first_result/1, __ENV__.file, "Q1") -Utils.execute(&Challenge.second_result/1, __ENV__.file, "Q2") +Utils.run(&Challenge.first_result/1, __ENV__.file, "Q1") +Utils.run(&Challenge.second_result/1, __ENV__.file, "Q2") diff --git a/utils/utils.exs b/utils/utils.exs index 7233499..f3e893a 100644 --- a/utils/utils.exs +++ b/utils/utils.exs @@ -10,6 +10,18 @@ defmodule Utils do |> String.split("\n") end + def run(function, file, label) do + args = System.argv() + + if "-b" in args do + times_index = Enum.find_index(args, &(&1 == "-b")) + 1 + times = args |> Enum.at(times_index, "20") |> String.to_integer() + benchmark(function, file, label, times) + else + execute(function, file, label) + end + end + def execute(function, file, label) do input = load_input(file) @@ -18,6 +30,29 @@ defmodule Utils do |> log_result(label) end + def benchmark(function, file, label, times) do + input = load_input(file) + + average_time = + 1..times + |> Enum.map(fn _ -> + fn -> function.(input) end + |> :timer.tc() + |> elem(0) + |> Kernel./(1_000) + end) + |> Enum.reduce( + [nil, 0], + fn + val, [nil, 0] -> [val, 1] + val, [avg, count] -> [(avg * count + val) / (count + 1), count + 1] + end + ) + |> List.first() + + IO.puts("#{label} ran #{times} times with an average of #{average_time}ms") + end + defp log_result({time, result}, label) do IO.inspect(result, label: label) IO.puts("#{label} completed in #{time / 1_000}ms")