-
Notifications
You must be signed in to change notification settings - Fork 0
/
4kyu-mostFrequentlyUsedWords.js
53 lines (39 loc) · 1.86 KB
/
4kyu-mostFrequentlyUsedWords.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
'use strict';
// Source: https://www.codewars.com/kata/51e056fe544cf36c410000fb
// DESCRIPTION:
// Write a function that, given a string of text (possibly with punctuation and
// line-breaks), returns an array of the top-3 most occurring words, in
// descending order of the number of occurrences.
// Assumptions:
// - A word is a string of letters (A to Z) optionally containing one or more
// apostrophes (') in ASCII. (No need to handle fancy punctuation.)
// - Matches should be case-insensitive, and the words in the result should be
// lowercased.
// - Ties may be broken arbitrarily.
// - If a text contains fewer than three unique words, then either the top-2 or
// top-1 words should be returned, or an empty array if a text contains no words.
// Examples:
// top_3_words("In a village of La Mancha, the name of which I have no desire to
// call to mind, there lived not long since one of those gentlemen that keep a
// lance in the lance-rack, an old buckler, a lean hack, and a greyhound for
// coursing. An olla of rather more beef than mutton, a salad on most nights,
// scraps on Saturdays, lentils on Fridays, and a pigeon or so extra on Sundays,
// made away with three-quarters of his income.")
// # => ["a", "of", "on"]
// top_3_words("e e e e DDD ddd DdD: ddd ddd aa aA Aa, bb cc cC e e e")
// # => ["e", "ddd", "aa"]
// top_3_words(" //wont won't won't")
// # => ["won't", "wont"]
function topThreeWords(text) {
let allWordsArray = text.toLowerCase().match(/[a-z]+'?[a-z]*/g);
if (!allWordsArray) return [];
let uniqueWordsObj = {};
for (let word of allWordsArray) {
if (uniqueWordsObj[word]) uniqueWordsObj[word]++;
else uniqueWordsObj[word] = 1;
}
let uniqueWordsArray = Object.keys(uniqueWordsObj).sort((a, b) => {
return uniqueWordsObj[b] - uniqueWordsObj[a]
});
return uniqueWordsArray.slice(0, 3);
}