curriculum/challenges/english/blocks/project-euler-problems-1-to-100/5900f38c1000cf542c50fe9f.md
We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once; for example, the 5-digit number, 15234, is 1 through 5 pandigital.
The product 7254 is unusual, as the identity, 39 × 186 = 7254, containing multiplicand, multiplier, and product is 1 through 9 pandigital.
Find the sum of all products whose multiplicand/multiplier/product identity can be written as a 1 through n pandigital.
Hint: Some products can be obtained in more than one way so be sure to only include it once in your sum.
pandigitalProducts(4) should return a number.
assert(typeof pandigitalProducts(4) === 'number');
pandigitalProducts(4) should return 12.
assert.strictEqual(pandigitalProducts(4), 12);
pandigitalProducts(6) should return 162.
assert.strictEqual(pandigitalProducts(6), 162);
pandigitalProducts(7) should return 0.
assert.strictEqual(pandigitalProducts(7), 0);
pandigitalProducts(8) should return 13458.
assert.strictEqual(pandigitalProducts(8), 13458);
pandigitalProducts(9) should return 45228.
assert.strictEqual(pandigitalProducts(9), 45228);
function pandigitalProducts(n) {
return true;
}
pandigitalProducts(4);
// Check for pandigital number
function isPandigital(digitStr) {
return digitStr
.split('')
.sort()
.every((c, i) => c == i + 1);
}
// Concatenate 3 numbers
function concatenate3Nums(a, b, c) {
return a.toString() + b.toString() + c.toString();
}
// Find sum of all pandigital products
function pandigitalProducts(n) {
const products = [];
let sum = 0;
const max = Number(Array(n)
.fill(0)
.map((_, i) => (n - i).toString())
.join(''));
const outerLimit = Math.sqrt(max);
for (let factor1 = 2; factor1 < outerLimit; factor1++) {
const innerLimit = max / factor1;
for (let factor2 = factor1; factor2 < innerLimit; factor2++) {
const product = factor1 * factor2;
const concatenated = concatenate3Nums(factor1, factor2, product);
if (concatenated.length > n) {
break;
} else if (concatenated.length == n &&
isPandigital(concatenated) &&
!products.includes(product)
) {
products.push(product);
sum += product;
}
}
}
return sum;
}