SIN Generator and checker
by Scott Kaye
JavaScript
// Improper, do not use
function IsValidSin1(sin) {
var newSin = "";
for (var i = 0; i < sin.length; i++) {
if (sin[i].match(/\d/)) {
newSin += sin[i];
}
}
if (newSin.toString().length < 9 || newSin.toString().length > 9) {
return false;
}
return true;
}
// Properly checks SIN
function IsValidSin2(sin) {
// Calculate check digit
var odd = ("" + (sin[1] * 2) + (sin[3] * 2) + (sin[5] * 2) + (sin[7] * 2)).split("")
.reduce(function (pv, cv) { return +pv + +cv; }, 0);
var even = ("" + sin[0] + sin[2] + sin[4] + sin[6]).split("")
.reduce(function (pv, cv) { return +pv + +cv; }, 0);
var checkDigit = ("" + (10 - +("" + Math.round(even + odd)).slice(-1))).slice(-1);
return sin.length === 9
&& sin == parseInt(sin, 10)
&& sin[8] == checkDigit;
}
const IsValidSin2Golfed = a => {
var b=(""+2*a[1]+2*a[3]+2*a[5]+2*a[7]).split``.reduce((a,b)=>+a+ +b,0),
c=(""+a[0]+a[2]+a[4]+a[6]).split``.reduce((a,b)=>+a+ +b,0),
b=(""+(10-+(""+Math.round(c+b)).slice(-1))).slice(-1);
return 9===a.length&&a==+a&&a[8]==b;
}
/*
const IsValidSin2Golfed = s => {
let o=[...""+s[1]*2+s[3]*2+s[5]*2+s[7]*2].reduce((a,b)=>+a+ +b,0),
e=[...""+s[0]+s[2]+s[4]+s[6]].reduce((a,b)=>+a+ +b,0),
c=(""+(10-+(""+Math.round(e+o)).slice(-1))).slice(-1);
return s.length===9&&s==+s&&s[8]==c;
}
*/
const IsValidSin2UltraGolfed =s=>s.length===9&&s==+s&&s[8]==(""+(10-+(""+Math.round([...""+s[0]+s[2]+s[4]+s[6]].reduce((a,b)=>+a+ +b,0)+[...""+s[1]*2+s[3]*2+s[5]*2+s[7]*2].reduce((a,b)=>+a+ +b,0))).slice(-1))).slice(-1)
const IsValidSin2UltraGolfed2=s=>s.length===9&&s==+s&&s[8]==(""+(10-+(""+Math.round([...s].reduce((a,b,i)=>(i<7&&i%2)?0:+a+ +b,0)+[...""+s[1]*2+s[3]*2+s[5]*2+s[7]*2].reduce((a,b)=>+a+ +b,0))).slice(-1))).slice(-1)
console.clear();
var valid1 = IsValidSin1("783359896");
var invalid1 = IsValidSin1("783359892");
var valid2 = IsValidSin2("783359896");
var invalid2 = IsValidSin2("783359892");
var valid3 =...