„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Erkundung der Passwortstärke und Nummernvalidierung in Perl und Go

Erkundung der Passwortstärke und Nummernvalidierung in Perl und Go

Veröffentlicht am 18.11.2024
Durchsuche:378

Exploring Password Strength and Number Validation in Perl and Go

In diesem Artikel werde ich zwei Herausforderungen aus der Perl Weekly Challenge Nr. 287 angehen: die Stärkung schwacher Passwörter und die Validierung von Zahlen. Ich werde Lösungen für beide Aufgaben bereitstellen und Implementierungen in Perl und Go vorstellen.

Inhaltsverzeichnis

  1. Schwäche Passwörter stärken
  2. Zahlen validieren
  3. Abschluss

Schwache Passwörter stärken

Die erste Aufgabe besteht darin, die Mindestanzahl an Änderungen zu bestimmen, die erforderlich sind, um ein Passwort sicher zu machen. Die Kriterien für ein sicheres Passwort sind:

  1. Es hat mindestens 6 Zeichen.
  2. Es enthält mindestens einen Kleinbuchstaben, einen Großbuchstaben und eine Ziffer.
  3. Es enthält nicht drei aufeinanderfolgende identische Zeichen.

Beispiele

  • Eingabe: „a“ → Ausgabe: 5
  • Eingabe: „aB2“ → Ausgabe: 3
  • Eingabe: „PaaSW0rd“ → Ausgabe: 0
  • Eingabe: „Paaasw0rd“ → Ausgabe: 1
  • Eingabe: „aaaaa“ → Ausgabe: 2

Die Lösung

Perl-Implementierung

#!/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 



Tests für die Perl-Implementierung

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();

Gehen Sie zur Implementierung

package main

import (
    "regexp"
)

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

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

Tests für die Go-Implementierung

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)
        }
    }
}

Validierung von Zahlen

Die zweite Aufgabe besteht darin, Zahlen zu validieren. Das Ziel besteht darin, festzustellen, ob eine bestimmte Zeichenfolge eine gültige Zahl darstellt. Die Kriterien für eine gültige Nummer sind:

  1. Eine ganze Zahl, optional gefolgt von einer Exponentialschreibweise.
  2. Eine Dezimalzahl, optional gefolgt von einer Exponentialschreibweise.
  3. Eine Ganzzahl kann optional ein Vorzeichen (- oder ) gefolgt von Ziffern haben.

Beispiele

  • Eingabe: „1“ → Ausgabe: wahr
  • Eingabe: „a“ → Ausgabe: falsch
  • Eingabe: „.“ → Ausgabe: falsch
  • Eingabe: „1.2e4.2“ → Ausgabe: falsch
  • Eingabe: „-1.“ → Ausgabe: wahr
  • Eingabe: „ 1E-8“ → Ausgabe: wahr
  • Eingabe: „.44“ → Ausgabe: wahr

Die Lösung

Perl-Implementierung

#!/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;

Tests für die Perl-Implementierung

#!/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();

Gehen Sie zur Implementierung

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
}

Tests für die Go-Implementierung

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)
        }
    }
}

Abschluss

Diese Lösungen bieten effektive Methoden zur Bewertung der Passwortstärke und zur Validierung der Richtigkeit von Zahlen. Der vollständige Code für beide Aufgaben ist auf GitHub verfügbar.

Freigabeerklärung Dieser Artikel wird unter: https://dev.to/aplgr/exploring-password-strength-number-validation-in-perl-and-529p?1 reproduziert.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3