From 14136b4b9e9a13dc573a2fce881d8ee1fe932515 Mon Sep 17 00:00:00 2001 From: Ivo Batistela Date: Mon, 21 May 2018 22:58:30 -0300 Subject: [PATCH] refactoring problem 55 using clean code thoughts --- .../problems/LychrelNumberProverUntil.java | 80 +++++++++++++++++++ .../java/clean/code/problems/Problem55.java | 58 -------------- .../LychrelNumberProverUntilTest.java | 27 +++++++ 3 files changed, 107 insertions(+), 58 deletions(-) create mode 100644 src/main/java/clean/code/problems/LychrelNumberProverUntil.java delete mode 100644 src/main/java/clean/code/problems/Problem55.java create mode 100644 src/test/java/clean/code/problems/LychrelNumberProverUntilTest.java diff --git a/src/main/java/clean/code/problems/LychrelNumberProverUntil.java b/src/main/java/clean/code/problems/LychrelNumberProverUntil.java new file mode 100644 index 0000000..4a2e0d6 --- /dev/null +++ b/src/main/java/clean/code/problems/LychrelNumberProverUntil.java @@ -0,0 +1,80 @@ +package clean.code.problems; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; + +public class LychrelNumberProverUntil +{ + private int largestNumberToProve; + + public LychrelNumberProverUntil(int largestNumberToProve) + { + this.largestNumberToProve = largestNumberToProve; + } + + public static void main(String[] args) + { + int lychrelNumberCounter = new LychrelNumberProverUntil(10000).countLychrelNumbers(); + System.out.println("How many? " + lychrelNumberCounter); + } + + public int countLychrelNumbers() + { + List lychrelNumbers = new ArrayList(); + + for (int i = 1; i <= largestNumberToProve; i++) + { + boolean isLychrelNumber = sumItsReversedValueUntilProveItsLychrel(BigInteger.valueOf(i)); + if (isLychrelNumber) + { + lychrelNumbers.add(BigInteger.valueOf(i)); + } + } + + return lychrelNumbers.size(); + } + + private boolean sumItsReversedValueUntilProveItsLychrel(BigInteger numberToVerify) + { + for (int i = 0; i < 50; i++) + { + BigInteger sumWithReversedValue = sumWithItsReversedValue(numberToVerify); + if (isPalindrome(sumWithReversedValue)) + { + return false; + } + else + { + numberToVerify = sumWithReversedValue; + } + } + + return true; + } + + private BigInteger sumWithItsReversedValue(BigInteger numberToVerify) + { + BigInteger reversedNumber = reverseNumber(numberToVerify); + BigInteger reversedSum = numberToVerify.add(reversedNumber); + + return reversedSum; + } + + private boolean isPalindrome(BigInteger number) + { + String numberAsString = String.valueOf(number); + String numberAsReversedString = String.valueOf(reverseNumber(number)); + + return numberAsReversedString.equals(numberAsString); + } + + private BigInteger reverseNumber(BigInteger toReverse) + { + String resultString = String.valueOf(toReverse); + String resultReverse = new StringBuffer(resultString).reverse().toString(); + + return new BigInteger(resultReverse); + } + +} diff --git a/src/main/java/clean/code/problems/Problem55.java b/src/main/java/clean/code/problems/Problem55.java deleted file mode 100644 index f3d1fa4..0000000 --- a/src/main/java/clean/code/problems/Problem55.java +++ /dev/null @@ -1,58 +0,0 @@ -package clean.code.problems; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.List; - -public class Problem55 { - - private static int iterations = 0; - private static boolean isLychrelNumber = false; - - public static void main(String[] args) { - lychrelNumbers(); - } - - private static void lychrelNumbers() { - List lychrelNumbers = new ArrayList(); - - int largestNumber = 10000; - for (int i = 1; i <= largestNumber; i++) { - iterations = 0; - isLychrelNumber = false; - isLychrelNumber(BigInteger.valueOf(i)); - if(isLychrelNumber){ - lychrelNumbers.add(BigInteger.valueOf(i)); - } - } - - System.out.println("How many? "+lychrelNumbers.size()); - - } - - private static void isLychrelNumber(BigInteger numberToVerify) { - iterations++; - if(iterations > 50){ - isLychrelNumber = true; - } - BigInteger reverseNumber = reverseNumber(numberToVerify); - BigInteger result = numberToVerify.add(reverseNumber); - if(!isPalindrome(result) && !isLychrelNumber){ - isLychrelNumber(result); - } - } - - - private static boolean isPalindrome(BigInteger result) { - String resultString = String.valueOf(result); - String resultReverse = String.valueOf(reverseNumber(result)); - return resultReverse.equals(resultString); - } - - private static BigInteger reverseNumber(BigInteger toReverse){ - String resultString = String.valueOf(toReverse); - String resultReverse = new StringBuffer(resultString).reverse().toString(); - return new BigInteger(resultReverse); - } - -} diff --git a/src/test/java/clean/code/problems/LychrelNumberProverUntilTest.java b/src/test/java/clean/code/problems/LychrelNumberProverUntilTest.java new file mode 100644 index 0000000..f7aecc2 --- /dev/null +++ b/src/test/java/clean/code/problems/LychrelNumberProverUntilTest.java @@ -0,0 +1,27 @@ +package clean.code.problems; + +import static org.junit.Assert.*; + +import org.junit.Test; + + +public class LychrelNumberProverUntilTest +{ + + @Test + public void sholdCount249LychrelNumbersUntil10000() + { + LychrelNumberProverUntil lychrelNumbersDiscover = new LychrelNumberProverUntil(10000); + int lychrelNumbersCounter = lychrelNumbersDiscover.countLychrelNumbers(); + assertEquals(lychrelNumbersCounter, 249); + } + + @Test + public void sholdCount13LychrelNumbersUntil1000() + { + LychrelNumberProverUntil lychrelNumbersDiscover = new LychrelNumberProverUntil(1000); + int lychrelNumbersCounter = lychrelNumbersDiscover.countLychrelNumbers(); + assertEquals(lychrelNumbersCounter, 13); + } + +}