Skip to content

Instantly share code, notes, and snippets.

@LordGhostX
Created May 3, 2021 23:19
Show Gist options
  • Save LordGhostX/ae29c6cee8e3ef5fccf5b613a6200887 to your computer and use it in GitHub Desktop.
Save LordGhostX/ae29c6cee8e3ef5fccf5b613a6200887 to your computer and use it in GitHub Desktop.
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"));
}
}
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