Giả sử chúng ta có một số thẻ tín dụng. Chúng ta phải kiểm tra xem số thẻ có hợp lệ hay không. Các số thẻ có những thuộc tính sau:
Sẽ bắt đầu bằng 4, 5 và 6
Sẽ dài 16 chữ số
Chỉ chứa chữ số
Có thể có chữ số được chia thành 4 nhóm tách bằng '-'
Không được dùng phân tách khác như dấu cách hoặc gạch dưới
Không được có 4 hoặc nhiều chữ số liên tiếp giống nhau
Vì vậy, nếu đầu vào là s = "5423-2578-8632-6589", thì đầu ra sẽ là True.
Để giải quyết vấn đề này, chúng ta sẽ làm theo các bước sau:
- nếu số lượng '-' trong s lớn hơn 0, thì
- a := danh sách các phần tách bằng "-"
- p:= 1
- nếu kích thước a không bằng 4, thì p:= null, a:= danh sách rỗng
- với mỗi b trong a, thực hiện
- nếu kích thước b không bằng 4, thì p:= null, thoát vòng lặp
- ngược lại,
- p := tìm chuỗi con bắt đầu bằng 4 hoặc 5 hoặc 6 và 15 chữ số còn lại
- s := bỏ "-" khỏi s
- q := tìm chuỗi con có 4 hoặc nhiều ký tự liên tiếp giống nhau
- nếu p không null và q là null, thì trả về True
- ngược lại, trả về False
Ví dụ
Hãy xem triển khai sau để hiểu rõ hơn:
import re
def solve(s):
if s.count("-")>0:
a = s.split("-")
p=1
if len(a)!=4:
p=None
a=[]
for b in a:
if len(b)!=4:
p=None
break
else:
p = re.search("[456][0-9]{15}",s)
s = s.replace("-","")
q = re.search(".*([0-9])\\1{3}.*",s)
if p!=None and q==None:
return True
else:
return False
s = "5423-2578-8632-6589"
print(solve(s))
Đầu vào
"5423-2578-8632-6589"
Đầu ra
False