Think about Loose Coupling PerlMonks

### Re: breaking an array into nearly equal parts

by revdiablo (Prior)
 on Dec 14, 2005 at 02:06 UTC ( #516499=note: print w/replies, xml ) Need Help??

in reply to breaking an array into nearly equal parts

Did you notice a pattern in the table you pasted? It looks like it contains all the information you need. It's basically like this:

If \$x%3 is 0, the arrays should all be of size \$x/3. If \$x%3 is not 0, there should be \$x-(\$x%3) arrays of size \$x/3 and \$x%3 of size \$x/3+1.

I'm not positive this will continue to hold true, but it looks good from what you've shown. There may be a simpler algorithm too, so I would be happy to see other replies. :-)

Replies are listed 'Best First'.
Re^2: breaking an array into nearly equal parts
by spiritway (Vicar) on Dec 14, 2005 at 05:40 UTC

You're right - and the pattern holds true. A positive integer can either be exactly divisible by three, have a remainder of 1, or a remainder of 2. Your idea is probably one of the simplest.

It is quite simple. Here's an implementation. The apportion figures out chunk sizes; multi_slice returns slices of those sizes. The for block runs a few examples.
```sub apportion {
my (\$elements, \$pieces) = @_;
my \$small_chunk = int \$elements / \$pieces;
my \$oversized_count = \$elements % \$pieces;
((1 + \$small_chunk) x (\$oversized_count), (\$small_chunk) x (\$pieces
+- \$oversized_count));
}

sub multi_slice {
my (\$aref, @chunk_sizes) = @_;
my \$hi_i = -1;
map {
my \$lo_i = \$hi_i + 1;
\$hi_i += \$_;
[@\$aref[\$lo_i..\$hi_i]]
} @chunk_sizes;
}

for my \$try ([16,3], [17,4], [19,3]) {
print "\$try->[0] elements into \$try->[1] pieces:\n";
print "Sizes: ", join(', ', apportion(@\$try)), "\n";
print "@\$_\n" for multi_slice([1..\$try->[0]], apportion(@\$try));
}
[download]```

Caution: Contents may have been coded under pressure.

Log In?
 Username: Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://516499]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (2)
As of 2022-08-17 16:25 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?

No recent polls found

Notices?