-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhelpTheBookseller.js
47 lines (35 loc) · 1.83 KB
/
helpTheBookseller.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
// A bookseller has lots of books classified in 26 categories labeled A, B, ... Z. Each book has a code c of 3, 4, 5 or more characters. The 1st character of a code is a capital letter which defines the book category.
// In the bookseller's stocklist each code c is followed by a space and by a positive integer n (int n >= 0) which indicates the quantity of books of this code in stock.
// For example an extract of a stocklist could be:
// L = {"ABART 20", "CDXEF 50", "BKWRK 25", "BTSQZ 89", "DRTYM 60"}.
// or
// L = ["ABART 20", "CDXEF 50", "BKWRK 25", "BTSQZ 89", "DRTYM 60"] or ....
// You will be given a stocklist (e.g. : L) and a list of categories in capital letters e.g :
// M = {"A", "B", "C", "W"}
// or
// M = ["A", "B", "C", "W"] or ...
// and your task is to find all the books of L with codes belonging to each category of M and to sum their quantity according to each category.
// For the lists L and M of example you have to return the string (in Haskell/Clojure/Racket a list of pairs):
// (A : 20) - (B : 114) - (C : 50) - (W : 0)
// where A, B, C, W are the categories, 20 is the sum of the unique book of category A, 114 the sum corresponding to "BKWRK" and "BTSQZ", 50 corresponding to "CDXEF" and 0 to category 'W' since there are no code beginning with W.
// If L or M are empty return string is "" (Clojure and Racket should return an empty array/list instead).
// my original solution
function stockList(listOfArt, listOfCat){
if(!listOfArt.length) return ''
let result = []
let stock = listOfCat.reduce((a,b)=> {
if(!a[b]) {
a[b] = 0
}
return a
}, {})
listOfArt.forEach(a => {
if(a[0] in stock){
stock[a[0]] += Number(a.split(" ")[1])
}
})
for(const key in stock) {
result.push(`(${key} : ${stock[key]})`)
}
return result.join(' - ')
}