From 903d4cb99a132769118202e2d030bf0b06275e86 Mon Sep 17 00:00:00 2001 From: Alex Klymenko Date: Mon, 7 Jul 2025 23:21:48 +0200 Subject: [PATCH 1/2] refactor: improve PythagoreanTriple logic and add parameterized tests --- .../maths/PythagoreanTriple.java | 45 +++++++++++-------- .../maths/PythagoreanTripleTest.java | 37 ++++++++++----- 2 files changed, 52 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/PythagoreanTriple.java b/src/main/java/com/thealgorithms/maths/PythagoreanTriple.java index f535e9e6929b..2780b113d904 100644 --- a/src/main/java/com/thealgorithms/maths/PythagoreanTriple.java +++ b/src/main/java/com/thealgorithms/maths/PythagoreanTriple.java @@ -1,36 +1,43 @@ package com.thealgorithms.maths; /** - * https://en.wikipedia.org/wiki/Pythagorean_triple + * Utility class to check if three integers form a Pythagorean triple. + * A Pythagorean triple consists of three positive integers a, b, and c, + * such that a² + b² = c². + * + * Common examples: + * - (3, 4, 5) + * - (5, 12, 13) + * + * Reference: https://en.wikipedia.org/wiki/Pythagorean_triple */ public final class PythagoreanTriple { - private PythagoreanTriple() { - } - public static void main(String[] args) { - assert isPythagTriple(3, 4, 5); - assert isPythagTriple(5, 12, 13); - assert isPythagTriple(6, 8, 10); - assert !isPythagTriple(10, 20, 30); - assert !isPythagTriple(6, 8, 100); - assert !isPythagTriple(-1, -1, 1); + private PythagoreanTriple() { } /** - * Check if a,b,c are a Pythagorean Triple + * Checks whether three integers form a Pythagorean triple. + * The order of parameters does not matter. * - * @param a x/y component length of a right triangle - * @param b y/x component length of a right triangle - * @param c hypotenuse length of a right triangle - * @return boolean true if a, b, c satisfy the Pythagorean theorem, - * otherwise - * false + * @param a one side length + * @param b another side length + * @param c another side length + * @return {@code true} if (a, b, c) can form a Pythagorean triple, otherwise {@code false} */ public static boolean isPythagTriple(int a, int b, int c) { if (a <= 0 || b <= 0 || c <= 0) { return false; - } else { - return (a * a) + (b * b) == (c * c); } + + // Sort the sides so the largest is treated as hypotenuse + int[] sides = {a, b, c}; + java.util.Arrays.sort(sides); + + int x = sides[0]; + int y = sides[1]; + int hypotenuse = sides[2]; + + return x * x + y * y == hypotenuse * hypotenuse; } } diff --git a/src/test/java/com/thealgorithms/maths/PythagoreanTripleTest.java b/src/test/java/com/thealgorithms/maths/PythagoreanTripleTest.java index 13ea58155dec..9e17fdc6e18d 100644 --- a/src/test/java/com/thealgorithms/maths/PythagoreanTripleTest.java +++ b/src/test/java/com/thealgorithms/maths/PythagoreanTripleTest.java @@ -1,22 +1,37 @@ package com.thealgorithms.maths; -import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + public class PythagoreanTripleTest { + @ParameterizedTest + @CsvSource({ + "3, 4, 5, true", + "6, 8, 10, true", + "9, 12, 15, true", + "12, 16, 20, true", + "15, 20, 25, true", + "18, 24, 30, true", + "5, 20, 30, false", + "6, 8, 100, false", + "-2, -2, 2, false", + "0, 0, 0, false", + "5, 5, 5, false" + }) + void testIsPythagoreanTriple(int a, int b, int c, boolean expected) { + assertEquals(expected, PythagoreanTriple.isPythagTriple(a, b, c)); + } + @Test - public void testPythagoreanTriple() { - assertTrue(PythagoreanTriple.isPythagTriple(3, 4, 5)); - assertTrue(PythagoreanTriple.isPythagTriple(6, 8, 10)); - assertTrue(PythagoreanTriple.isPythagTriple(9, 12, 15)); - assertTrue(PythagoreanTriple.isPythagTriple(12, 16, 20)); - assertTrue(PythagoreanTriple.isPythagTriple(15, 20, 25)); - assertTrue(PythagoreanTriple.isPythagTriple(18, 24, 30)); - assertFalse(PythagoreanTriple.isPythagTriple(5, 20, 30)); - assertFalse(PythagoreanTriple.isPythagTriple(6, 8, 100)); - assertFalse(PythagoreanTriple.isPythagTriple(-2, -2, 2)); + void testUnorderedInputStillValid() { + // Should still detect Pythagorean triples regardless of argument order + assertTrue(PythagoreanTriple.isPythagTriple(5, 3, 4)); + assertTrue(PythagoreanTriple.isPythagTriple(13, 12, 5)); } } From ccf39ef2436e65445fca83ae344ff51d4deab4a6 Mon Sep 17 00:00:00 2001 From: Alex Klymenko Date: Mon, 7 Jul 2025 23:23:55 +0200 Subject: [PATCH 2/2] refactor: fix clang format issues --- .../maths/PythagoreanTripleTest.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/test/java/com/thealgorithms/maths/PythagoreanTripleTest.java b/src/test/java/com/thealgorithms/maths/PythagoreanTripleTest.java index 9e17fdc6e18d..75219dc47b47 100644 --- a/src/test/java/com/thealgorithms/maths/PythagoreanTripleTest.java +++ b/src/test/java/com/thealgorithms/maths/PythagoreanTripleTest.java @@ -4,26 +4,13 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; - import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; public class PythagoreanTripleTest { @ParameterizedTest - @CsvSource({ - "3, 4, 5, true", - "6, 8, 10, true", - "9, 12, 15, true", - "12, 16, 20, true", - "15, 20, 25, true", - "18, 24, 30, true", - "5, 20, 30, false", - "6, 8, 100, false", - "-2, -2, 2, false", - "0, 0, 0, false", - "5, 5, 5, false" - }) + @CsvSource({"3, 4, 5, true", "6, 8, 10, true", "9, 12, 15, true", "12, 16, 20, true", "15, 20, 25, true", "18, 24, 30, true", "5, 20, 30, false", "6, 8, 100, false", "-2, -2, 2, false", "0, 0, 0, false", "5, 5, 5, false"}) void testIsPythagoreanTriple(int a, int b, int c, boolean expected) { assertEquals(expected, PythagoreanTriple.isPythagTriple(a, b, c)); }