Freecodecamp: Bug in Challenge: Project Euler: Problem 59: XOR decryption

Created on 3 May 2020  路  2Comments  路  Source: freeCodeCamp/freeCodeCamp

Describe your problem and how to reproduce it:
My solution (see below) appears to be correct: My algorithm produces 129448 . I tried this answer on project euler directly and it is correct: https://projecteuler.net/problem=59

However on freecodecamp.org it says that the valid answer should be '107359'.

My Code:

// Bitwise XOR: a ^ b = a xor b

// Strategy 1: Only allowed characters in text 
//             (whitelist ascii ranges)
// Strategy 2: Looking for " are " in text 
//             -> didn't work: text did not contain any " are " snippets
// Strategy 3: Looking for the key which results in the most spaces " " = 32

let allowedCharacters = range(32, 127);
// console.log({allowedCharacters});

function XORDecryption(arr) {
  let keyOptions = [[], [], []];

  for (let keyIndex=0; keyIndex<3; keyIndex++) {
    for (let key=97; key<123; key++) {
      let valid = true;
      for (let i=keyIndex; i<arr.length; i+=3) {
        if (!allowedCharacters.includes(arr[i] ^ key)) {
          valid = false;
          break;
        }
      }
      if (valid) {
        keyOptions[keyIndex] = keyOptions[keyIndex].concat([key]);
      }
    }
  }

  console.log({keyOptions});

  let bestGuessKey = [101, 120, 112];  // found this key with the section below
  let bestGuessArray = decipher(arr, bestGuessKey);

  /*
  let maxSpacesCount = 0;

  for (let key0=0; key0<keyOptions[0].length; key0++) {
    for (let key1=0; key1<keyOptions[1].length; key1++) {
      for (let key2=0; key2<keyOptions[2].length; key2++) {
        let key = [keyOptions[0][key0], keyOptions[1][key1], keyOptions[2][key2]];

        let plain = decipher(arr, key);

        let spacesCount = 0;
        for (let i=0; i<plain.length;i++) {
          if (plain[i] === 32) {
            spacesCount++;
          }
        }

        if (spacesCount > maxSpacesCount) {
          maxSpacesCount = spacesCount;
          bestGuessArray = plain;
          bestGuessKey = key;
        }

      }
    }
  }*/

  console.log();
  console.log({text: arrayToText(bestGuessArray), key: bestGuessKey});
  console.log();

  let cipherSum = arr.reduce((a,b) => a+b, 0);
  let plainSum = bestGuessArray.reduce((a,b) => a+b, 0);

  console.log({lenCipher: arr.length, lenPlain: bestGuessArray.length, cipherSum, plainSum});

  return bestGuessArray.reduce((a,b) => a+b, 0);
}


function range(fromN, toN) {
  let array = [];
  for (let n=fromN; n<toN; n++) {
    array.push(n);
  } 
  return array;
}

function decipher(cipher, key) {
  let plain = [];
  for (let i=0; i<cipher.length; i++) {
    plain.push(cipher[i] ^ key[i % key.length]);
  }
  return plain;
}

function arrayToText(arr) {
  let text = "";
  for (let i=0; i<arr.length; i++) {
    text += String.fromCharCode(arr[i]);
  }
  return text;
}

// Only change code above this line

