Measurements
Mix.install([
{:kino, github: "livebook-dev/kino", override: true},
{:kino_lab, "~> 0.1.0-dev", github: "jonatanklosko/kino_lab"},
{:vega_lite, "~> 0.1.4"},
{:kino_vega_lite, "~> 0.1.1"},
{:benchee, "~> 0.1"},
{:ecto, "~> 3.7"},
{:math, "~> 0.7.0"},
{:faker, "~> 0.17.0"},
{:utils, path: "#{__DIR__}/../utils"},
{:tested_cell, git: "https://github.com/BrooklinJazz/tested_cell"}
])
Navigation
Measurements
You are going to make a utility module for working with measurements.
increased/1
Given a list of measurements as integers, determine how many have increased. Each positive change since the previous integer in the list should count as an increase.
For example:
Measurements.increased([1, 1, 2, 3, 1])
2
Measurements.increased([1, 2, 1])
1
Measurements.increased([3, 1, 2])
1
increased_by/1
Given a list of measurements as integers, sum the amount they have increased by.
For example:
Measurements.increased_by([100, 150, 120, 130])
60
Measurements.increased_by([10, 20, 10, 40])
40
increments/1
Given a list of measurements as integers, determine the increment between each integer.
For example:
Measurements.increments([100, 150, 120, 130])
[50, -30, 10]
Measurements.increments([10, 20, 10, 40])
[10, -10, 30]
average/1
Find the average of a list of numbers. You can calculate average as $\frac{sum}{length}$.
For example:
Measurements.average([4, 5, 6])
5
Measurements.average([2, 10])
6
ExUnit.start(auto_run: false)
defmodule Assertion do
use ExUnit.Case
test "" do
defmodule Measurements do
def increments(measurements) do
end
def increased(measurements) do
end
def increased_by(measurements) do
end
def average(measurements) do
end
end
defmodule Solutions.Measurements do
def increments(measurements) do
measurements
|> Enum.chunk_every(2, 1, :discard)
|> Enum.map(fn [x, y] -> y - x end)
end
def increased(measurements) do
measurements
|> increments()
|> Enum.count(&(&1 > 0))
end
def increased_by(measurements) do
measurements
|> increments()
|> Enum.filter(&(&1 > 0))
|> Enum.sum()
end
def average(measurements) do
Enum.sum(measurements) / Enum.count(measurements)
end
end
list = Utils.Factory.integers()
assert Measurements.increased([1, 1]), "Implement the `increased` function."
assert Measurements.increased([1, 2, 1]) == 1
assert Measurements.increased([3, 1, 2]) == 1, "Ensure you count each positive change."
assert Measurements.increased([1, 1, 2, 3, 1]) == 2
assert Measurements.increased(list) == Solutions.Measurements.increased(list),
"`increased/1 failed when called with #{inspect(list)}"
assert Measurements.increased_by([1, 1]), "Implement the `increased_by` function."
assert Measurements.increased_by([100, 150, 120, 130]) == 60
assert Measurements.increased_by([10, 20, 10, 40]) == 40
assert Measurements.increased_by(list) == Solutions.Measurements.increased_by(list),
"`increased_by/1 failed when called with #{inspect(list)}"
assert Measurements.increments([1, 2]), "Implement the `increments` function."
assert Measurements.increments([100, 150, 120, 130]) == [50, -30, 10]
assert Measurements.increments([10, 20, 10, 40]) == [10, -10, 30]
assert Measurements.increments(list) == Solutions.Measurements.increments(list),
"`increments/1 failed when called with #{inspect(list)}"
assert Measurements.average([1, 1]), "Implement the `average` function."
assert Measurements.average([4, 5, 6]) == 5
assert Measurements.average([2, 10]) == 6
assert Measurements.average(list) == Solutions.Measurements.average(list),
"`increments/1 failed when called with #{inspect(list)}"
end
end
ExUnit.run()
# Make variables and modules defined in the test available.
# Also allows for exploration using the output of the cell.
defmodule Measurements do
def increments(measurements) do
end
def increased(measurements) do
end
def increased_by(measurements) do
end
def average(measurements) do
end
end
Commit Your Progress
Run the following in your command line from the project folder to track and save your progress in a Git commit.
$ git add .
$ git commit -m "finish measurements exercise"