Calculates the checksum of a given input of numbers using the Luhn Algorithm
75bytes
Calculates the checksum of a given input of numbers using the Luhn Algorithm
75bytes
function( | |
a, // input number sequence as a string | |
b, // placeholder | |
c, // --||-- | |
d){ // --||-- | |
c=0; | |
// traverse the input and multiply every other digit | |
for(b in a) | |
d=a[b],c+= | |
b%2?+d // every other digit is just used straight away | |
:d*2%10|d/5; // digits above 5 will result in double digits when | |
// multiplied with 2 and should be added together | |
// | |
// 5*2 = 10 -> 1+0 = 1 | |
// 6*2 = 12 -> 1+2 = 3 | |
// 7*2 = 14 -> 1+4 = 5 | |
// 8*2 = 16 -> 1+6 = 7 | |
// 9*2 = 18 -> 1+8 = 9 | |
// | |
// digits below 5 are just multiplied by 2 | |
// and this, is magic | |
// multiply the sum by 9 and return the last digit | |
return c*9%10 | |
} |
function(a,b,c,d){c=0;for(b in a)d=a[b],c+=b%2?+d:d*2%10|d/5;return c*9%10} |
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
Version 2, December 2004 | |
Copyright (C) 2013 Johan Hillerström <https://github.com/hillerstorm> | |
Everyone is permitted to copy and distribute verbatim or modified | |
copies of this license document, and changing it is allowed as long | |
as the name is changed. | |
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |
0. You just DO WHAT THE FUCK YOU WANT TO. |
{ | |
"name": "luhnAlgorithm", | |
"description": "Calculates a checksum using the Luhn algorithm.", | |
"keywords": [ | |
"luhn", | |
"algorithm", | |
"formula", | |
"checksum" | |
] | |
} |
<!DOCTYPE html> | |
<title>Foo</title> | |
<div>Expected value: <b>6</b></div> | |
<div>Actual value: <b id="ret"></b></div> | |
<script> | |
var luhn = function(a,b,c,d){c=0;for(b in a)d=a[b],c+=b%2?+d:d*2%10|d/5;return c*9%10} | |
document.getElementById('ret').innerHTML = luhn('811218987') | |
</script> |
It was operator precedence, but on the comparison rather than the calculation.
function(a,b,c,d){c=0;for(b in a)d=a[b],c+=b%2?+d:d*2%10+(d>4);return c*9%10}
I'll try to find a smaller version without the brackets.
A little boolean operator goes a long way :-)
function(a,b,c,d){c=0;for(b in a)d=a[b],c+=b%2?+d:d*2%10|d/5;return c*9%10}
:D
If that also failed, then the modulo has higher precedence than the multiplication and the latter would require brackets.