in reply to REgular expression to check the string that allows "a","b" and "c" to occur only once in any order.
I was going to create a nasty little test using length, tr///s, m//, and a couple of evals, but I just couldn't bring myself to complete it. Instead, I reached for CPAN and Math::Combinatorics.
Output:use strict; use warnings; use Math::Combinatorics qw( permute ); use Test::More; my @match_wanted = qw( abc bca cab cba bac acb ); my @match_unwanted = qw( aab abbc acc ); my @charset = qw( a b c ); my %valid = map { join( '', @$_ ) => 1 } permute( @charset ); sub match { my $s = shift; return( exists $valid{$s} ? 1 : 0 ); } plan 'tests' => ( scalar @match_wanted + scalar @match_unwanted ); ok( match( $_ ), "matches '$_'" ) for @match_wanted; ok( ! match( $_ ), "does not match '$_'" ) for @match_unwanted;
1..9 ok 1 - matches 'abc' ok 2 - matches 'bca' ok 3 - matches 'cab' ok 4 - matches 'cba' ok 5 - matches 'bac' ok 6 - matches 'acb' ok 7 - does not match 'aab' ok 8 - does not match 'abbc' ok 9 - does not match 'acc'
Thanks and ++ to kyle for the framework.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^2: REgular expression to check the string that allows "a","b" and "c" to occur only once in any order. (permutations)
by ikegami (Patriarch) on Dec 11, 2007 at 06:47 UTC | |
by bobf (Monsignor) on Dec 11, 2007 at 06:55 UTC | |
by ikegami (Patriarch) on Dec 11, 2007 at 07:03 UTC |