Skip to content

Instantly share code, notes, and snippets.

@etienne-dldc
Created July 17, 2017 19:23
Show Gist options
  • Save etienne-dldc/f9cfdcb41c75788f4f1dcd9defd95836 to your computer and use it in GitHub Desktop.
Save etienne-dldc/f9cfdcb41c75788f4f1dcd9defd95836 to your computer and use it in GitHub Desktop.
Self Descriptive Number in Javascript
for (var i = 0; i < 25; i++) {
console.log( i + " digits : " + findSelfDescriptiveNbr(i));
}
function findSelfDescriptiveNbr(howManyDigit) {
var loop = 0;
var selefDescriptiveNbr = [];
findXDigitNumbers([], howManyDigit);
return selefDescriptiveNbr;
function copy(source) {
var result = [];
for (var i = 0; i < source.length; i++) {
result[i] = source[i];
}
return result;
} // end copy
function findXDigitNumbers(nbr, rest) {
if (nbr.length == howManyDigit) {
loop++;
if (loop%10000000 === 0) {
// To see the progression
console.log(nbr.join(''));
}
if (validate(nbr)) {
//console.log('Solution : ' + nbr.join(''));
selefDescriptiveNbr.push(nbr.join(''));
}
return;
}
if (rest == 0) {
var nbrBis = copy(nbr);
nbrBis.push(0);
findXDigitNumbers( nbrBis , 0);
} else {
var max = (rest > 9 ? 9 : rest);
for (var i = max; i >= 0; i--) {
var nbrBis = copy(nbr);
nbrBis.push(i);
if ( partialValidate(nbrBis) ) {
findXDigitNumbers(nbrBis, rest-i);
}
}
}
}
function validate(nbr) {
var count = [];
for (var i = 0; i < howManyDigit; i++) {
count[i] = 0;
}
for (var i = 0; i < nbr.length; i++) {
count[parseInt(nbr[i])]++;
}
return nbr.join('') === count.join('');
} // end partialValidate
function partialValidate(nbr) {
var count = [];
for (var i = 0; i < howManyDigit; i++) {
count[i] = 0;
}
for (var i = 0; i < nbr.length; i++) {
count[parseInt(nbr[i])]++;
}
for (var i = 0; i < nbr.length; i++) {
if (count[i] > parseInt(nbr[i])){
return false;
}
}
return true;
//return nbr.join('') === count.join('');
} // end partialValidate
} // end findSelfDescriptiveNbr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment