in reply to finding tuples

I'm not at all sure if this is what is required. It only takes tuples of all the same letter if they are at the start of the string.

use strict; use warnings; my @sets = qw{ AAAAADDDDDEFFGMMSSTVVVVV AADDDEEEEFFFFGGMMMMMMMMMMSTV }; foreach my $set ( @sets ) { print qq{$set\n}; my @tuples; while ( length $set >= 4 ) { if ( $set =~ m{^(.)\1{3}} ) { push @tuples, substr $set, 0, 4, q{}; } else { my @boundaries = ( 0 ); push @boundaries, pos $set while $set =~ m{(.)(?=.)(?!\1)} +g; last if scalar @boundaries < 3; push @tuples, join q{}, reverse map substr( $set, $_, 1, q{} ), reverse @boundaries[ 0 .. 3 ]; } } print qq{ $_\n} for @tuples; print qq{ Left over: $set\n} if $set; }

The output.

AAAAADDDDDEFFGMMSSTVVVVV AAAA ADEF DDDD FGMS MSTV VVVV AADDDEEEEFFFFGGMMMMMMMMMMSTV ADEF ADEF DEFG EFGM MMMM MMMM MSTV

I hope this is of interest.

Cheers,

JohnGG

Replies are listed 'Best First'.
Re^2: finding tuples
by Anonymous Monk on Jun 24, 2009 at 08:13 UTC

    Thanks for the program, it gave me insight how to do decomposition in a better way what I have programmed earlier.

    Your program deals well with same-tuples but forms 4-tuples that are not consecutive. Consider the sets ADEFGSTV or AEEGSSVV which have no solution. I'll hack on it to see whether I can extend it to reject those sets.