/* package whatever; // don't place package name! */
import java.util.Arrays;
import java.util.Iterator;
import java.util.NoSuchElementException;
@SuppressWarnings("javadoc")
class Combinations implements Iterable<int[]> {
private class Yielder implements Iterator<int[]> {
private final long size;
private final long limit;
private long next = 0;
private final int[] stash;
public Yielder(int size) {
super();
this.size = size;
this.limit = 1 << size;
this.stash = new int[size];
}
@Override
public boolean hasNext() {
return next < limit;
}
@Override
public int[] next() {
if (next >= limit) {
}
int count = 0;
for (int b = 0; b < size; b++) {
if ((next & (1 << b)) != 0) {
stash[count++] = b;
}
}
next++;
return Arrays.
copyOf(stash, count
); }
@Override
public void remove() {
}
}
private final int datasize;
/**
* @param datasize
*/
public Combinations(int datasize) {
super();
this.datasize = datasize;
}
@Override
public Iterator<int[]> iterator() {
return new Yielder(datasize);
}
public static void main
(String[] args
) {
int cnt = 0;
for (int[] combination : new Combinations(3)) {
System.
out.
printf("Combination %6d size %2d members %s.%n", cnt
++, combination.
length,
Arrays.
toString(combination
)); }
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwppbXBvcnQgamF2YS51dGlsLkFycmF5czsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwoKCgpAU3VwcHJlc3NXYXJuaW5ncygiamF2YWRvYyIpCmNsYXNzIENvbWJpbmF0aW9ucyBpbXBsZW1lbnRzIEl0ZXJhYmxlPGludFtdPiB7CgogICAgcHJpdmF0ZSBjbGFzcyBZaWVsZGVyIGltcGxlbWVudHMgSXRlcmF0b3I8aW50W10+IHsKICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgc2l6ZTsKICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgbGltaXQ7CiAgICAgICAgcHJpdmF0ZSBsb25nIG5leHQgPSAwOwogICAgICAgIHByaXZhdGUgZmluYWwgaW50W10gc3Rhc2g7IAoKICAgICAgICBwdWJsaWMgWWllbGRlcihpbnQgc2l6ZSkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLnNpemUgPSBzaXplOwogICAgICAgICAgICB0aGlzLmxpbWl0ID0gMSA8PCBzaXplOwogICAgICAgICAgICB0aGlzLnN0YXNoID0gbmV3IGludFtzaXplXTsKICAgICAgICB9CiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKICAgICAgICAgICAgcmV0dXJuIG5leHQgPCBsaW1pdDsKICAgICAgICB9CiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIGludFtdIG5leHQoKSB7CiAgICAgICAgICAgIGlmIChuZXh0ID49IGxpbWl0KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgc2l6ZTsgYisrKSB7CiAgICAgICAgICAgICAgICBpZiAoKG5leHQgJiAoMSA8PCBiKSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIHN0YXNoW2NvdW50KytdID0gYjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0Kys7CiAgICAgICAgICAgIHJldHVybiBBcnJheXMuY29weU9mKHN0YXNoLCBjb3VudCk7CiAgICAgICAgfQogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgICAgIAogICAgfQogICAgCiAgICBwcml2YXRlIGZpbmFsIGludCBkYXRhc2l6ZTsKICAgIAogICAgLyoqCiAgICAgKiBAcGFyYW0gZGF0YXNpemUKICAgICAqLwogICAgcHVibGljIENvbWJpbmF0aW9ucyhpbnQgZGF0YXNpemUpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuZGF0YXNpemUgPSBkYXRhc2l6ZTsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBJdGVyYXRvcjxpbnRbXT4gaXRlcmF0b3IoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBZaWVsZGVyKGRhdGFzaXplKTsKICAgIH0KCgoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAKICAgICAgICBpbnQgY250ID0gMDsKICAgICAgICBmb3IgKGludFtdIGNvbWJpbmF0aW9uIDogbmV3IENvbWJpbmF0aW9ucygzKSkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiQ29tYmluYXRpb24gJTZkIHNpemUgJTJkIG1lbWJlcnMgJXMuJW4iLCBjbnQrKywgY29tYmluYXRpb24ubGVuZ3RoLCBBcnJheXMudG9TdHJpbmcoY29tYmluYXRpb24pKTsKICAgICAgICB9CiAgICAgICAgCiAgICB9Cn0K