diff --git a/src/main/java/io/takima/Roll.java b/src/main/java/io/takima/Roll.java index 3e38468143d71a666ee8ab4f79f8608b82e8780e..305a4673cf1419827920085c10b83a85c0b5c3d9 100644 --- a/src/main/java/io/takima/Roll.java +++ b/src/main/java/io/takima/Roll.java @@ -1,6 +1,10 @@ package io.takima; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.IntStream; +import java.util.stream.Stream; public record Roll(int d1, int d2, int d3, int d4, int d5) { public static Roll roll(int d1, int d2, int d3, int d4, int d5) { @@ -10,4 +14,12 @@ public record Roll(int d1, int d2, int d3, int d4, int d5) { public IntStream toStream() { return IntStream.of(d1, d2, d3, d4, d5); } + + public Stream<Map.Entry<Integer, Long>> countByDiceValueStream() { + return toStream() + .boxed() + .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) + .entrySet() + .stream(); + } } diff --git a/src/main/java/io/takima/Yatzy.java b/src/main/java/io/takima/Yatzy.java index a3707012f8f247eba34492898928cf4d0a57ab57..20a86b0d074fd44cd92832266b2b68775c004138 100644 --- a/src/main/java/io/takima/Yatzy.java +++ b/src/main/java/io/takima/Yatzy.java @@ -1,10 +1,10 @@ package io.takima; -public final class Yatzy { - private final int[] dice; +import java.util.Map; - public Yatzy(int d1, int d2, int d3, int d4, int d5) { - dice = new int[] { d1, d2, d3, d4, d5 }; +public final class Yatzy { + private Yatzy() { + // This his a utility class which only implements static methods } public static int chance(Roll roll) { @@ -46,19 +46,12 @@ public final class Yatzy { return sumDiceThatMatchWithValue(roll, 6); } - public static int pair(int d1, int d2, int d3, int d4, int d5) { - int[] counts = new int[6]; - counts[d1 - 1]++; - counts[d2 - 1]++; - counts[d3 - 1]++; - counts[d4 - 1]++; - counts[d5 - 1]++; - for (int at = 0; at != 6; at++) { - if (counts[6 - at - 1] >= 2) { - return (6 - at) * 2; - } - } - return 0; + public static int pair(Roll roll) { + return roll.countByDiceValueStream() + .filter(entry -> entry.getValue() >= 2) + .max(Map.Entry.comparingByKey()) + .map(entry -> entry.getKey() * 2) + .orElse(0); } public static int twoPair(int d1, int d2, int d3, int d4, int d5) { diff --git a/src/test/java/io/takima/YatzyTest.java b/src/test/java/io/takima/YatzyTest.java index f2bb57eb03244b261e6fde8ba8c0be914ef40d6c..dd3857e8beabb9aa79705a1d8d92afa31829ff19 100644 --- a/src/test/java/io/takima/YatzyTest.java +++ b/src/test/java/io/takima/YatzyTest.java @@ -84,9 +84,9 @@ class YatzyTest { @Test void pairShouldSumTheTwoHighestMatchingPair() { assertAll( - () -> assertEquals(6, Yatzy.pair(3, 4, 3, 5, 6)), - () -> assertEquals(10, Yatzy.pair(5, 3, 3, 3, 5)), - () -> assertEquals(12, Yatzy.pair(5, 3, 6, 6, 5)) + () -> assertEquals(6, Yatzy.pair(roll(3, 4, 3, 5, 6))), + () -> assertEquals(10, Yatzy.pair(roll(5, 3, 3, 3, 5))), + () -> assertEquals(12, Yatzy.pair(roll(5, 3, 6, 6, 5))) ); }