in reply to Minimal password checking: a summary
well, if you right rotate instead, you can use chop.
sub rot_same { my( $word )= @_; my %seen; for(1..length $word) { ## rotate right $word= chop($word) . $word; return 1 if exists $seen{$word}; $seen{$word}++; } } print $_, ' => ', rot_same($_), $/ for qw(abcdef aaaaaa abcabc); __END__ abcdef => aaaaaa => 1 abcabc => 1
and if you calculate the maximum number of same characters once, it will speed things up.
sub too_many_repetitions { my( $word )= @_; my $same_char_percent= 0.5; my $max_same_char= $same_char_percent * length $word; my @chars= split // => $word; my %seen; $seen{$_}++ for @chars; return 1 if $max_same_char < pop @{[sort values %seen]}; } print $_, ' => ', too_many_repetitions($_), $/ for qw(abcdef aaaaaa abcabc); __END__ abcdef => aaaaaa => 1 abcabc =>
~Particle *accelerates*
|
|---|