0

I have stucked with a simple task and don't understand how to make the decision about it. There is one condition - do not use regular expressions. The task is to write a function that counts similar elements of a string so if we have dddmmmmccccaaamm, the function returns d3m4c4a3m2. Firstly I thought about converting string to array and using filter method but it is the wrong way. Now I think to find the first element of the array and compare it with each element in the loop, but don't know what to do next.

Please note, that my question doesn't match Count the number of occurrences of a character in a string in Javascript

function countFig(str) {
  let arr = str.split('');
  let newArr = [];
  let a = arr[0];
  let sum = 0;
  for (let i = 0; i < arr.length; ++i) {
    if ((i = arr.indexOf(a, i)) === -1) break;
    newArr.push(i); // here Im stucked
  }
  return newArr
}
console.log(countFig('dddmmmmccccaaamm'))
Victor
  • 33
  • 7
  • Your example only counts the same characters when they're adjacent. Notice that you have separate `m4` and `m2`. Does that help? – Barmar Nov 16 '21 at 16:25
  • I don't know how to make a counter which counts the similar figures, moreover it should reset when another figure begins – Victor Nov 16 '21 at 16:33
  • 1
    Loop over the characters, and just check if the current character is the same as the previous character. – Barmar Nov 16 '21 at 16:35
  • There's no need to use `split()`. You can index strings just like arrays. – Barmar Nov 16 '21 at 16:35

1 Answers1

2

You could reduce each character and keep track of previous and count. You can initialize your reducer with the first character and increment the count each time you see consecutive occurrences.

If you run into a character that differs from the previous, reset the count, set the last to the curr, and append to the result.

I added the \b (backspace escape character) to the end of the array so that it can finish reducing the final sequence of characters. Left-over characters would be thrown away at the end. Now we can return the result portion of the reduction.

const countFig = (str) =>
  (([head, ...tail]) =>
    tail.reduce((acc, curr) =>
      curr === acc.last
        ? { ...acc, count: acc.count + 1 }
        : {
            ...acc,
            result: acc.result + acc.last + (acc.count + 1),
            last: curr,
            count: 0
          },
    {
      last: head,
      count: 0,
      result: ''
    }))
  ([...str.split(''), '\b']).result;

console.log(countFig('dddmmmmccccaaamm')); // d3m4c4a3m2
console.log(countFig('abbcccd'));          // a1b2c3d1
Mr. Polywhirl
  • 42,981
  • 12
  • 84
  • 132