-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
65 lines (59 loc) · 1.83 KB
/
index.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
54
55
56
57
58
59
60
61
62
63
64
65
class KaprekarCount {
constructor() {}
_getDesc(number) {
const aNumbers = number.split('');
const aSorted = aNumbers.sort();
const aReversed = aSorted.reverse();
const sReversed = aReversed.join(',');
return parseInt(sReversed.replaceAll(',', ''));
}
_getAsc(number) {
const aNumbers = number.split('');
const aSorted = aNumbers.sort();
const sSorted = aSorted.join(',');
return parseInt(sSorted.replaceAll(',', ''));
}
_isValid(number) {
const sNumber = number.toString();
const numberReworked = Array.from(new Set(sNumber.split(''))).toString();
return numberReworked.length !== 1;
}
_leadingZero(number) {
const aNumbers = number.split('');
const aSorted = aNumbers.sort();
return aSorted[0] === '0';
}
_getConstantToUse(number) {
if (!this._isValid(number))
throw new Error(
'This process fails for numbers made of repeating integers such as 1111 or 333 ecc. https://en.wikipedia.org/wiki/Kaprekar%27s_routine'
);
if (this._leadingZero(number)) {
throw new Error(
"No number with leading 0 allowed, i don't have time for a solution sorry"
);
}
if (number.length === 3) return 495;
if (number.length === 4) return 6174;
throw new Error('Only numbers with 3 or 4 digits are allowed');
}
cycle(number) {
let cycles = [];
const sNumber = number.toString();
const Kaprekar = this._getConstantToUse(sNumber);
let desc = this._getDesc(sNumber);
let asc = this._getAsc(sNumber);
let diff = desc - asc;
while (diff !== Kaprekar) {
cycles.push(diff);
desc = this._getDesc(diff.toString());
asc = this._getAsc(diff.toString());
diff = desc - asc;
}
return cycles;
}
cycleCount(number) {
return this.cycle(number).length;
}
}
module.exports = KaprekarCount;