Search code examples
javascriptarrayscounter

Make a counter stop if it breaks a determined sequence


Brief summary about my question: I'm trying to turn a sequence into a "conditional" sequence -- the input is AN ARRAY made with only true and false which I think will make it harder than it will be if it made of sequence of numbers. The idea is to make it count a sequence of "true" and break when the next input is "false" and returns the bigger count.


// If the input is something like [true, true, ... true, true] 
// should return count => input.length

// My issue is to make it break when it have a interruption i. e. 
// [true, true, true, false, true, true, false] 
// should return => the bigger sequence; with my code it returns 5 

function sol(sequence) {
    let count = 0;
    
for (let i = 0; i < sequence.length; i++) {
    if (sequence[i] == true) {
        if (sequence[i] == sequence[i+1]){
            count++;
        }
    }
}

// I tried to add a break; but isn't worked like i wanted
// for (let i = 0; i < sequence.length; i++) {
//     if (sequence[i] == true) {
//         if (sequence[i] == sequence[i+1]){
//             count++;
//         } 
//         if (sequence[i] != sequence[i+1]) {
//             break;
// }
//     }
// }


// I need the counter has bigger (or equals) than 7 otherwise it return a "fail"
if (count >= 7) {
        console.log(count)
    } else {
        console.log('failed')
    } 
}


After some explains on the post here's a functional result:

  function sol(sequence) {
// Move the "+1" to low then when have no "true" will return 0.
  let count = 0;
  let largestSequence = 0;

  for (let i = 0; i < sequence.length; i++) {
    if (sequence[i] == true) {
      if (sequence[i] == sequence[i + 1]) {
        count++;
      }
    } else {
      if (largestSequence < count) {
        largestSequence = count + 1;
        count = 0;
      }
    }
  }
  return Math.max(largestSequence, count);
}


And here's the final answer that aced all my weird examples. Thank you Gulam

let sequenceContinued = false;
let count = 0;
let sequences = [];
for (let i = 0; i < array.length; i++) {
  const item = array[i];

  if (item === false && sequenceContinued === true) {
    sequenceContinued = false;
    sequences.push(count);
    count = 0;
    continue;
  }

  if (item === true) {
    sequenceContinued = true;
    count++;
  }

  if (i === array.length - 1 && item === true) {
    sequences.push(count);
  }
}

const longestCount = sequences.length ? Math.max(...sequences) : 0;

Solution

  • const array = [
      true,
      false,
      false,
      false,
      true,
      true,
      false,
      true,
      true,
      true,
      false,
      true,
      true,
      true,
      true
    ];
    
    let sequenceContinued = false;
    let count = 0;
    let sequences = [];
    for (let i = 0; i < array.length; i++) {
      const item = array[i];
    
      if (item === false && sequenceContinued === true) {
        sequenceContinued = false;
        sequences.push(count);
        count = 0;
        continue;
      }
    
      if (item === true) {
        sequenceContinued = true;
        count++;
      }
    
      if (i === array.length - 1 && item === true) {
        sequences.push(count);
      }
    }
    
    const longestCount = sequences.length ? Math.max(...sequences) : 0;
    
    console.log(longestCount);