diff options
Diffstat (limited to 'challenge-287/paulo-custodio/python')
| -rw-r--r-- | challenge-287/paulo-custodio/python/ch-1.py | 98 | ||||
| -rw-r--r-- | challenge-287/paulo-custodio/python/ch-2.py | 77 |
2 files changed, 175 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])) diff --git a/challenge-287/paulo-custodio/python/ch-2.py b/challenge-287/paulo-custodio/python/ch-2.py new file mode 100644 index 0000000000..9e3a00ea6a --- /dev/null +++ b/challenge-287/paulo-custodio/python/ch-2.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 + +# Challenge 287 +# +# Task 2: Valid Number +# Submitted by: Mohammad Sajid Anwar +# +# You are given a string, $str. +# +# Write a script to find if it is a valid number. +# +# Conditions for a valid number: +# +# - An integer number followed by an optional exponent. +# - A decimal number followed by an optional exponent. +# - An integer number is defined with an optional sign '-' or '+' followed by digits. +# +# Decimal Number: +# +# A decimal number is defined with an optional sign '-' or '+' followed by one +# of the following definitions: +# - Digits followed by a dot '.'. +# - Digits followed by a dot '.' followed by digits. +# - A dot '.' followed by digits. +# +# Exponent: +# +# An exponent is defined with an exponent notation 'e' or 'E' followed by an integer number. +# +# Example 1 +# +# Input: $str = "1" +# Output: true +# +# Example 2 +# +# Input: $str = "a" +# Output: false +# +# Example 3 +# +# Input: $str = "." +# Output: false +# +# Example 4 +# +# Input: $str = "1.2e4.2" +# Output: false +# +# Example 5 +# +# Input: $str = "-1." +# Output: true +# +# Example 6 +# +# Input: $str = "+1E-8" +# Output: true +# +# Example 7 +# +# Input: $str = ".44" +# Output: true + +import re +import sys + +if re.search(r' ^ [-+]? '+ + r' (?: \d+ \. \d* | '+ + r' \d* \. \d+ | '+ + r' \d+ '+ + r' ) '+ + r' (?: e [-+]? \d+ )? '+ + r' $', sys.argv[1], re.X+re.I): + print('true') +else: + print('false') |
