aboutsummaryrefslogtreecommitdiff
path: root/challenge-287/paulo-custodio/python/ch-1.py
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2024-09-18 19:59:32 +0100
committerGitHub <noreply@github.com>2024-09-18 19:59:32 +0100
commit85073f31dae3decce780d1fd66cdcb79c82c7f65 (patch)
tree318d3bc02836f4cde215f7f15e9ec875c74a1490 /challenge-287/paulo-custodio/python/ch-1.py
parentbfe139d559d498bcf1ae48cc08520bfc99ee9b85 (diff)
parent51c035e04c5ae5f9f02555206f57eb675a737617 (diff)
downloadperlweeklychallenge-club-85073f31dae3decce780d1fd66cdcb79c82c7f65.tar.gz
perlweeklychallenge-club-85073f31dae3decce780d1fd66cdcb79c82c7f65.tar.bz2
perlweeklychallenge-club-85073f31dae3decce780d1fd66cdcb79c82c7f65.zip
Merge pull request #10860 from pauloscustodio/master
Add Python solutions
Diffstat (limited to 'challenge-287/paulo-custodio/python/ch-1.py')
-rw-r--r--challenge-287/paulo-custodio/python/ch-1.py98
1 files changed, 98 insertions, 0 deletions
diff --git a/challenge-287/paulo-custodio/python/ch-1.py b/challenge-287/paulo-custodio/python/ch-1.py
new file mode 100644
index 0000000000..2075f31565
--- /dev/null
+++ b/challenge-287/paulo-custodio/python/ch-1.py
@@ -0,0 +1,98 @@
+#!/usr/bin/env python3
+
+# Challenge 287
+#
+# Task 1: Strong Password
+# Submitted by: Mohammad Sajid Anwar
+#
+# You are given a string, $str.
+#
+# Write a program to return the minimum number of steps required to make the
+# given string very strong password. If it is already strong then return 0.
+#
+# Criteria:
+#
+# - It must have at least 6 characters.
+# - It must contains at least one lowercase letter, at least one upper case
+# letter and at least one digit.
+# - It shouldn't contain 3 repeating characters in a row.
+#
+# Following can be considered as one step:
+#
+# - Insert one character
+# - Delete one character
+# - Replace one character with another
+#
+# Example 1
+#
+# Input: $str = "a"
+# Output: 5
+#
+# Example 2
+#
+# Input: $str = "aB2"
+# Output: 3
+#
+# Example 3
+#
+# Input: $str = "PaaSW0rd"
+# Output: 0
+#
+# Example 4
+#
+# Input: $str = "Paaasw0rd"
+# Output: 1
+#
+# Example 5
+#
+# Input: $str = "aaaaa"
+# Output: 2
+
+import re
+import sys
+
+def is_strong(password):
+ if len(password) < 6:
+ return False
+ elif not re.search(r'[a-z]', password):
+ return False
+ elif not re.search(r'[A-Z]', password):
+ return False
+ elif not re.search(r'[0-9]', password):
+ return False
+ elif re.search(r'(.)\1\1+', password):
+ return False
+ else:
+ return True
+
+def charset(a, b):
+ return "".join([chr(x) for x in range(ord(a), ord(b)+1)])
+
+def next_char(password):
+ avail_chars = ""
+ if not re.search(r'[a-z]', password):
+ avail_chars += charset('a', 'z')
+ if not re.search(r'[A-Z]', password):
+ avail_chars += charset('A', 'Z')
+ if not re.search(r'[0-9]', password):
+ avail_chars += charset('0', '9')
+ avail_chars += charset('a', 'z')
+ avail_chars += charset('A', 'Z')
+ avail_chars += charset('0', '9')
+
+ for ch in password:
+ avail_chars, _ = re.subn(ch, '', avail_chars)
+
+ return avail_chars[0]
+
+def steps_to_strong(password):
+ steps = 0
+ while not is_strong(password):
+ if re.search(r'(.)\1\1+', password):
+ password = re.sub(r'(.)\1\1', r'\1\1'+next_char(password)+'\1', password)
+ else:
+ password += next_char(password)
+ steps += 1
+ return steps
+
+print(steps_to_strong(sys.argv[1]))