lots of exercises in java... from https://github.com/exercism/java

example.java 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import java.util.stream.IntStream;
  2. public class Luhn {
  3. private long number;
  4. private long checkDigit;
  5. private int[] addends;
  6. private int checkSum;
  7. private boolean isValid;
  8. public Luhn(long number) {
  9. this.number = number;
  10. this.checkDigit = number % 10;
  11. this.addends = generateAddends();
  12. this.checkSum = IntStream.of(addends).sum();
  13. this.isValid = checkSum % 10 == 0;
  14. }
  15. public long getCheckDigit() {
  16. return checkDigit;
  17. }
  18. public int[] getAddends() {
  19. return addends;
  20. }
  21. public int getCheckSum() {
  22. return checkSum;
  23. }
  24. public boolean isValid() {
  25. return isValid;
  26. }
  27. private int[] generateAddends() {
  28. int[] reversedIntArray = splitToReversedIntArray(number);
  29. for (int index = 1; index < reversedIntArray.length; index++) {
  30. if (index % 2 != 0) {
  31. reversedIntArray[index] = convertDigitForAddend(reversedIntArray[index]);
  32. }
  33. }
  34. return reverseIntArray(reversedIntArray);
  35. }
  36. private static int[] splitToReversedIntArray(long value) {
  37. int[] ints = new StringBuilder(Long.toString(value))
  38. .reverse()
  39. .toString()
  40. .chars()
  41. .map(x -> Character.getNumericValue(x))
  42. .toArray();
  43. return ints;
  44. }
  45. private static int convertDigitForAddend(int value) {
  46. int doubled = value * 2;
  47. return doubled < 10 ? doubled : doubled - 9;
  48. }
  49. public static long create(long number) {
  50. long zeroCheckDigitNumber = number * 10;
  51. Luhn luhn = new Luhn(zeroCheckDigitNumber);
  52. if (luhn.isValid()) {
  53. return zeroCheckDigitNumber;
  54. }
  55. return zeroCheckDigitNumber + createCheckDigit(luhn.getCheckSum());
  56. }
  57. private static int createCheckDigit(int value) {
  58. int nearestTen = (int) (Math.ceil(value / 10.0) * 10);
  59. return nearestTen - value;
  60. }
  61. private static int[] reverseIntArray(int[] array) {
  62. int[] reversed = new int[array.length];
  63. for (int index = 0; index < array.length; index++) {
  64. reversed[index] = array[array.length - 1 - index];
  65. }
  66. return reversed;
  67. }
  68. }