in reply to formatting output question (use of recursive subroutine?)

It won't produce 'optimal' results, but for display purposes it will probably be 'good enough'. It also has the virtues of being simple and determanistic (fast).

Basically, sort the segment/length pairs ascending by segment, descending by length. Scan the sorted array backward putting the next value into the current group (line) if it doesn't overlap the previous entry. When you can fit no more, start a new group (line). Repeat until no more bits:

#! perl -slw use strict; use Data::Dump qw[ pp ]; ## Generate some data my $string = '1234567890' x 7; my @bits = map[ int rand length $string, 2 + int rand 10 ], 1 .. 20; ## Sort ascending offset/descending length @bits = sort{ $a->[ 0 ] <=> $b->[ 0 ] || $b->[ 1 ] <=> $a->[ 1 ] } @bits; ## build groups my @groups; ## Till done while( @bits ) { ## start a new group with the last bit push @groups, [ pop @bits ]; ## Scan the rest of the bits (backward so we can splice without ba +d kharma) for my $bit ( reverse 0 .. $#bits ) { ## if it'll fit in this line if( $bits[ $bit ][ 0 ]+ $bits[ $bit ][ 1 ] < $groups[-1][-1][0 +] ) { ## add it push @{ $groups[-1] }, splice @bits, $bit, 1; } } } ## display the results print $string; for my $group ( @groups ){ my $line = ' ' x 70; for my $bit ( @{ $group } ) { substr $line, $bit->[ 0 ], $bit->[ 1 ], substr $string, $bit->[ 0 ], $bit->[ 1 ]; } print $line; } __END__ c:\test>700817.pl 1234567890123456789012345678901234567890123456789012345678901234567890 23 89 4567890 567890123 9012 567890123 012 0 234567890 56789012345 901234567 45678 123456789 45678 3456789012 890123 90123456 3456789 234 90123456 c:\test>700817.pl 1234567890123456789012345678901234567890123456789012345678901234567890 2345 890123 6789012 5678 234567 012345 2345 90 5678901234 789012345 12345 67890123 01234 90 45678901 6789 234567890 34567 0123456789 9012345 c:\test>700817.pl 1234567890123456789012345678901234567890123456789012345678901234567890 1234567 34567 234567890 9012 0 345678901 5678901 6789012 89012 567890 23456789012 567890 234567890 4567890123 789012345 0123456789 5678901234 45678901234 89012345 56789012345 c:\test>700817.pl 1234567890123456789012345678901234567890123456789012345678901234567890 123456 90 56789012 56789 567 234567 1234 234567890 67 123456789 23456 345678901 01234 678901234 1234 890 890123456 89012 678901234 45678901

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
"Too many [] have been sedated by an oppressive environment of political correctness and risk aversion."

Replies are listed 'Best First'.
Re^2: formatting output question (use of recursive subroutine?)
by rogerd (Sexton) on Jul 30, 2008 at 12:20 UTC

    Thank you very much... I think that with some modifications to extract the offset and the length of the subsequences from my nested structure, and being able to sort them this will work very well. I am studying the code, it is not very easy for me yet to understand code written by others.

    Thank you again, Roger

      it is not very easy for me yet to understand code written by others.

      We all have that trouble :) Maybe this annotation will help. I'm always wary of doing this because I tend to comment on the things I think are significant, rather than on those that the reader will consider so. But Maybe it will help you.

      Note: You could make @bits hold [ offset, $subsequence ]. You would then have to use length( $bit[ n ][ 1 ] ) everywhere I've used $bit[ n ][ 1 ].

      #! perl -slw use strict; ## Generate some data my $string = '1234567890' x 7; ## This just generates some random subsequences as offset/length pairs ## Array of Arrays (AoA): $bits[ n ] = [ offset, length] my @bits = map [ int rand length $string, 2 + int rand 10 ], 1 .. 20; ## Sort ascending offset/descending length @bits = sort{ $a->[ 0 ] <=> $b->[ 0 ] ## sort on the offsets of $a & $b || ## And if they are equal $b->[ 1 ] <=> $a->[ 1 ] ## on the lengths (reversed} } @bits; ## Result ex: @bits =( [2,5],[2,3],[3,1][4,4],[4,3] etc. ## @groups will become an AoAoA. ## Individual offset/length pairs are moved from @bits ## into @groups[n][m] Where ## n := line of output ## m := non-overlapping pair in line ## $groups[ n ] = [ [ offset1, length1], ...], [[,],[,]],...] my @groups; ## As we're moving pairs from @bits to @groups[n] ## When @bits is empty, we know we're done. while( @bits ) { ## start a new group with the last (rightmost shortest) item in @b +its ## First time around the while loop, first line of output; 2nd tim +e 2nd line push @groups, [ pop @bits ]; ## look at each of the remaining pairs in @bits ## scanning backwards because we are removing elements from @bits ## and if we went forward, removing element i would screw up the i +ndexing ## for elements i+1 .. i+n. for my $bit ( reverse 0 .. $#bits ) { ## if it'll fit in this line ## compare the last position (offset+length) for the current b +it ## against the first position (offset) of the last element of +the ## last group (line) if( $bits[ $bit ][ 0 ]+ $bits[ $bit ][ 1 ] < $groups[-1][-1][0 +] ) { ## If it's is less (moving backward!), add it. push @{ $groups[-1] }, splice @bits, $bit, 1; } } ## When the for loop ends, we've scanned all the bits and moved ## any that will fit in the current line without overlap. ## So now, if there are any left (while(@bits)) loop back to ## push another anon array onto @group add ing the now last elemen +t ## of @bits as a starting point. Repeat the for loop. } ## display the results print $string; for my $group ( @groups ){ my $line = ' ' x 70; for my $bit ( @{ $group } ) { substr $line, $bit->[ 0 ], $bit->[ 1 ], substr $string, $bit->[ 0 ], $bit->[ 1 ]; } print $line; }

      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

        Thank you!!! that was very nice commented! You helped me a lot. I am working now on adapting your code to my script. When I finish, I will post the final result.