#!/usr/bin/env perl -l use strict; use warnings; my @passwords = qw{ 1234 1243 4321 298761 4562 4568 4578 123 12 1 01234 01243 04321 0298761 04562 04568 04578 0123 012 01 a1234 1a234 12a34 123a4 1234a a1b2c3 a12b34c56 a1b2c3d a12b34c56d a123b45c6 a12b345c6 a123b45c6d a12b345c6d 1a2 1ab2 12ab34 12abc34def 12abc34def567 }; push @passwords, map { scalar reverse } @passwords; my $too_many = 3; check($_, $too_many) for @passwords; sub check { my ($pw, $too_many) = @_; if ($too_many > length $pw) { pw_ok($pw); return; } for my $pw_digit_str (split /\D+/, $pw) { my $pw_digit_str_len = length $pw_digit_str; next if $too_many > $pw_digit_str_len; OFFSET: for my $offset (0 .. $pw_digit_str_len - $too_many) { my $digits = substr $pw_digit_str, $offset, $too_many; my $rev_digits = scalar reverse $digits; my @ints = split //, $digits < $rev_digits ? $digits : $rev_digits; my $test_int = $ints[0]; for (@ints) { if ($test_int != $_) { next OFFSET; } ++$test_int; } pw_nok($pw); return; } } pw_ok($pw); } sub pw_ok { print "Accept: $_[0]" } sub pw_nok { print "Reject: $_[0]" }