http://qs1969.pair.com?node_id=180554


in reply to Puzzle: need a more general algorithm

Another way to do it (works!)

use strict; my @height = qw/ 10 15 25 30 10 13 /; my $columns = 3; my @Best = (); my $Min_height = 1E9; my $Table_height = 0; &check_columns; foreach my $y (0..$Table_height) { foreach my $x (0..$columns) { my $data = ${$Best[$x]}[$y]; print defined $data ? $data : " "; print " "; } print "\n"; } sub check_columns { my $pcat = ( shift or [ 0 .. $#height ] ); my @a = @$pcat; my @b = (); map { push @b, shift @a; my @result = ( [@a], [@b], @_); if ($#result == $columns) { my $max_height = 0; my $table_height = 0; foreach my $j (@result) { my $height = eval join '+' => @height[@$j]; $max_height = $height if $height > $max_height; $table_height = $#{@$j} if $table_height < $#{@$j}; } if ($max_height < $Min_height) { $Min_height = $max_height; @Best = @result; $Table_height = $table_height; } } else { check_columns(@result); } } @a; }

Update: I should have used for (@a) instead of map.

Replies are listed 'Best First'.
Re: Re: Puzzle: need a more general algorithm
by fglock (Vicar) on Jul 09, 2002 at 18:27 UTC

    This is definitely not optimized.

    More than 20 minutes have passed and (50, 1..150) didn't finish yet...

    Update: got Out of memory