Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ตัวตรวจสอบรหัสผ่านที่แข็งแกร่งใน Python


สมมติว่าเรามีสตริง รหัสผ่าน เราต้องหาการเปลี่ยนแปลงขั้นต่ำที่จำเป็นในการทำให้รหัสผ่านแข็งแกร่ง ดังนั้นรหัสผ่านจึงมีเกณฑ์ดังต่อไปนี้ -

  • ต้องมีความยาวอย่างน้อย 6 อักขระและไม่เกิน 20 อักขระ
  • ต้องมีอักษรตัวพิมพ์เล็กอย่างน้อยหนึ่งตัว อักษรตัวพิมพ์ใหญ่อย่างน้อยหนึ่งตัว และอักขระตัวเลขอย่างน้อยหนึ่งตัว
  • ต้องไม่มีอักขระที่ซ้ำกันสามตัวในแถวเช่น …aaa…, …PPP…, …888….

ดังนั้นหากอินพุตเป็นเหมือน "aa26bbb" เราจึงจำเป็นต้องเปลี่ยนอย่างน้อยหนึ่งรายการ เนื่องจากไม่มีตัวพิมพ์ใหญ่และมีตัว b อยู่ 3 ตัวติดต่อกัน เราจึงสามารถแทนที่ b ด้วยอักษรตัวพิมพ์ใหญ่หนึ่งตัวเพื่อให้แข็งแรง

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • ตั้งค่า missingTypes :=3.
  • หากมีตัวพิมพ์เล็กอย่างน้อยหนึ่งตัว ให้ลดประเภทที่ขาดหายไป 1
  • หากมีอักษรตัวพิมพ์ใหญ่อย่างน้อยหนึ่งตัว ให้ลดประเภทที่ขาดหายไป 1
  • หากมีอย่างน้อยหนึ่งหมายเลข ให้ลดประเภทที่หายไป 1
  • เปลี่ยน :=0, หนึ่ง :=0 และ สอง :=0, p :=2
  • ในขณะที่ p <ขนาดของ s ทำ
    • ถ้า s[p] เหมือนกับ s[p – 1] และนี่ก็เหมือนกับ s[p - 2] ด้วย ดังนั้น
      • ความยาว :=2
      • ในขณะที่ p <ขนาดของ s และ s[p] =s[p – 1] ทำ
        • ยาว :=ยาว + 1
        • p :=p + 1
      • เปลี่ยน :=เปลี่ยน + ความยาว / 3
      • ถ้าหารด้วย 3 ลงตัว ให้เพิ่ม 1 ด้วย 1
      • มิฉะนั้น เมื่อความยาวหารด้วย 3 ลงตัว ให้เพิ่มสองด้วย 1
    • มิฉะนั้น ให้ p เพิ่มขึ้น 1
  • ถ้าขนาดของ s <6 ให้คืนค่าสูงสุดของ missing_type และ 6 – ขนาดของ s
  • มิฉะนั้นเมื่อขนาดของ s <20 จากนั้นคืนค่าสูงสุดของ missing_type และเปลี่ยน
  • อย่างอื่น
    • ลบ :=ขนาด s – 20
    • เปลี่ยน :=เปลี่ยน – ขั้นต่ำของการลบและหนึ่ง
    • เปลี่ยน :=เปลี่ยน – (ต่ำสุดของ (สูงสุดลบ – หนึ่งและ 0) และสอง * 2)/2
    • เปลี่ยน :=เปลี่ยน – (สูงสุดลบ – หนึ่ง – 2 * สองและ 0)/2
  • คืนค่าการลบ + สูงสุดของ missing_type และการเปลี่ยนแปลง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

class Solution(object):
   def strongPasswordChecker(self, s):
      missing_type = 3
      if any('a' <= c <= 'z' for c in s): missing_type -= 1
      if any('A' <= c <= 'Z' for c in s): missing_type -= 1
      if any(c.isdigit() for c in s): missing_type -= 1
      change = 0
      one = two = 0
      p = 2
      while p < len(s):
         if s[p] == s[p-1] == s[p-2]:
            length = 2
            while p < len(s) and s[p] == s[p-1]:
               length += 1
               p += 1
            change += length / 3
            if length % 3 == 0: one += 1
            elif length % 3 == 1: two += 1
         else:
            p += 1
      if len(s) < 6:
         return max(missing_type, 6 - len(s))
      elif len(s) <= 20:
         return max(missing_type, change)
      else:
         delete = len(s) - 20
         change -= min(delete, one)
         change -= min(max(delete - one, 0), two * 2) / 2
         change -= max(delete - one - 2 * two, 0) / 3
         return delete + max(missing_type, change)
ob = Solution()
print(ob.strongPasswordChecker('aa26bbb'))

อินพุต

“aa26bbb”

ผลลัพธ์

1