import numpy as np
def generate_combos(n, k, z):
full_locs = np.arange(k + 1, dtype=np.uint)
full_locs[k] = n # makes partial vectorization easier
locs = full_locs[:k] # bit indices
counts = np.zeros(n, dtype=np.uint) # counter buckets
values = np.arange(n, dtype=np.uint) # values
min_index = 0 # index of lowest non-exhausted bin
for _ in range((n * z) // k):
counts[locs] += 1
yield values[locs]
if counts[min_index] == z:
# if lowest bin filled, shift and reset
min_index += np.argmax(counts[min_index:] < z)
locs[:] = min_index + np.arange(k)
else:
# otherwise, increment highest available counter
i = np.flatnonzero(np.diff(full_locs))[-1]
locs[i] += 1
# reset the remainder
locs[i + 1:] = locs[i] + np.arange(1, k - i)
for i, v in enumerate(generate_combos(256, 3, 10)):
print(v)
if i == 99:
break
aW1wb3J0IG51bXB5IGFzIG5wCgpkZWYgZ2VuZXJhdGVfY29tYm9zKG4sIGssIHopOgogICAgZnVsbF9sb2NzID0gbnAuYXJhbmdlKGsgKyAxLCBkdHlwZT1ucC51aW50KQogICAgZnVsbF9sb2NzW2tdID0gbiAgICAgICAgICAgICAgICAgICAgICAjIG1ha2VzIHBhcnRpYWwgdmVjdG9yaXphdGlvbiBlYXNpZXIKICAgIGxvY3MgPSBmdWxsX2xvY3NbOmtdICAgICAgICAgICAgICAgICAgIyBiaXQgaW5kaWNlcwogICAgY291bnRzID0gbnAuemVyb3MobiwgZHR5cGU9bnAudWludCkgICAjIGNvdW50ZXIgYnVja2V0cwogICAgdmFsdWVzID0gbnAuYXJhbmdlKG4sIGR0eXBlPW5wLnVpbnQpICAjIHZhbHVlcwogICAgbWluX2luZGV4ID0gMCAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4IG9mIGxvd2VzdCBub24tZXhoYXVzdGVkIGJpbgoKICAgIGZvciBfIGluIHJhbmdlKChuICogeikgLy8gayk6CiAgICAgICAgY291bnRzW2xvY3NdICs9IDEKICAgICAgICB5aWVsZCB2YWx1ZXNbbG9jc10KCiAgICAgICAgaWYgY291bnRzW21pbl9pbmRleF0gPT0gejoKICAgICAgICAgICAgIyBpZiBsb3dlc3QgYmluIGZpbGxlZCwgc2hpZnQgYW5kIHJlc2V0CiAgICAgICAgICAgIG1pbl9pbmRleCArPSBucC5hcmdtYXgoY291bnRzW21pbl9pbmRleDpdIDwgeikKICAgICAgICAgICAgbG9jc1s6XSA9IG1pbl9pbmRleCArIG5wLmFyYW5nZShrKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgb3RoZXJ3aXNlLCBpbmNyZW1lbnQgaGlnaGVzdCBhdmFpbGFibGUgY291bnRlcgogICAgICAgICAgICBpID0gbnAuZmxhdG5vbnplcm8obnAuZGlmZihmdWxsX2xvY3MpKVstMV0KICAgICAgICAgICAgbG9jc1tpXSArPSAxCiAgICAgICAgICAgICMgcmVzZXQgdGhlIHJlbWFpbmRlcgogICAgICAgICAgICBsb2NzW2kgKyAxOl0gPSBsb2NzW2ldICsgbnAuYXJhbmdlKDEsIGsgLSBpKQoKZm9yIGksIHYgaW4gZW51bWVyYXRlKGdlbmVyYXRlX2NvbWJvcygyNTYsIDMsIDEwKSk6CiAgICBwcmludCh2KQogICAgaWYgaSA9PSA5OToKICAgICAgICBicmVhawoK