112 lines
2.9 KiB
Markdown
112 lines
2.9 KiB
Markdown
# Luhn
|
|
|
|
Given a number determine whether or not it is valid per the Luhn formula.
|
|
|
|
The [Luhn algorithm](https://en.wikipedia.org/wiki/Luhn_algorithm) is
|
|
a simple checksum formula used to validate a variety of identification
|
|
numbers, such as credit card numbers and Canadian Social Insurance
|
|
Numbers.
|
|
|
|
The task is to check if a given string is valid.
|
|
|
|
Validating a Number
|
|
------
|
|
|
|
Strings of length 1 or less are not valid. Spaces are allowed in the input,
|
|
but they should be stripped before checking. All other non-digit characters
|
|
are disallowed.
|
|
|
|
## Example 1: valid credit card number
|
|
|
|
```text
|
|
4539 1488 0343 6467
|
|
```
|
|
|
|
The first step of the Luhn algorithm is to double every second digit,
|
|
starting from the right. We will be doubling
|
|
|
|
```text
|
|
4_3_ 1_8_ 0_4_ 6_6_
|
|
```
|
|
|
|
If doubling the number results in a number greater than 9 then subtract 9
|
|
from the product. The results of our doubling:
|
|
|
|
```text
|
|
8569 2478 0383 3437
|
|
```
|
|
|
|
Then sum all of the digits:
|
|
|
|
```text
|
|
8+5+6+9+2+4+7+8+0+3+8+3+3+4+3+7 = 80
|
|
```
|
|
|
|
If the sum is evenly divisible by 10, then the number is valid. This number is valid!
|
|
|
|
## Example 2: invalid credit card number
|
|
|
|
```text
|
|
8273 1232 7352 0569
|
|
```
|
|
|
|
Double the second digits, starting from the right
|
|
|
|
```text
|
|
7253 2262 5312 0539
|
|
```
|
|
|
|
Sum the digits
|
|
|
|
```text
|
|
7+2+5+3+2+2+6+2+5+3+1+2+0+5+3+9 = 57
|
|
```
|
|
|
|
57 is not evenly divisible by 10, so this number is not valid.
|
|
|
|
|
|
Run the tests with:
|
|
|
|
```bash
|
|
bats luhn_test.sh
|
|
```
|
|
|
|
After the first test(s) pass, continue by commenting out or removing the
|
|
`[[ $BATS_RUN_SKIPPED == true ]] || skip`
|
|
annotations prepending other tests.
|
|
|
|
To run all tests, including the ones with `skip` annotations, run:
|
|
|
|
```bash
|
|
BATS_RUN_SKIPPED=true bats luhn_test.sh
|
|
```
|
|
|
|
## Source
|
|
|
|
The Luhn Algorithm on Wikipedia [http://en.wikipedia.org/wiki/Luhn_algorithm](http://en.wikipedia.org/wiki/Luhn_algorithm)
|
|
|
|
|
|
## External utilities
|
|
`Bash` is a language to write "scripts" -- programs that can call
|
|
external tools, such as
|
|
[`sed`](https://www.gnu.org/software/sed/),
|
|
[`awk`](https://www.gnu.org/software/gawk/),
|
|
[`date`](https://www.gnu.org/software/coreutils/manual/html_node/date-invocation.html)
|
|
and even programs written in other programming languages,
|
|
like [`Python`](https://www.python.org/).
|
|
This track does not restrict the usage of these utilities, and as long
|
|
as your solution is portable between systems and does not require
|
|
installation of third party applications, feel free to use them to solve
|
|
the exercise.
|
|
|
|
For an extra challenge, if you would like to have a better understanding
|
|
of the language, try to re-implement the solution in pure `Bash`,
|
|
without using any external tools. Note that there are some types of
|
|
problems that bash cannot solve, such as performing floating point
|
|
arithmetic and manipulating dates: for those, you must call out to an
|
|
external tool.
|
|
|
|
## Submitting Incomplete Solutions
|
|
It's possible to submit an incomplete solution so you can see how others
|
|
have completed the exercise.
|