"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > استكشاف قوة كلمة المرور والتحقق من صحة الأرقام في Perl and Go

استكشاف قوة كلمة المرور والتحقق من صحة الأرقام في Perl and Go

تم النشر بتاريخ 2024-11-18
تصفح:535

Exploring Password Strength and Number Validation in Perl and Go

في هذه المقالة، سأتناول تحديين من تحدي Perl الأسبوعي رقم 287: تعزيز كلمات المرور الضعيفة والتحقق من صحة الأرقام. سأقدم حلولاً لكلتا المهمتين، مع عرض التطبيقات في Perl وGo.

جدول المحتويات

  1. تقوية كلمات المرور الضعيفة
  2. التحقق من الأرقام
  3. خاتمة

تقوية كلمات المرور الضعيفة

المهمة الأولى هي تحديد الحد الأدنى لعدد التغييرات اللازمة لجعل كلمة المرور قوية. معايير كلمة المرور القوية هي:

  1. يحتوي على 6 أحرف على الأقل.
  2. يحتوي على حرف صغير واحد وحرف كبير ورقم واحد على الأقل.
  3. لا تحتوي على ثلاثة أحرف متطابقة متتالية.

أمثلة

  • الإدخال: "أ" → الإخراج: 5
  • الإدخال: "aB2" → الإخراج: 3
  • الإدخال: "PaaSW0rd" → الإخراج: 0
  • الإدخال: "Paaasw0rd" → الإخراج: 1
  • الإدخال: "aaaaa" → الإخراج: 2

الحل

تنفيذ بيرل

#!/usr/bin/perl
use strict;
use warnings;
use List::Util 'max';

# Function to count groups of three or more repeating characters
sub count_repeats {
    my ($str) = @_;
    my $repeats = 0;

    # Find repeating characters and count the required changes
    while ($str =~ /(.)\1{2,}/g) {
        $repeats  = int(length($&) / 3);
    }

    return $repeats;
}

# Function to calculate the minimum steps to create a strong password
sub minimum_steps_to_strong_password {
    my ($str) = @_;
    my $length = length($str);

    # Check if the password contains the required character types
    my $has_lower = $str =~ /[a-z]/;
    my $has_upper = $str =~ /[A-Z]/;
    my $has_digit = $str =~ /\d/;

    # Calculate the number of types needed
    my $types_needed = !$has_lower   !$has_upper   !$has_digit;
    my $repeats = count_repeats($str);

    # Return the minimum steps based on the length of the password
    return ($length 



اختبارات تنفيذ بيرل

use strict;
use warnings;
use Test::More;
require "./ch-1.pl";

my @tests = (
    ["a", 5],
    ["aB2", 3],
    ["PaaSW0rd", 0],
    ["Paaasw0rd", 1],
    ["aaaaa", 2],
);

foreach my $test (@tests) {
    my ($input, $expected) = @$test;
    my $result = minimum_steps_to_strong_password($input);
    is($result, $expected, "Input: '$input'");
}

done_testing();

الذهاب إلى التنفيذ

package main

import (
    "regexp"
)

func countRepeats(password string) int {
    repeats := 0
    count := 1

    for i := 1; i  b {
        return a
    }
    return b
}

اختبارات لتنفيذ Go

package main

import (
    "testing"
)

func TestMinimumStepsToStrongPassword(t *testing.T) {
    tests := []struct {
        password string
        expected int
    }{
        {"a", 5},
        {"aB2", 3},
        {"PaaSW0rd", 0},
        {"Paaasw0rd", 1},
        {"aaaaa", 2},
    }

    for _, test := range tests {
        result := minimumStepsToStrongPassword(test.password)
        if result != test.expected {
            t.Errorf("For password '%s', expected %d but got %d", test.password, test.expected, result)
        }
    }
}

التحقق من صحة الأرقام

المهمة الثانية تتضمن التحقق من صحة الأرقام. الهدف هو تحديد ما إذا كانت سلسلة معينة تمثل رقمًا صالحًا. معايير الرقم الصحيح هي:

  1. عدد صحيح يتبعه بشكل اختياري ترميز أسي.
  2. رقم عشري متبوع اختياريًا بالتدوين الأسي.
  3. قد يحتوي العدد الصحيح بشكل اختياري على علامة (- أو ) متبوعة بأرقام.

أمثلة

  • الإدخال: "1" → الإخراج: صحيح
  • الإدخال: "أ" → الإخراج: خطأ
  • مدخل: "." → الإخراج: خطأ
  • الإدخال: "1.2e4.2" → الإخراج: خطأ
  • الإدخال: "-1." → الإخراج: صحيح
  • الإدخال: "1E-8" → الإخراج: صحيح
  • الإدخال: ".44" → الإخراج: صحيح

الحل

تنفيذ بيرل

#!/usr/bin/perl
use strict;
use warnings;

sub is_valid_number {
    my ($str) = @_;

    # Regex for valid numbers
    my $regex = qr{
        ^            # Start of the string
        [ -]?        # Optional sign
        (?:          # Start of the number group
            \d       # Integer: at least one digit
            (?:      # Start of the optional decimal part
                \.   # Decimal point
                \d*  # Followed by zero or more digits
            )?       # Group is optional
            |        # or
            \.       # Just a decimal point
            \d       # Followed by one or more digits
        )            # End of the number group
        (?:          # Start of the optional exponent group
            [eE]     # 'e' or 'E'
            [ -]?    # Optional sign
            \d       # Followed by one or more digits
        )?           # Exponent is optional
        $            # End of the string
    }x;

    # Return 1 for valid, 0 for invalid
    return $str =~ $regex ? 1 : 0;
}

1;

اختبارات تنفيذ بيرل

#!/usr/bin/perl
use strict;
use warnings;
use Test::More;

require './ch-2.pl';

# Define test cases
my @test_cases = (
    ["1", 1, 'Valid integer'],
    ["a", 0, 'Invalid input'],
    [".", 0, 'Single dot'],
    ["1.2e4.2", 0, 'Invalid exponent'],
    ["-1.", 1, 'Valid decimal'],
    [" 1E-8", 1, 'Valid scientific notation'],
    [".44", 1, 'Valid decimal starting with dot'],
);

# Loop through test cases and run tests
foreach my $case (@test_cases) {
    my $result = is_valid_number($case->[0]);
    is($result, $case->[1], $case->[2]);
}

done_testing();

الذهاب إلى التنفيذ

package main

import (
    "regexp"
)

// isValidNumber checks if the given string is a valid number.
func isValidNumber(str string) bool {
    regex := `^[ -]?((\d (\.\d*)?)|(\.\d ))([eE][ -]?\d )?$`
    matched, _ := regexp.MatchString(regex, str)
    return matched
}

اختبارات لتنفيذ Go

package main

import (
    "testing"
)

func TestIsValidNumber(t *testing.T) {
    testCases := []struct {
        input    string
        expected bool
    }{
        {"1", true},
        {"a", false},
        {".", false},
        {"1.2e4.2", false},
        {"-1.", true},
        {" 1E-8", true},
        {".44", true},
    }

    for _, tc := range testCases {
        result := isValidNumber(tc.input)
        if result != tc.expected {
            t.Errorf("isValidNumber(%q) = %v; expected %v", tc.input, result, tc.expected)
        }
    }
}

خاتمة

توفر هذه الحلول طرقًا فعالة لتقييم قوة كلمة المرور والتحقق من صحة الأرقام. الكود الكامل لكلا المهمتين متاح على GitHub.

بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/aplgr/exploring-password-strength-and-number-validation-in-perl-and-go-529p?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ Study_golang@163 .com لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3