CodeEval Real fake

Given in input a string representing a credit card number, four groups of four digits, separated by a blank, return "Real" or "Fake" accordingly to the checksum. Adding all ciphers together, multiplying by two the ones in even position, should give a multiple of ten.
This is the CodeEval problem #227 and I have solved it using Python 3 as implementation language.

Here is how I converted the samples in test cases:
def test_provided_1(self):
    self.assertEqual('Fake', solution('9999 9999 9999 9999'))

def test_provided_2(self):
    self.assertEqual('Real', solution('9999 9999 9999 9993'))

The solution, even though it is pretty short, could be logically divided in three parts.

Extracting data from the provided string
numbers = [int(i) for i in line if i.isdigit()]
I used a list comprehension to convert the input string in a list of integer. For each character in the line I check if it is a digit. If so, I convert it to integer and then I append it to the list.

Calculate the checksum
result = 0
for i in range(len(numbers)):
    result += numbers[i] if i%2 else numbers[i] * 2
I applied the rule. Looping on all numbers, add to the result the current value if it is in odd position, or its square value otherwise.

Return the result
return 'Fake' if result % 10 else 'Real'
It is natural for me using here a conditional expression, given my background as C programmer where a ternary operator (?:) would have done the job.
If the division by ten gives a remainder, aka result modulo ten is not zero, we have a fake credit card, otherwise the checksum is passed.

Solution accepted by CodeEval, so I pushed test case and python script to GitHub.

No comments:

Post a Comment