I've run into an odd sorting problem, one that happens all the time in the real world, but I can't think of a determinate solution for it. I think it's an interesting problem and (would be) a useful algorithm to have around. I'm still working on it, but have only managed to come up with solutions that work for certain cases and not others. Perhaps this is because the only thing I learned in statistics (lo, these *many* years ago) is how to sleep with my eyes open...
The problem: how do you arrange two arrays so that the elements of @a are "spread apart" as far as possible by the elements of @b? In other words, given
I need to produce results like these:sub interleave { # PNAMBIC; I'm just making two arrays using length args @a = split //, "A" x shift; @b = split //, "B" x shift; # Some magic happens here with @$a and @$b }
etc.# These are just demonstrator edge cases interleave(1, 1); AB interleave(2, 1); ABA ### This is the good stuff interleave(1, 2); ABB # BAB and BBA are also fine interleave(2, 2); ABBA interleave(3, 3); ABABBA # ABBABA is also fine interleave(4, 14); ABBBBABBBBBABBBBBA # 'B' strings can be swapped around interleave(7, 4); ABABABABAAA
Or, to put it a different way - given a barbecue, a bunch of beef cubes, and a number of cherry tomatoes, how would you arrange the skewers in such a way that a) there's a beef chunk at the beginning and the end of every skewer, b) each skewer is arranged in as even a manner as possible, and c) you use up all the beef and all the tomatoes? (NO, that's *not* the real problem... :) As I've said, it's common in the real world - us humans just tend to think of it as "arranging things neatly and fairly", but coming up with an algorithm is something else entirely.
I'd be grateful for any help that you folks can provide.
In reply to Spreading out the elements by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |