Нужна помощь в вводе строки, возвращающей гистограмму, которая считает частоту пар букв - PullRequest
0 голосов
/ 02 июля 2019

Мне нужно написать функцию (и), которая принимает строки в качестве входных данных и выводит гистограмму частоты буквенных пар в порядке убывания.

Мне удалось написать функцию, которая возвращает счетчик одного символа, но я не могу понять, как делать пары.

Вот что у меня есть:

var string = "etc";
var histogram = {};

for (var i = 0, len = string.length; i < len; i++) {
    var char = string[i];
    if ((string[i] !== " ") && (string[i] !== " ")) {
        histogram[char] = (histogram[char] || 0) + 1;
    }
};

console.log(histogram);

Функция работает, и я смог заставить ее оставить все пустые места за пределами гистограммы. Я застрял в том, куда идти отсюда, хотя. Как заставить его оценивать пары и как исключить какой-либо один символ (за которым не следует другой символ) ... Любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Другой подход, разбивающий проблему на мелкие кусочки:

const inPairs = (xs) => 
  [...xs].reduce((a, x, i) => i == 0 ? a : [...a, xs[i - 1] + x], [])

const pairFreq = str => str         //   "this is a good thing"
  .split (/\s+/)                    //=> ["this","is","a","good","thing"]
  .filter (s => s.length > 1)       //=> ["this","is","good","thing"]
  .flatMap (inPairs)                //=> ["th","hi","is","is","go","oo","od","th","hi","in","ng"]
  .reduce ( (a, s) => ({...a, [s]: (a[s] || 0) + 1}), {})
                                    //=> {"th":2,"hi":2,"is":2,"go":1,"oo":1,"od":1,"in":1,"ng":1}

console .log (
  pairFreq('this is a good thing')
)

Очевидно, вы можете встроить inPairs, если захотите. Мне нравится этот стиль трансформации, просто объединяя шаги, которые двигают меня к моей конечной цели.

0 голосов
/ 02 июля 2019

Вам нужно использовать string[i+1], чтобы получить следующую букву в паре.

И чтобы избежать доступа вне массива при использовании string[i+1], предел цикла должен быть string.length-1.

var string = "this is a good thing";
var histogram = {};

for (var i = 0, len = string.length - 1; i < len; i++) {
  if ((string[i] !== " ") && (string[i + 1] !== " ")) {
    let pair = string.substr(i, 2);
    histogram[pair] = (histogram[pair] || 0) + 1;
  }
};

console.log(histogram);
...