Current section

Files

Jump to
ex_dice lib dice.ex
Raw

lib/dice.ex

defmodule Dice do
@moduledoc """
Documentation for Dice.
"""
@doc """
Gets a list of a `d`-sided dice rolled `n` times.
Usage: `Dice.roll(n, d)`
Used to roll a `d`-sided dice `n` times, returning a list of the rolls.
Supports either two numbers or one string.
## Examples
iex> Dice.roll(10, 10)
[6, 10, 3, 6, 7, 1, 2, 9, 2, 4]
iex> Dice.roll("10d10")
[6, 10, 3, 6, 7, 1, 2, 9, 2, 4]
"""
def roll(n, sides) when n > 1 and is_integer(n) and sides > 1 and is_integer(sides) do
Enum.to_list(1..n)
|> Enum.map(fn x -> div(Enum.random(1..sides) * x, x) end)
end
def roll(str) when is_bitstring(str) do
[n, sides] = parse_string(str)
roll(n, sides)
end
@doc """
Returns the sum of a `d`-sided dice rolled `n` times.
## Examples
iex> Dice.sum(10, 10)
52
iex> Dice.sum("10d10")
52
"""
def sum(n, sides) when n > 1 and is_integer(n) and sides > 1 and is_integer(sides) do
roll(n, sides)
|> Enum.sum
end
def sum(str) when is_bitstring(str) do
[n, sides] = parse_string(str)
sum(n, sides)
end
@doc """
Returns the maximum roll of a `d`-sided dice rolled `n` times.
## Examples
iex> Dice.max(10, 1000)
914
iex> Dice.max("10d10")
914
"""
def max(n, sides) when n > 1 and is_integer(n) and sides > 1 and is_integer(sides) do
roll(n, sides)
|> Enum.max
end
def max(str) when is_bitstring(str) do
[n, sides] = parse_string(str)
Dice.max(n, sides)
end
@doc """
Returns the minimum roll of a `d`-sided dice rolled `n` times.
## Examples
iex> Dice.min(10, 1000)
49
iex> Dice.min("10d10")
49
"""
def min(n, sides) when n > 1 and is_integer(n) and sides > 1 and is_integer(sides) do
roll(n, sides)
|> Enum.min
end
def min(str) when is_bitstring(str) do
[n, sides] = parse_string(str)
Dice.min(n, sides)
end
@doc """
Returns the average roll of a `d`-sided dice rolled `n` times.
## Examples
iex> Dice.avg(10, 1000)
560
iex> Dice.avg("10d10")
560
"""
def avg(n, sides) when n > 1 and is_integer(n) and sides > 1 and is_integer(sides) do
sum(n,sides)
|> div(n)
end
def avg(str) when is_bitstring(str) do
[n, sides] = parse_string(str)
avg(n, sides)
end
defp parse_string(str) do
String.split(str, "d")
|> Enum.map(fn x -> String.to_integer(x) end)
end
end