Как уменьшить строковое выражение типа «20hc + 2a + 2hc + 9op» до «22hc + 2a + 9op» - PullRequest
0 голосов
/ 01 февраля 2019

Как найти и соединить алфавиты после чисел в строке, чтобы уменьшить одно выражение?

Предположим, у нас есть строка типа string = "20hc+2a+2hc+9op+330o+10op", и мы хотим найти пару с таким же алфавитомпосле номеров.Сначала мы должны сделать split.('+'), а затем мы получим массив [....], затем нам нужно соединить каждый алфавит после чисел, чтобы получить что-то вроде ниже:

(20hc + 2hc) (2a) (9op+10op) (330o)

Наконецнам нужно сложить числа для соответствующих пар:

20+2 = 22hc
2 = 2a
9+10 = 19op
330 = 330o

Чтобы получить окончательный результат:

22hc+2a+19op+330o

Итак, как я могу подойти к этому, не имеет значения, еслиони не сортируются до тех пор, пока алфавит после чисел одинаков, в таком случае, можем ли мы использовать регулярное выражение для match их?или indexOf?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Я сделаю это за два шага .На первом этапе создается объект с keys (буквы алфавита) и totals (сумма чисел) для каждого key.Для этого мы используем String :: split () и Array :: redu () в указанном порядке.Пример сгенерированного объекта будет выглядеть следующим образом:

{"hc": 22, "op": 19, ...}

Второй шаг просто форматирует предыдущий сгенерированный объект в желаемую строку вывода.Для этого мы используем Object.entries () , Array :: map () и, наконец, Array :: join () .

const input = "a+20hc+2a+2hc+9op+330o+10op";

// First, get keys and sum their total.

let res = input.split("+")
    .reduce((acc, curr) =>
    {
        let [match, val, key] = curr.match(/(\d*)(\w*)/);
        val = +val || 1;
        acc[key] = acc[key] ? acc[key] + val : val;
        return acc;
    }, {});

console.log(res);

// Now, format to the output string.

res = Object.entries(res).map(([x, y]) => y + x).join("+");
console.log(res);

Однако вы должны заметить, что предыдущий подход не будет работать, если у вас есть subtractions, но некоторые незначительные изменения могут сделать эту работу:

const input = "-4a+20hc+2a+2hc+9op+330o+10op-340o";

// First, get keys and sum their total.

let res = input.split(/\+|(?=-)/)
    .reduce((acc, curr) =>
    {
        let [match, val, key] = curr.match(/(-*\d*)(\w*)/);
        val = +val || 1;
        acc[key] = acc[key] ? acc[key] + val : val;
        return acc;
    }, {});

console.log(res);

// Now, format to the output string.

res = Object.entries(res)
    .map(([x, y]) => y + x)
    .join("+")
    .replace(/\+-/, "-");

console.log(res);
0 голосов
/ 01 февраля 2019

Я думаю, что для удобства чтения просто используйте преобразование indexOf pair и создайте хеш.Например:

const getPair = str => {
  const numbers = '0123456789'
  for (var i = 0; i < str.length; i++) {
    if(numbers.indexOf(str.charAt(i)) < 0){ break }
  }
  return [str.slice(i), i === 0 ? 1 : parseInt(str.slice(0, i))]
}
  
//const eq = '20hc+2a+2hc+9op+330o+10op'
const eq = 'a+2ab+3b+4c+5bc'

const hash = eq.split('+')
               .map(getPair)
               .reduce((r, [key, val]) => {
                 r[key] = r[key] ? r[key] + val : val
                 return r
               }, {})

const result = Object.entries(hash).map(([key, val]) => `${val}${key}`).join('+')

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...