All possible combinations from list

Jeff Thompson's icon

Hi all, I'm trying to wrap my head around this and am guessing there's someone who can point me in the right direction.

I'd like to have a list of numbers from 0-7 (the notes of the major scale, in this case) and have an automated way to create every combination of those numbers to store in a coll.

That means:

0, 1, 2, 3, 4, 5, 6, 7

0 1, 0 2... 2 3, 2 4, 5 7, 6 7, etc

0 1 2, 0 1 3, 0 1 4, etc

up to 0 1 2 3 4 5 6 7

I've been able to successfully do a small version of this with two counter objects that counts from 0-7, then 1-7, 2-7, and so on. Seems like a start but not exactly what I'm looking for.

Can do this by hand, but doing it automatically is more fun and interesting. Any thoughts appreciated!

swieser1's icon

Sounds like you want every octal number from 0 to 1234567. 1234567 in octal is the same as 342391 in decimal.

So, just get a counter to go from 0 to 342391, and then convert from decimal to octal (adding leading zeros if necessary). Here's the first site I could find about the calculations required to convert from decimal to octal:

That's one way to do it anyway. I'm sure there's another combinatorial way to systematically find every combination.

Jeff Thompson's icon

Sorry to not respond sooner, I've been trying to get this working (the basic structure works no problem, formatting and parsing taking a little longer).

Will post the patch this weekend. What I have should be easily changed to convert any decimal number to octal, hexidecimal, etc - something that might be useful to others.

Thanks very much!

Luke Hall's icon

Try this little javascript for converting from one base to another.

lh

Max Patch
Copy patch and select New From Clipboard in Max.
// lh.numeral.js

var inb = jsarguments[1] || 10;
var outb = jsarguments[2] || 2;

basein(inb);
baseout(outb);

function anything() {
    outlet(0,parseInt(arrayfromargs(messagename,arguments)[0],inb).toString(outb));
}

function basein(x) {
    inb = Math.min(Math.max(2,x),36);
}

function baseout(x) {
    outb = Math.min(Math.max(2,x),36);
}

autowatch = 1;

// EOF

seejayjames's icon

You might also look into [&], the bitwise operator, and running the values 0-255 through a series of &:

& 128
& 64
& 32
etc...
which when combined back into lists will give you binary representations of the numbers 0-255. These lists of 00100101 (etc.) can be used to grab numbers from your actual list. I'm not sure what the result will be exactly...will it give every combination? :) [zl mth] with a [sel] can grab the elements of the list, or there are other ways. You also might run the lists into a [matrixctrl] to see the spreads of the "ons" and "offs", and you can always use presets for these too.

To sort the results, look to [zl group] and/or [zl len], and [zl sort], so you can separate the lists by length and get them in ascending order if they're not already.

Doubtless there are hundreds of ways to go about this... it's a good question nonetheless.