From 79f1cc52b311d04671bbc0e1a4e2ec3ea974bb08 Mon Sep 17 00:00:00 2001 From: Thomas Fabre <tfabre@takima.fr> Date: Fri, 23 Jun 2023 14:10:05 +0200 Subject: [PATCH] Refactor pair with Roll --- src/main/java/io/takima/Roll.java | 12 ++++++++++++ src/main/java/io/takima/Yatzy.java | 27 ++++++++++---------------- src/test/java/io/takima/YatzyTest.java | 6 +++--- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/main/java/io/takima/Roll.java b/src/main/java/io/takima/Roll.java index 3e38468..305a467 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 a370701..20a86b0 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 f2bb57e..dd3857e 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))) ); } -- GitLab