この記事では、Perl Weekly Challenge #287 の 2 つの課題、つまり弱いパスワードの強化と数値の検証に取り組みます。 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();Goの実装
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) } } }数値の検証
2 番目のタスクには、数値の検証が含まれます。目的は、指定された文字列が有効な数値を表しているかどうかを判断することです。有効な数値の基準は次のとおりです:
- 整数の後にオプションで指数表記が続きます。
- 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