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 =...