// author: Leonardone @ NEETSDKASU
struct Comb {
size: usize,
x: Vec<usize>,
init: bool,
}
impl Comb {
fn new(size: usize, sel: usize) -> Self {
Self {
size,
x: vec![0; sel],
init: false,
}
}
fn next(&mut self) -> Option<&[usize]> {
if !self.init {
self.init = true;
self.x.iter_mut().enumerate().for_each(|(i, e)| *e = i);
return Some(&self.x);
}
let mut i = self.x.len() - 1;
let mut k = self.size - 1;
loop {
self.x[i] += 1;
if self.x[i] > k {
if i == 0 {
self.init = false;
return None;
}
i -= 1;
k -= 1;
} else {
while i + 1 < self.x.len() {
self.x[i + 1] = self.x[i] + 1;
i += 1;
}
return Some(&self.x);
}
}
}
}
fn main() {
let mut c = Comb::new(5, 3);
while let Some(x) = c.next() {
println!("{:?}", x);
}
}
Ly8gYXV0aG9yOiBMZW9uYXJkb25lIEAgTkVFVFNES0FTVQoKc3RydWN0IENvbWIgewogICAgc2l6ZTogdXNpemUsCiAgICB4OiBWZWM8dXNpemU+LAogICAgaW5pdDogYm9vbCwKfQoKaW1wbCBDb21iIHsKICAgIGZuIG5ldyhzaXplOiB1c2l6ZSwgc2VsOiB1c2l6ZSkgLT4gU2VsZiB7CiAgICAgICAgU2VsZiB7CiAgICAgICAgICAgIHNpemUsCiAgICAgICAgICAgIHg6IHZlYyFbMDsgc2VsXSwKICAgICAgICAgICAgaW5pdDogZmFsc2UsCiAgICAgICAgfQogICAgfQogICAgZm4gbmV4dCgmbXV0IHNlbGYpIC0+IE9wdGlvbjwmW3VzaXplXT4gewogICAgICAgIGlmICFzZWxmLmluaXQgewogICAgICAgICAgICBzZWxmLmluaXQgPSB0cnVlOwogICAgICAgICAgICBzZWxmLnguaXRlcl9tdXQoKS5lbnVtZXJhdGUoKS5mb3JfZWFjaCh8KGksIGUpfCAqZSA9IGkpOwogICAgICAgICAgICByZXR1cm4gU29tZSgmc2VsZi54KTsKICAgICAgICB9CiAgICAgICAgbGV0IG11dCBpID0gc2VsZi54LmxlbigpIC0gMTsKICAgICAgICBsZXQgbXV0IGsgPSBzZWxmLnNpemUgLSAxOwogICAgICAgIGxvb3AgewogICAgICAgICAgICBzZWxmLnhbaV0gKz0gMTsKICAgICAgICAgICAgaWYgc2VsZi54W2ldID4gayB7CiAgICAgICAgICAgICAgICBpZiBpID09IDAgewogICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgayAtPSAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgd2hpbGUgaSArIDEgPCBzZWxmLngubGVuKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYueFtpICsgMV0gPSBzZWxmLnhbaV0gKyAxOwogICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBTb21lKCZzZWxmLngpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpmbiBtYWluKCkgewogICAgbGV0IG11dCBjID0gQ29tYjo6bmV3KDUsIDMpOwogICAgd2hpbGUgbGV0IFNvbWUoeCkgPSBjLm5leHQoKSB7CiAgICAgICAgcHJpbnRsbiEoIns6P30iLCB4KTsKICAgIH0KfQo=
[0, 1, 2]
[0, 1, 3]
[0, 1, 4]
[0, 2, 3]
[0, 2, 4]
[0, 3, 4]
[1, 2, 3]
[1, 2, 4]
[1, 3, 4]
[2, 3, 4]