-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathconvertFrac.js
More file actions
55 lines (53 loc) · 1.28 KB
/
convertFrac.js
File metadata and controls
55 lines (53 loc) · 1.28 KB
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
54
55
/**
* Description:
*
* Common denominators
*
* You will have a list of rationals in the form
*
* { {numer_1, denom_1} , ... {numer_n, denom_n} }
* or
*
* [ [numer_1, denom_1] , ... [numer_n, denom_n] ]
* or
*
* [ (numer_1, denom_1) , ... (numer_n, denom_n) ]
* where all numbers are positive ints.
*
* You have to produce a result in the form
*
* (N_1, D) ... (N_n, D)
* or
*
* [ [N_1, D] ... [N_n, D] ]
* or
*
* [ (N_1', D) , ... (N_n, D) ]
* or
*
* {{N_1, D} ... {N_n, D}}
* depending on the language (See Example tests)
*
* in which D is as small as possible and
*
* N_1/D == numer_1/denom_1 ... N_n/D == numer_n,/denom_n.
* Example:
*
* convertFracs [(1, 2), (1, 3), (1, 4)] `shouldBe` [(6, 12), (4, 12), (3, 12)]
*/
function convertFrac(lst) {
let commonDenom = ((A) => {
let a = Math.abs(A[0])
return A.reduce((prevA, curr) => {
let b = Math.abs(curr), c = prevA
while (prevA && b) {
prevA > b
? prevA %= b
: b %= prevA
}
return prevA = Math.abs(c*curr) / (prevA+b)
}, a)
})(lst.map(el => el[1]))
return lst.reduce((string, arr) =>
string += '(' + [commonDenom * arr[0] / arr[1], commonDenom].join(',') + ')', '')
}