#!/usr/bin/perl use strict; # Constants (sort of) my $MAIN_BUFFER_SIZE = 20; my $POSSIBLE_VALUES = 'ABCDE'; my $NUMBER_OF_VALUES = length $POSSIBLE_VALUES; # Silly but deal with it # Globals my %RunLength_Info = (); my @MainBuffer = (); # Generate random buffers with probable data overlaps, then scan, then merge { foreach my $bufferPass (0..1) { my $workingBuffer = &generateMainBuffer(); push @MainBuffer, $workingBuffer; &scanBuffer($bufferPass); } &dumpMainBuffer(); &mergeBuffers(); } exit; sub generateMainBuffer { my @genBuffer = (); for (my $bufIndex = 0; $bufIndex < $MAIN_BUFFER_SIZE; $bufIndex++) { my $bufCharValue = int(rand($NUMBER_OF_VALUES)); my $bufChar = substr $POSSIBLE_VALUES, $bufCharValue, 1; push @genBuffer, $bufChar; } my @sortedBuffer = sort @genBuffer; my $generatedBuffer = join '', @sortedBuffer; return $generatedBuffer; } sub scanBuffer { my ($bufferNumber, @garbage) = @_; if (!defined $bufferNumber) { die "Found a short-circuit between the ear buds"; } for (my $bufIndex = 0; $bufIndex < $MAIN_BUFFER_SIZE; $bufIndex++) { my $currChar = substr $MainBuffer[$bufferNumber], $bufIndex, 1; if (!defined $RunLength_Info{$currChar}) { $RunLength_Info{$currChar} = 1; } else { $RunLength_Info{$currChar}++; } } } sub mergeBuffers { my $outBuffer = 0; my $outLength = 0; # Stupid but effective foreach my $bufferClean (0..1) { $MainBuffer[$bufferClean] = ''; } # And the magic foreach my $finalChar (sort keys %RunLength_Info) { my $remCount = $RunLength_Info{$finalChar}; while ($remCount) { if ($outLength < $MAIN_BUFFER_SIZE) { $MainBuffer[$outBuffer] .= $finalChar; $outLength++; $remCount--; } else { $outBuffer++; $outLength = 0; } } } &dumpMainBuffer(); } sub dumpMainBuffer { print "Buffers:\n"; foreach my $aBuffer (@MainBuffer) { print " [$aBuffer]\n"; } } __END__ #### D:\PerlMonks>perl merge1.pl Buffers: [AAAAAABBCCCDDDDEEEEE] [AAAABBBBBBCCCCCDDDDD] Buffers: [AAAAAAAAAABBBBBBBBCC] [CCCCCCDDDDDDDDDEEEEE] D:\PerlMonks>