1
const strongPasswordChecker = (passwd) => {
2
let steps = 0;
3
let mustAdd = 0;
4

5
if (!passwd.match(/[A-Z]/)) {
6
mustAdd++;
7
}
8
if (!passwd.match(/[a-z]/)) {
9
mustAdd++;
10
}
11
if (!passwd.match(/\d/)) {
12
mustAdd++;
13
}
14

15
let groups = passwd.match(/(.)\1*/g).filter((x) => x.length > 2);
16

17
if (passwd.length <= 20) {
18
groups.forEach((group) => {
19
steps += Math.trunc(group.length / 3);
20
mustAdd -= Math.trunc(group.length / 3);
21
});
22
}
23

24
if (passwd.length <= 20) {
25
mustAdd = mustAdd > 0 ? mustAdd : 0;
26
if (passwd.length + steps >= 6) {
27
steps += mustAdd;
28
} else {
29
if (mustAdd > 6 - (passwd.length + steps)) {
30
steps += mustAdd;
31
} else {
32
steps += 6 - (passwd.length + steps);
33
}
34
}
35
}
36

37
if (passwd.length > 20) {
38
let mustRemove = passwd.length - 20;
39
let lengths = [];
40
let plus = [];
41
let chL = 0;
42
for (let i = 1; i <= 3; i++) {
43
for (let k = 0; k < groups.length; k++) {
44
if (plus[k] === undefined) {
45
plus[k] = 0;
46
}
47
chL = groups[k].length - plus[k];
48
if (lengths[k] === undefined) {
49
lengths[k] = chL;
50
}
51
const rec = () => {
52
if (
53
Math.trunc((chL - i) / 3) < Math.trunc(chL / 3) &&
54
passwd.length - steps - i >= 6 &&
55
mustRemove >= i &&
56
chL > 2 &&
57
lengths[k] - i > 0
58
) {
59
steps += i;
60
plus[k] += i;
61
mustRemove -= i;
62
chL -= i;
63
lengths[k] -= i;
64
rec();
65
}
66
};
67
rec();
68
}
69
}
70
lengths.forEach((length) => {
71
if (length > 2) {
72
steps += Math.trunc(length / 3);
73
mustAdd -= Math.trunc(length / 3);
74
}
75
});
76

77
mustRemove = mustRemove > 0 ? mustRemove : 0;
78
mustAdd = mustAdd > 0 ? mustAdd : 0;
79
steps += mustAdd + mustRemove;
80
}
81

82
return steps;
83
};

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0