freeCodeCamp/curriculum/challenges/portuguese/10-coding-interview-prep/project-euler/problem-41-pandigital-prime.md

2.2 KiB

id title challengeType forumTopicId dashedName
5900f3951000cf542c50fea8 Problem 41: Pandigital prime 5 302078 problem-41-pandigital-prime

--description--

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, 2143 is a 4-digit pandigital and is also prime.

What is the largest n-length digit pandigital prime that exists?

--hints--

pandigitalPrime(4) should return a number.

assert(typeof pandigitalPrime(4) === 'number');

pandigitalPrime(4) should return 4231.

assert(pandigitalPrime(4) == 4231);

pandigitalPrime(7) should return 7652413.

assert(pandigitalPrime(7) == 7652413);

--seed--

--seed-contents--

function pandigitalPrime(n) {

  return n;
}

pandigitalPrime(7);

--solutions--

function pandigitalPrime(n) {
  function isPrime(num) {
    for (let i = 2, s = Math.sqrt(num); i <= s; i++) {
      if (num % i === 0) {
        return false;
      }
    }
    return num !== 1;
  }

  function getPermutations(n) {
    if (n === 1) {
      permutations.push(digitsArr.join(''));
    } else {
      for (let i = 0; i < n - 1; i++) {
        getPermutations(n - 1);
        // swap(n % 2 === 0 ? i : 0, n - 1);
        if (n % 2 === 0) {
          swap(i, n - 1);
        } else {
          swap(0, n - 1);
        }
      }
      getPermutations(n - 1);
    }
  }
  function swap(x, y) {
    let temp = digitsArr[x];
    digitsArr[x] = digitsArr[y];
    digitsArr[y] = temp;
  }
  let max = 0;
  let permutations = [];
  let digitsArr;
  let pandigitalNum = '';

  for (let max = n; max > 0; max--) {
    pandigitalNum += max;
  }

  for (let i = 0; i < pandigitalNum.length; i++) {
    if (max > 0) {
      break;
    } else {
      permutations = [];
      const currMax = pandigitalNum.slice(i);
      digitsArr = currMax.split('');
      getPermutations(digitsArr.length);

      // sort permutations in descending order
      permutations.sort(function(a, b) {
        return b - a;
      });

      for (let perm of permutations) {
        const thisPerm = parseInt(perm);
        if (isPrime(thisPerm)) {
          max = thisPerm;
          break;
        }
      }
    }
  }

  return max;
}