Created
May 3, 2021 23:19
-
-
Save LordGhostX/ae29c6cee8e3ef5fccf5b613a6200887 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Luhn { | |
public static boolean isValid(String number) { | |
boolean isCardTypeValid = prefixMatched(number, "4") || prefixMatched(number, "5") || prefixMatched(number, "37") || prefixMatched(number, "6"); | |
if (!isCardTypeValid) { | |
return false; | |
} | |
int evenPlaceSum = sumOfDoubleEvenPlace(number); | |
int oddPlaceSum = sumOfOddPlace(number); | |
int totalSum = evenPlaceSum + oddPlaceSum; | |
return totalSum % 10 == 0; | |
} | |
public static int sumOfDoubleEvenPlace(String number) { | |
StringBuilder reversedNumberBuilder = new StringBuilder(); | |
for (int i = getSize(number) - 1; i >= 0; i--) { | |
reversedNumberBuilder.append(number.charAt(i)); | |
} | |
String reversedNumber = reversedNumberBuilder.toString(); | |
int doubleEvenPlaceSum = 0; | |
for (int i = 1; i < getSize(number); i+=2) { | |
doubleEvenPlaceSum += getDigit(((int) reversedNumber.charAt(i) - 48) * 2); | |
} | |
return doubleEvenPlaceSum; | |
} | |
public static int sumOfOddPlace(String number) { | |
int numberSum = 0; | |
for (int i = 1; i < getSize(number); i+=2) { | |
numberSum += (int) number.charAt(i) - 48; | |
} | |
return numberSum; | |
} | |
public static int getDigit(int number) { | |
if (number < 10) { | |
return number; | |
} | |
else { | |
return (number / 10) + (number % 10); | |
} | |
} | |
public static int getSize(String d) { | |
return d.length(); | |
} | |
public static boolean prefixMatched(String number, String d) { | |
return getPrefix(number, getSize(d)).equals(d); | |
} | |
public static String getPrefix(String number, int k) { | |
StringBuilder prefix = new StringBuilder(); | |
for (int i = 0; i < Math.min(getSize(number), k); i++) { | |
prefix.append(number.charAt(i)); | |
} | |
return prefix.toString(); | |
} | |
public static void main(String[] args) { | |
System.out.println(isValid("4388576018402626")); | |
System.out.println(isValid("4388576018410707")); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def isValid(number): | |
is_card_type_valid = prefixMatched(number, "4") or prefixMatched( | |
number, "5") or prefixMatched(number, "37") or prefixMatched(number, "6") | |
if not is_card_type_valid: | |
return False | |
even_place_sum = sumOfDoubleEvenPlace(number) | |
odd_place_sum = sumOfOddPlace(number) | |
total_sum = even_place_sum + odd_place_sum | |
return total_sum % 10 == 0 | |
def sumOfDoubleEvenPlace(number): | |
number = number[::-1] | |
double_even_place_sum = 0 | |
for i in range(1, getSize(number), 2): | |
double_even_place_sum += getDigit(int(number[i]) * 2) | |
return double_even_place_sum | |
def getDigit(number): | |
if number < 10: | |
return number | |
else: | |
return (number // 10) + (number % 10) | |
def sumOfOddPlace(number): | |
number_sum = 0 | |
for i in range(1, getSize(number), 2): | |
number_sum += int(number[i]) | |
return number_sum | |
def prefixMatched(number, d): | |
return getPrefix(number, getSize(d)) == d | |
def getSize(d): | |
return len(d) | |
def getPrefix(number, k): | |
return number[:k] | |
print(isValid("4388576018402626")) | |
print(isValid("4388576018410707")) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment