Как вывести количество повторяющихся в строке элементов и записать их число в той же строке?

149
22 мая 2022, 06:50

Всем привет. Стоит такая задача:

  1. Из строки в которой есть дубликаты, убрать их и оставить чистый, читаемый текст. Допустим так : из 'маааааааааамммммммааааа ммммммммыыыыыыыыллллааа ррррааааааммммууууууу' получить 'мама мыла раму'
  2. В полученную строку добавить числа соответствующие повторяющимся(отсортированным) элементам. В итоге должно быть так 'ма9м6а4 м7ы7л3а2 р3а5м3у6'

Первый пункт я реализовал так :

let text = 'маааааааааамммммммааааа ммммммммыыыыыыыыллллааа ррррааааааммммууууууу';
    textSplit = text.split('');
    arr = textSplit.filter((item,index) => item !== textSplit[index - 1]);
console.log(arr.join('')); 

Получилось 'мама мыла раму'

Вопрос с реализацией второго пункта.

Answer 1

let text = 'маааааааааамммммммааааа ммммммммыыыыыыыыллллааа ррррааааааммммууууууу';
let result = '', lastChar = text[0], count = 0;
for (let chr of text) {
  if (chr === lastChar) {
    ++count
  } else {
    result +=  lastChar + (count > 1 ? count : '')
    count = 0
    lastChar = chr
  }
} 
result +=  lastChar + (count > 1 ? count : '')
console.log(result); 

Просто счетчик воткнуть)

Answer 2

const text = 'маааааааааамммммммааааа ммммммммыыыыыыыыллллааа ррррааааааммммууууууу';
let counter = 0;
let result = [...text].reduce((acc, char, i, arr) => {
  if (char === arr[++i]) {
    counter++;
  } else {
    acc += char += counter ? counter : "";
    counter = 0;
  }
  return acc;
},"")
console.log(result)

Answer 3

let text = 'маааааааааамммммммааааа ммммммммыыыыыыыыллллааа ррррааааааммммууууууу';
let clearText = numberText = text;
// Конструкция [...text] преобразует строку в массив
// Конструкция [...new Set(arr)] делает массив arr отфильтрованный 
//                               только уникальными значениями
[...new Set([...text])].forEach(char=> {
  // TODO требуется проверка, что в char нет спец.символов RexExp.
  // В рамках задачи не требуется, но в продакшн проверку стоит сделать
  // Это может быть дырой в безопасности.
  let rx = new RegExp(`[${char}]+`,'g');
  // Метод replace() принимает первым параметром регулярку.
  // Вторым параметром может быть строка, но в этом случае функция
  // Функция возвращает первый символ найденной строки.
  clearText = clearText.replace(rx, s => s[0]);
  // А здесь функция к первому символу прибавляет длину строки
  // (если она требуется).
  numberText = numberText.replace(rx, s => s[0] + (s.length > 1 ? s.length-1 : ''));
});
console.log(clearText);
console.log(numberText);

READ ALSO
Не получается сделать калькулятор на js

Не получается сделать калькулятор на js

Решил сделать по гайдам простой калькулятор, но в место результата получаю NaN

207
Номер последнего видимого элемента RecyclerView = -1

Номер последнего видимого элемента RecyclerView = -1

Подскажите, пожалуйста, почему findLastVisibleItemPosition() возвращает -1

266
Задача: прокликать весь список, теряется один элемент

Задача: прокликать весь список, теряется один элемент

Стоит задача: прокликать меню и подгруппыС подгруппами проблем нет, есть проблема с основным меню, второй пункт меню мой тест почему-то пропускает...

149
Удалить ответ бота Discord

Удалить ответ бота Discord

Можно как-то удалить поступивший ответ от бота на команду ? (Человек пишет команду , бот отвечает и через какое-то время ответ бота удаляется)

159