aboutsummaryrefslogtreecommitdiffstats
path: root/passcheck.py
diff options
context:
space:
mode:
Diffstat (limited to 'passcheck.py')
-rwxr-xr-xpasscheck.py88
1 files changed, 86 insertions, 2 deletions
diff --git a/passcheck.py b/passcheck.py
index 54e2b74..0e55a17 100755
--- a/passcheck.py
+++ b/passcheck.py
@@ -21,9 +21,93 @@
import sys
+def _class(char):
+ char = ord(char)
+ if ord('0') <= char <= ord('9'):
+ return 1
+ elif ord('a') <= char <= ord('z'):
+ return 2
+ elif ord('A') <= char <= ord('Z'):
+ return 2.5
+ elif char < (1 << 7):
+ return 3
+ elif char < (1 << 8):
+ return 3.5
+ elif char < (1 << 10):
+ return 4
+ elif char < (1 << 14):
+ return 5
+ elif char < (1 << 16):
+ return 6
+ elif char < (1 << 18):
+ return 7
+ elif char < (1 << 22):
+ return 8
+ elif char < (1 << 26):
+ return 9
+ else:
+ return 10
+
+
+def distance(a, b):
+ if a == b:
+ return 0
+ L1 = '1234567890'
+ L2 = 'wertyuiop'
+ L3 = 'asdfghjkl'
+ L4 = 'zxcvbnm'
+ keys = {}
+ for x in range(len(L1)):
+ keys[L1[x]] = (x, 0)
+ for x in range(len(L2)):
+ keys[L2[x]] = (x + 0.25, 1)
+ for x in range(len(L3)):
+ keys[L3[x]] = (x + 0.5, 2)
+ for x in range(len(L4)):
+ keys[L4[x]] = (x + 1, 3)
+ for c in (a, b):
+ if c not in keys:
+ return 15
+ return ((keys[a][0] - keys[b][0]) ** 2 + (keys[a][1] - keys[b][1]) ** 2) ** 0.5
+
+
+
def evaluate(data):
- rc = 4.5
- return rc // 1
+ rc = 0
+ last = None
+ data = bytes(data).decode('utf-8', 'replace')
+ used = {}
+ classes = [0] * 12
+ for c in data:
+ r = _class(c)
+ if c not in used:
+ used[c] = 1
+ else:
+ used[c] += 1
+ rc += r ** 2
+ rc += 5 / used[c]
+ if r >= 4:
+ r += 2
+ elif r > 3:
+ r = 5
+ elif r == 3:
+ r = 4
+ elif r > 2:
+ r = 3
+ classes[r - 1] += 1
+ if last is not None:
+ r = distance(c, last) / 5
+ rc += r ** 0.5
+ last = c
+ if rc >= 0:
+ rc += 30
+ (a, b, c, d) = classes[:4]
+ if a + b + c + d == 0:
+ rc += 30
+ else:
+ r = a ** 2 + b ** 2 + c ** 2 + d ** 2
+ rc += 30 * len(data) / (r ** 0.5)
+ return (rc + 0.5) // 1
raw = ('--raw' in sys.argv[1:]) or ('-r' in sys.argv[1:])