From 392344d5d85b0d32f87f13b38f93a10224709adf Mon Sep 17 00:00:00 2001 From: simonLab Date: Fri, 23 Jun 2017 16:51:15 +0100 Subject: [PATCH 1/3] add strait_flush, flush , highcard --- lib/dojo/hand.ex | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/lib/dojo/hand.ex b/lib/dojo/hand.ex index 58260f2..6cef561 100644 --- a/lib/dojo/hand.ex +++ b/lib/dojo/hand.ex @@ -5,5 +5,50 @@ defmodule Dojo.Hand do evaluate(cards) end - defp evaluate(_), do: :high_card + defp evaluate(cards) do + cond do + is_straight_flush?(cards) -> + :straight_flush + is_flush?(cards) -> + :flush + true -> + :high_card + end + + end + + defp is_straight_flush?(cards) do + min = cards + |> Enum.sort(&(&1.rank <= &2.rank)) + |> List.first() + |> Map.get(:rank) + + list = Enum.to_list min..(min + 4) + result = cards + |> Enum.map(&(&1.rank in list)) + |> Enum.reduce(true, fn(x, acc) -> x && acc end) + + result + end + + defp is_flush?(cards) do + kind = cards + |> List.first() + |> Map.get(:suit) + + cards + |> Enum.map(&(&1.suit == kind)) + |> Enum.reduce(true, fn(x, acc) -> x && acc end) + end end + + +# cards = [ +# %Card{rank: 10, suit: :hearts}, +# %Card{rank: 11, suit: :hearts}, +# %Card{rank: 12, suit: :hearts}, +# %Card{rank: 13, suit: :hearts}, +# %Card{rank: 14, suit: :hearts} +# ] +# +# assert Hand.score(cards) == :straight_flush From 297e3e4d36facc0e9c6515adb10f9a4b95821d49 Mon Sep 17 00:00:00 2001 From: simonLab Date: Fri, 23 Jun 2017 17:00:26 +0100 Subject: [PATCH 2/3] add royal flush --- lib/dojo/hand.ex | 15 ++++++++++++--- test/dojo/hand_test.exs | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/dojo/hand.ex b/lib/dojo/hand.ex index 6cef561..3c233a1 100644 --- a/lib/dojo/hand.ex +++ b/lib/dojo/hand.ex @@ -7,6 +7,8 @@ defmodule Dojo.Hand do defp evaluate(cards) do cond do + is_royal_flush?(cards) -> + :royal_flush is_straight_flush?(cards) -> :straight_flush is_flush?(cards) -> @@ -17,18 +19,25 @@ defmodule Dojo.Hand do end - defp is_straight_flush?(cards) do - min = cards + defp min_rank(cards) do + cards |> Enum.sort(&(&1.rank <= &2.rank)) |> List.first() |> Map.get(:rank) + end + defp is_straight_flush?(cards) do + min = min_rank(cards) list = Enum.to_list min..(min + 4) result = cards |> Enum.map(&(&1.rank in list)) |> Enum.reduce(true, fn(x, acc) -> x && acc end) - result + result && is_flush?(cards) + end + + defp is_royal_flush?(cards) do + is_straight_flush?(cards) && (min_rank(cards) == 10) end defp is_flush?(cards) do diff --git a/test/dojo/hand_test.exs b/test/dojo/hand_test.exs index 5188ab3..9f88175 100644 --- a/test/dojo/hand_test.exs +++ b/test/dojo/hand_test.exs @@ -13,7 +13,7 @@ defmodule Dojo.HandTest do %Card{rank: 14, suit: :hearts} ] - assert Hand.score(cards) == :straight_flush + assert Hand.score(cards) == :royal_flush end test "evaluates flush of hearts" do From f3e7d93e105ba773dfa37d0115d7779496938cea Mon Sep 17 00:00:00 2001 From: simonLab Date: Fri, 23 Jun 2017 17:22:17 +0100 Subject: [PATCH 3/3] add pair --- lib/dojo/hand.ex | 33 +++++++++++++++++++++------------ test/dojo/hand_test.exs | 25 +++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/lib/dojo/hand.ex b/lib/dojo/hand.ex index 3c233a1..32bf40c 100644 --- a/lib/dojo/hand.ex +++ b/lib/dojo/hand.ex @@ -13,6 +13,10 @@ defmodule Dojo.Hand do :straight_flush is_flush?(cards) -> :flush + is_straight?(cards) -> + :straight + is_pair?(cards) -> + :pair true -> :high_card end @@ -26,14 +30,16 @@ defmodule Dojo.Hand do |> Map.get(:rank) end - defp is_straight_flush?(cards) do + defp is_straight?(cards) do min = min_rank(cards) list = Enum.to_list min..(min + 4) result = cards |> Enum.map(&(&1.rank in list)) |> Enum.reduce(true, fn(x, acc) -> x && acc end) + end - result && is_flush?(cards) + defp is_straight_flush?(cards) do + is_straight?(cards) && is_flush?(cards) end defp is_royal_flush?(cards) do @@ -49,15 +55,18 @@ defmodule Dojo.Hand do |> Enum.map(&(&1.suit == kind)) |> Enum.reduce(true, fn(x, acc) -> x && acc end) end -end + defp cardinality(cards) do + ranks = cards + |> Enum.map(&(&1.rank)) -# cards = [ -# %Card{rank: 10, suit: :hearts}, -# %Card{rank: 11, suit: :hearts}, -# %Card{rank: 12, suit: :hearts}, -# %Card{rank: 13, suit: :hearts}, -# %Card{rank: 14, suit: :hearts} -# ] -# -# assert Hand.score(cards) == :straight_flush + numbers = ranks + |> Enum.group_by(fn(x) -> x end) + |> Enum.map(fn({_, val}) -> length val end) + end + + defp is_pair?(cards) do + numbers = cardinality(cards) + 2 in numbers + end +end diff --git a/test/dojo/hand_test.exs b/test/dojo/hand_test.exs index 9f88175..3f78503 100644 --- a/test/dojo/hand_test.exs +++ b/test/dojo/hand_test.exs @@ -63,4 +63,29 @@ defmodule Dojo.HandTest do assert Hand.score(cards) == :high_card end + + test "evaluates straight cards" do + cards = [ + %Card{rank: 2, suit: :spades}, + %Card{rank: 3, suit: :hearts}, + %Card{rank: 4, suit: :diamonds}, + %Card{rank: 5, suit: :spades}, + %Card{rank: 6, suit: :spades} + ] + + assert Hand.score(cards) == :straight + end + + + test "evaluates pair cards" do + cards = [ + %Card{rank: 2, suit: :spades}, + %Card{rank: 2, suit: :hearts}, + %Card{rank: 1, suit: :diamonds}, + %Card{rank: 5, suit: :spades}, + %Card{rank: 6, suit: :spades} + ] + + assert Hand.score(cards) == :pair + end end