Skip to content
Advertisement

API returns undefined after 2nd round loop

I am getting PI number from PI Api (https://pi.delivery) and checking for palindromic of 21 numbers in sequence on each 105 numbers block (5 x 21) to be faster. My code returns undefined on the second round of for loop. Why is this happening?

PS: This is a 105 numbers block and 2 rounds loop just for testing purpose.

import fetch from "node-fetch";
import fs from "fs";

const contentPI = async (start, size) => {
  return await fetch(`https://api.pi.delivery/v1/pi?start=${start}&numberOfDigits=${size}`)
  .then(response => response.json())
  .then(data => data.content);
} 

let start = 1;
let size = 105;
let group = 0;

for (let y = 0; y < 2; y += 1) {
  const pi = await contentPI(start, size);

  let sequence = '';

  for (let i = 0; i < 5; i += 1) {
    let count = 0;
    for (let j = group; j < group + 21; j += 1) {
      sequence += pi[j];
    }
  
    console.log(sequence, ' - ', i, 'seq');
    for (let x = 2; x <= 10; x += 1) {
      if (sequence % x === 0) {
        count++;
      }
    }
    const result = (count > 0) ? 'not prime' : 'prime';
    if (result === 'prime') {
      const reverseSequence = sequence.split('').reverse().join('');
      if (sequence === reverseSequence) {
        console.log(`${sequence} - palindromic prime - position: ${i * 9}`);
      }
    }
    sequence = '';
    group += 21;
    count = 0;
    if (i === 4) {
      start += 105;
    }
  }
}

Advertisement

Answer

Pay attention to your group and for (let j = group...). You have for (let i = 0; i < 5; i += 1) and in the end of this loop you are adding 21 to group. For first y loop everything works, but for 2nd y loop you are not resetting group back to 0, so it keeps growing and due to that your j variable becomes bigger than the length of the pi variable. So you are starting getting “undefined” then. Probably you need to move let group = 0; a bit down, into the beginning of the for (let y = 0; y < 2; y += 1) loop.

const contentPI = async (start, size) => {
  return await fetch(
    `https://api.pi.delivery/v1/pi?start=${start}&numberOfDigits=${size}`
  )
    .then((response) => response.json())
    .then((data) => data.content);
};

async function doSomething() {
  let start = 1;
  let size = 105;
  for (let y = 0; y < 2; y += 1) {
    let group = 0;
    const pi = await contentPI(start, size);
    console.log(y, pi);
    let sequence = "";

    for (let i = 0; i < 5; i += 1) {
      let count = 0;
      for (let j = group; j < group + 21; j += 1) {
        sequence += pi[j];
      }

      console.log(sequence, " - ", i, "seq");
      for (let x = 2; x <= 10; x += 1) {
        if (sequence % x === 0) {
          count++;
        }
      }
      const result = count > 0 ? "not prime" : "prime";
      if (result === "prime") {
        const reverseSequence = sequence.split("").reverse().join("");
        if (sequence === reverseSequence) {
          console.log(`${sequence} - palindromic prime - position: ${i * 9}`);
        }
      }
      sequence = "";
      group += 21;
      count = 0;
      if (i === 4) {
        start += 105;
      }
    }
  }
}

doSomething();
Advertisement