Elixir Learnings: div and rem
This is part of my series on Elixir Learnings, where I share micro posts about everything I'm learning related to Elixir.
div
and rem
stand for division
and remainder
. We can get the result of a division between two numbers.
div 10, 2 # 5
div 10, 3 # 3
div 10, 4 # 2
div 10, 5 # 2
And the remaining:
rem 10, 2 # 0
rem 10, 3 # 1
rem 10, 4 # 2
rem 10, 5 # 0
While learning Elixir, I came across an exercise: I needed to build a function that returns the how many boxes of each type (big, medium, and small) I need to use to organize a number of matchsticks. And I also needed to return the remaining matchsticks.
The big box can be filled with 50 matchsticks. The medium: 20. And the small: 5.
To solve this problem, I start with the big box. For a number N
, how many big boxes I can use? I can use the div
function to get this information: div(N, 50)
. As I filled the big boxes, I need to get the remaining matchsticks to do the same thing with the medium and small boxes.
big = div(matchsticks, 50)
remaining_after_big = rem(matchsticks, 50)
medium = div(remaining_after_big, 20)
remaining_after_medium = rem(remaining_after_big, 20)
small = div(remaining_after_medium, 5)
remaining_matchsticks = rem(remaining_after_medium, 5)
With this, I have the big
, the medium
, the small
, and the remaining_matchsticks
. And I can return this whole information with a map object.
def boxes(matchsticks) do
big = div(matchsticks, 50)
remaining_after_big = rem(matchsticks, 50)
medium = div(remaining_after_big, 20)
remaining_after_medium = rem(remaining_after_big, 20)
small = div(remaining_after_medium, 5)
remaining_matchsticks = rem(remaining_after_medium, 5)
%{
big: big,
medium: medium,
small: small,
remaining_matchsticks: remaining_matchsticks
}
end
I can also build this function inside a module:
defmodule MatchstickFactory do
def boxes(matchsticks) do
big = div(matchsticks, 50)
remaining_after_big = rem(matchsticks, 50)
medium = div(remaining_after_big, 20)
remaining_after_medium = rem(remaining_after_big, 20)
small = div(remaining_after_medium, 5)
remaining_matchsticks = rem(remaining_after_medium, 5)
%{
big: big,
medium: medium,
small: small,
remaining_matchsticks: remaining_matchsticks
}
end
end
And test it:
MatchstickFactory.boxes(98) # %{big: 1, medium: 2, remaining_matchsticks: 3, small: 1}
MatchstickFactory.boxes(39) # %{big: 0, medium: 1, remaining_matchsticks: 4, small: 3}