Therefore, I present a solution that will use a regular expression to do the hard work. It will report the minimum height that is needed. Calculating the actual partition is left as an exercise for the reader.
Abigail
#!/usr/bin/perl use strict; use warnings 'all'; sub partition ($$); my $columns = 4; my @sizes = qw /10 15 25 30 10 13/; sub partition ($$) { my ($b, $h) = @_; return [(0) x $h] unless $b; return [$b] if $h < 2; map {my $__ = $_; map {[$__ => @$_]} partition $b - $__, $h - 1} 0 + .. $b; } my @r = partition @sizes, $columns; my @regex; foreach my $r (@r) { my $c = 0; push @regex => join ":" => map { $c += my $__ = $_; join ("" => map {"-" x $_} @sizes [$c - $__ .. $c - 1]) . "-*" +} @$r; } my $regex = join "|" => map {"(?:$_)"} @regex; my $try = 1; { exit !print "Minimum required height: $try\n" if join (":" => map {"-" x $try} 1 .. $columns) =~ /$regex/; $try ++; redo; }
In reply to Re: Puzzle: need a more general algorithm
by Abigail-II
in thread Puzzle: need a more general algorithm
by Ovid
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |