#!/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]" } #### Reject: 1234 Accept: 1243 Reject: 4321 Reject: 298761 Reject: 4562 Reject: 4568 Accept: 4578 Reject: 123 Accept: 12 Accept: 1 Reject: 01234 Reject: 01243 Reject: 04321 Reject: 0298761 Reject: 04562 Reject: 04568 Accept: 04578 Reject: 0123 Reject: 012 Accept: 01 Reject: a1234 Reject: 1a234 Accept: 12a34 Reject: 123a4 Reject: 1234a Accept: a1b2c3 Accept: a12b34c56 Accept: a1b2c3d Accept: a12b34c56d Reject: a123b45c6 Reject: a12b345c6 Reject: a123b45c6d Reject: a12b345c6d Accept: 1a2 Accept: 1ab2 Accept: 12ab34 Accept: 12abc34def Reject: 12abc34def567 Reject: 4321 Accept: 3421 Reject: 1234 Reject: 167892 Reject: 2654 Reject: 8654 Accept: 8754 Reject: 321 Accept: 21 Accept: 1 Reject: 43210 Reject: 34210 Reject: 12340 Reject: 1678920 Reject: 26540 Reject: 86540 Accept: 87540 Reject: 3210 Reject: 210 Accept: 10 Reject: 4321a Reject: 432a1 Accept: 43a21 Reject: 4a321 Reject: a4321 Accept: 3c2b1a Accept: 65c43b21a Accept: d3c2b1a Accept: d65c43b21a Reject: 6c54b321a Reject: 6c543b21a Reject: d6c54b321a Reject: d6c543b21a Accept: 2a1 Accept: 2ba1 Accept: 43ba21 Accept: fed43cba21 Reject: 765fed43cba21