Sha256: 9f07188f1916586b6d579c863fd49ffeb5cd565cf6932d23425ff7c5a3789e07

Contents?: true

Size: 1.16 KB

Versions: 119

Compression:

Stored size: 1.16 KB

Contents

defmodule Dominoes do

  @type domino :: {1..6, 1..6}

  @doc """
  chain?/1 takes a list of domino stones and returns boolean indicating if it's
  possible to make a full chain
  """
  @spec chain?(dominoes :: [domino] | []) :: boolean
  def chain?([]), do: true
  def chain?([{a, a}]), do: true
  def chain?([{_a, _b}]), do: false
  def chain?(dominoes), do: [] !== chains(dominoes)

  def chains([first | rest]) do
    for combi <- permutations(rest), {:ok, result} <- chain(combi, [], first), do: result
  end

  defp chain([], [{a, _} | _] = acc, {_, a} = last), do: [{:ok, acc ++ [last]}]
  defp chain([], _acc, _last), do: [{:error, :ends_not_same}]

  defp chain([{b, c} = this | rest], acc, {_, b} = next) when b != c do
    chain(rest, acc ++ [next], this)
  end

  defp chain([{c, b} | rest], acc, {_, b} = next) when b != c  do
    chain(rest, acc ++ [next], {b, c})
  end

  defp chain([{b, b} = this | rest], acc, {_, b} = next)  do
    chain(rest, acc ++ [next], this)
  end

  defp chain(_a, _b, _c), do: [{:error, :no_followup}]

  defp permutations([]), do: [[]]
  defp permutations(list) do
    for h <- list, t <- permutations(list -- [h]), do: [h | t]
  end
end

Version data entries

119 entries across 119 versions & 1 rubygems

Version Path
trackler-2.2.1.109 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.108 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.107 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.106 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.105 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.104 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.103 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.102 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.101 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.100 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.99 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.98 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.97 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.96 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.95 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.94 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.93 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.92 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.91 tracks/elixir/exercises/dominoes/example.exs
trackler-2.2.1.90 tracks/elixir/exercises/dominoes/example.exs