File: index.js

package info (click to toggle)
libvcflib 1.0.12%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 70,520 kB
  • sloc: cpp: 39,837; python: 532; perl: 474; ansic: 317; ruby: 295; sh: 254; lisp: 148; makefile: 123; javascript: 94
file content (51 lines) | stat: -rw-r--r-- 1,231 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

/*
def multichoose(k, objects):
    """n multichoose k multisets from the list of objects.  n is the size of
    the objects."""
    j,j_1,q = k,k,k  # init here for scoping
    r = len(objects) - 1
    a = [0 for i in range(k)] # initial multiset indexes
    while True:
        yield [objects[a[i]] for i in range(0,k)]  # emit result
        j = k - 1
        while j >= 0 and a[j] == r: j -= 1
        if j < 0: break  # check for end condition
        j_1 = j
        while j_1 <= k - 1:
            a[j_1] = a[j_1] + 1 # increment
            q = j_1
            while q < k - 1:
                a[q+1] = a[q] # shift left
                q += 1
            q += 1
            j_1 = q

*/

var range = require('range')

function multichoose(k, objects, cb) {
  var j=k,j_1=k,q=k
  var r = objects.length - 1
  var a = range(0,k).map(function() { return 0 })
  while (true) {
    cb(range(0,k).map(function(i) { return objects[a[i]] }))
    j = k - 1
    while (j >= 0 && a[j] == r) --j
    if (j < 0) break
    j_1 = j
    while (j_1 <= k - 1) {
      a[j_1] = a[j_1] + 1
      var q = j_1
      while (q < k - 1) {
        a[q+1] = a[q]
        ++q
      }
      ++q
      j_1 = q
    }
  }
}

module.exports = multichoose