이 기사에서는 Perl Weekly Challenge #287의 두 가지 과제인 취약한 비밀번호 강화 및 숫자 유효성 검사에 대해 설명합니다. 저는 Perl과 Go의 구현을 보여주며 두 작업에 대한 솔루션을 제공할 것입니다.
첫 번째 작업은 강력한 비밀번호를 만드는 데 필요한 최소 변경 횟수를 결정하는 것입니다. 강력한 비밀번호의 기준은 다음과 같습니다.
#!/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 ($lengthPerl 구현을 위한 테스트
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) } } }숫자 확인
두 번째 작업에는 숫자 확인이 포함됩니다. 목표는 주어진 문자열이 유효한 숫자를 나타내는지 여부를 확인하는 것입니다. 유효한 숫자의 기준은 다음과 같습니다.
- 지수 표기법이 뒤따르는 정수입니다.
- 선택적으로 지수 표기법이 뒤따르는 10진수입니다.
- 정수에는 선택적으로 기호(- 또는 ) 뒤에 숫자가 올 수 있습니다.
예
#!/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 }
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에서 확인할 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3