const cipher = [
  36,22,80,0,0,4,23,25,19,17,88,4,4,19,21,11,88,22,23,23,29,69,12,24,0,88,25,11,12,2,10,28,5,6,12,25,10,22,80,10,30,80,10,22,21,69,23,22,69,61,5,9,29,2,66,11,80,8,23,3,17,88,19,0,20,21,7,10,17,17,29,20,69,8,17,21,29,2,22,84,80,71,60,21,69,11,5,8,21,25,22,88,3,0,10,25,0,10,5,8,88,2,0,27,25,21,10,31,6,25,2,16,21,82,69,35,63,11,88,4,13,29,80,22,13,29,22,88,31,3,88,3,0,10,25,0,11,80,10,30,80,23,29,19,12,8,2,10,27,17,9,11,45,95,88,57,69,16,17,19,29,80,23,29,19,0,22,4,9,1,80,3,23,5,11,28,92,69,9,5,12,12,21,69,13,30,0,0,0,0,27,4,0,28,28,28,84,80,4,22,80,0,20,21,2,25,30,17,88,21,29,8,2,0,11,3,12,23,30,69,30,31,23,88,4,13,29,80,0,22,4,12,10,21,69,11,5,8,88,31,3,88,4,13,17,3,69,11,21,23,17,21,22,88,65,69,83,80,84,87,68,69,83,80,84,87,73,69,83,80,84,87,65,83,88,91,69,29,4,6,86,92,69,15,24,12,27,24,69,28,21,21,29,30,1,11,80,10,22,80,17,16,21,69,9,5,4,28,2,4,12,5,23,29,80,10,30,80,17,16,21,69,27,25,23,27,28,0,84,80,22,23,80,17,16,17,17,88,25,3,88,4,13,29,80,17,10,5,0,88,3,16,21,80,10,30,80,17,16,25,22,88,3,0,10,25,0,11,80,12,11,80,10,26,4,4,17,30,0,28,92,69,30,2,10,21,80,12,12,80,4,12,80,10,22,19,0,88,4,13,29,80,20,13,17,1,10,17,17,13,2,0,88,31,3,88,4,13,29,80,6,17,2,6,20,21,69,30,31,9,20,31,18,11,94,69,54,17,8,29,28,28,84,80,44,88,24,4,14,21,69,30,31,16,22,20,69,12,24,4,12,80,17,16,21,69,11,5,8,88,31,3,88,4,13,17,3,69,11,21,23,17,21,22,88,25,22,88,17,69,11,25,29,12,24,69,8,17,23,12,80,10,30,80,17,16,21,69,11,1,16,25,2,0,88,31,3,88,4,13,29,80,21,29,2,12,21,21,17,29,2,69,23,22,69,12,24,0,88,19,12,10,19,9,29,80,18,16,31,22,29,80,1,17,17,8,29,4,0,10,80,12,11,80,84,67,80,10,10,80,7,1,80,21,13,4,17,17,30,2,88,4,13,29,80,22,13,29,69,23,22,69,12,24,12,11,80,22,29,2,12,29,3,69,29,1,16,25,28,69,12,31,69,11,92,69,17,4,69,16,17,22,88,4,13,29,80,23,25,4,12,23,80,22,9,2,17,80,70,76,88,29,16,20,4,12,8,28,12,29,20,69,26,9,69,11,80,17,23,80,84,88,31,3,88,4,13,29,80,21,29,2,12,21,21,17,29,2,69,12,31,69,12,24,0,88,20,12,25,29,0,12,21,23,86,80,44,88,7,12,20,28,69,11,31,10,22,80,22,16,31,18,88,4,13,25,4,69,12,24,0,88,3,16,21,80,10,30,80,17,16,25,22,88,3,0,10,25,0,11,80,17,23,80,7,29,80,4,8,0,23,23,8,12,21,17,17,29,28,28,88,65,75,78,68,81,65,67,81,72,70,83,64,68,87,74,70,81,75,70,81,67,80,4,22,20,69,30,2,10,21,80,8,13,28,17,17,0,9,1,25,11,31,80,17,16,25,22,88,30,16,21,18,0,10,80,7,1,80,22,17,8,73,88,17,11,28,80,17,16,21,11,88,4,4,19,25,11,31,80,17,16,21,69,11,1,16,25,2,0,88,2,10,23,4,73,88,4,13,29,80,11,13,29,7,29,2,69,75,94,84,76,65,80,65,66,83,77,67,80,64,73,82,65,67,87,75,72,69,17,3,69,17,30,1,29,21,1,88,0,23,23,20,16,27,21,1,84,80,18,16,25,6,16,80,0,0,0,23,29,3,22,29,3,69,12,24,0,88,0,0,10,25,8,29,4,0,10,80,10,30,80,4,88,19,12,10,19,9,29,80,18,16,31,22,29,80,1,17,17,8,29,4,0,10,80,12,11,80,84,86,80,35,23,28,9,23,7,12,22,23,69,25,23,4,17,30,69,12,24,0,88,3,4,21,21,69,11,4,0,8,3,69,26,9,69,15,24,12,27,24,69,49,80,13,25,20,69,25,2,23,17,6,0,28,80,4,12,80,17,16,25,22,88,3,16,21,92,69,49,80,13,25,6,0,88,20,12,11,19,10,14,21,23,29,20,69,12,24,4,12,80,17,16,21,69,11,5,8,88,31,3,88,4,13,29,80,22,29,2,12,29,3,69,73,80,78,88,65,74,73,70,69,83,80,84,87,72,84,88,91,69,73,95,87,77,70,69,83,80,84,87,70,87,77,80,78,88,21,17,27,94,69,25,28,22,23,80,1,29,0,0,22,20,22,88,31,11,88,4,13,29,80,20,13,17,1,10,17,17,13,2,0,88,31,3,88,4,13,29,80,6,17,2,6,20,21,75,88,62,4,21,21,9,1,92,69,12,24,0,88,3,16,21,80,10,30,80,17,16,25,22,88,29,16,20,4,12,8,28,12,29,20,69,26,9,69,65,64,69,31,25,19,29,3,69,12,24,0,88,18,12,9,5,4,28,2,4,12,21,69,80,22,10,13,2,17,16,80,21,23,7,0,10,89,69,23,22,69,12,24,0,88,19,12,10,19,16,21,22,0,10,21,11,27,21,69,23,22,69,12,24,0,88,0,0,10,25,8,29,4,0,10,80,10,30,80,4,88,19,12,10,19,9,29,80,18,16,31,22,29,80,1,17,17,8,29,4,0,10,80,12,11,80,84,86,80,36,22,20,69,26,9,69,11,25,8,17,28,4,10,80,23,29,17,22,23,30,12,22,23,69,49,80,13,25,6,0,88,28,12,19,21,18,17,3,0,88,18,0,29,30,69,25,18,9,29,80,17,23,80,1,29,4,0,10,29,12,22,21,69,12,24,0,88,3,16,21,3,69,23,22,69,12,24,0,88,3,16,26,3,0,9,5,0,22,4,69,11,21,23,17,21,22,88,25,11,88,7,13,17,19,13,88,4,13,29,80,0,0,0,10,22,21,11,12,3,69,25,2,0,88,21,19,29,30,69,22,5,8,26,21,23,11,94
];

console.log(XORDecryption(cipher));

Add a Link to the page with the problem:
https://www.freecodecamp.org/learn/coding-interview-prep/project-euler/problem-59-xor-decryption

Tell us about your browser and operating system:

  • Browser Name: Chrome
  • Browser Version: 81.0.4044.129
  • Operating System: Mac OS Catalina (10.15.4)

If possible, add a screenshot here (you can drag and drop, png, jpg, gif, etc. in this box):
Bildschirmfoto 2020-05-03 um 21 38 53

help wanted learn

Most helpful comment

Thanks @dostuffthatmatters, you're quite right. Project Euler changed their cipher and key recently and when we incorporated the new cipher we didn't update the test.

If you're up for it, a PR to update the test and add a solution would be very welcome.

All 2 comments

Thanks @dostuffthatmatters, you're quite right. Project Euler changed their cipher and key recently and when we incorporated the new cipher we didn't update the test.

If you're up for it, a PR to update the test and add a solution would be very welcome.

Thanks for reporting this @dostuffthatmatters, and for your PR @hassaanp. I'll take a look at it now.

Was this page helpful?
0 / 5 - 0 ratings