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 > 0 and is_integer(n) and sides > 1 and is_integer(sides) do Enum.to_list(1..n) |> Enum.map(fn _x -> :rand.uniform(n) end) end @doc """ Roll/1 is either implemented by passing in a string such as "10d10" or one integer for 1 dice rolled of `n` sides. Docs can't seperate them so they both show up here. """ def roll(str) when is_bitstring(str) do [n, sides] = parse_string(str) roll(n, sides) end def roll(sides) when is_integer(sides) do :rand.uniform(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 > 0 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 > 0 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 > 0 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 > 0 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