The problem
ATM machines enable 4 or 6 digit PIN codes and PIN codes can not comprise something however precisely 4 digits or precisely 6 digits.
If the operate is handed a legitimate PIN string, return true
, else return false
.
Examples
"1234" --> true
"12345" --> false
"a234" --> false
The answer in Python code
Possibility 1:
def validate_pin(pin):
return len(pin) in (4, 6) and pin.isdigit()
Possibility 2:
import re
def validate_pin(pin):
return bool(re.fullmatch("d{4}|d{6}", pin))
Possibility 3:
def validate_pin(pin):
import re
if len(pin) == 4 or len(pin) == 6: #not 4 or 6 digits
if re.search('[^0-9]', pin) == None : #comprises non-digit chars
return True
return False
Check instances to validate our resolution
import take a look at
from resolution import validate_pin
@take a look at.describe("Fastened Exams")
def fixed_tests():
@take a look at.it("ought to return False for pins with size apart from 4 or 6")
def basic_test_cases():
take a look at.assert_equals(validate_pin("1"),False, "Flawed output for '1'")
take a look at.assert_equals(validate_pin("12"),False, "Flawed output for '12'")
take a look at.assert_equals(validate_pin("123"),False, "Flawed output for '123'")
take a look at.assert_equals(validate_pin("12345"),False, "Flawed output for '12345'")
take a look at.assert_equals(validate_pin("1234567"),False, "Flawed output for '1234567'")
take a look at.assert_equals(validate_pin("-1234"),False, "Flawed output for '-1234'")
take a look at.assert_equals(validate_pin("-12345"),False, "Flawed output for '-12345'")
take a look at.assert_equals(validate_pin("1.234"),False, "Flawed output for '1.234'")
take a look at.assert_equals(validate_pin("00000000"),False, "Flawed output for '00000000'")
@take a look at.it("ought to return False for pins which comprise characters apart from digits")
def _():
take a look at.assert_equals(validate_pin("a234"),False, "Flawed output for 'a234'")
take a look at.assert_equals(validate_pin(".234"),False, "Flawed output for '.234'")
@take a look at.it("ought to return True for legitimate pins")
def _():
take a look at.assert_equals(validate_pin("1234"),True, "Flawed output for '1234'")
take a look at.assert_equals(validate_pin("0000"),True, "Flawed output for '0000'")
take a look at.assert_equals(validate_pin("1111"),True, "Flawed output for '1111'")
take a look at.assert_equals(validate_pin("123456"),True, "Flawed output for '123456'")
take a look at.assert_equals(validate_pin("098765"),True, "Flawed output for '098765'")
take a look at.assert_equals(validate_pin("000000"),True, "Flawed output for '000000'")
take a look at.assert_equals(validate_pin("123456"),True, "Flawed output for '123456'")
take a look at.assert_equals(validate_pin("090909"),True, "Flawed output for '090909'")
@take a look at.it("ought to deal with edge instances")
def _():
checks = [
'',
'123',
'12345',
'1234567',
'1234567890',
'1234x',
'123456x',
'12.0',
'1234.0',
'123456.0',
'123n',
'1234n',
'09876n',
'098765n',
'-111',
'111-',
'-44444',
'44444-',
'+111',
'+88888',
'+1111',
'-2018',
'+234567',
'-234567',
'123/',
'456:',
'xbe', # "three quarters" in Python 3, just some byte in Python 2
]
for s in checks:
take a look at.assert_equals(validate_pin(s), False, "Flawed output for '{}'".format(s))
@take a look at.describe("ought to work with random enter")
def random_tests():
from random import randint, selection
from string import ascii_letters, punctuation, digits
all_chars = ascii_letters + punctuation + digits
def resolution(pin):
return len(pin) in (4, 6) and pin.isdigit()
def rand_valid_pin():
size = 4 if randint(0, 1) else 6
return "".be part of(selection(digits) for _ in vary(size))
def rand_pin():
return "".be part of(selection(all_chars) for _ in vary(randint(0, 10)))
for _ in vary(40):
pin = rand_pin() if randint(0, 1) else rand_valid_pin()
@take a look at.it(f"testing for validate_pin({pin})")
def test_case():
take a look at.assert_equals(validate_pin(pin),resolution(pin))