;; Generate combinations. (1.02)
(use-modules (srfi srfi-1))
;; Utility.
(define (pair-map proc l)
(pair-fold-right (lambda (item init)
(cons (proc item) init))
'() l))
(define (pair-append-map proc l)
(apply append (pair-map proc l)))
;; Combinations.
(define (combinations sequence k)
(if (zero? k)
(list '())
(pair-append-map (lambda (rest)
(map (lambda (comb)
(cons (car rest) comb))
(combinations (cdr rest) (- k 1))))
sequence)))
;; Show.
(define n 5)
(define a (iota n 1))
(for-each (lambda (k)
(format #t "~A choose ~A~%" n k)
(for-each (lambda (c)
(format #t " ~A~%" c))
(combinations a k)))
(iota n 1))
OzsgR2VuZXJhdGUgY29tYmluYXRpb25zLiAoMS4wMikKCih1c2UtbW9kdWxlcyAoc3JmaSBzcmZpLTEpKQoKOzsgVXRpbGl0eS4KCihkZWZpbmUgKHBhaXItbWFwIHByb2MgbCkKICAocGFpci1mb2xkLXJpZ2h0IChsYW1iZGEgKGl0ZW0gaW5pdCkKICAgICAgICAgICAgICAgICAgICAgKGNvbnMgKHByb2MgaXRlbSkgaW5pdCkpCiAgICAgICAgICAgICAgICAgICAnKCkgbCkpCgooZGVmaW5lIChwYWlyLWFwcGVuZC1tYXAgcHJvYyBsKQogIChhcHBseSBhcHBlbmQgKHBhaXItbWFwIHByb2MgbCkpKQoKOzsgQ29tYmluYXRpb25zLgoKKGRlZmluZSAoY29tYmluYXRpb25zIHNlcXVlbmNlIGspCiAgKGlmICh6ZXJvPyBrKQogICAgICAobGlzdCAnKCkpCiAgICAgIChwYWlyLWFwcGVuZC1tYXAgKGxhbWJkYSAocmVzdCkKICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAgKGxhbWJkYSAoY29tYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29ucyAoY2FyIHJlc3QpIGNvbWIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tYmluYXRpb25zIChjZHIgcmVzdCkgKC0gayAxKSkpKQogICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlKSkpCgo7OyBTaG93LgoKKGRlZmluZSBuIDUpCihkZWZpbmUgYSAoaW90YSBuIDEpKQooZm9yLWVhY2ggKGxhbWJkYSAoaykKICAgICAgICAgICAgKGZvcm1hdCAjdCAifkEgY2hvb3NlIH5BfiUiIG4gaykKICAgICAgICAgICAgKGZvci1lYWNoIChsYW1iZGEgKGMpCiAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgI3QgIiB+QX4lIiBjKSkKICAgICAgICAgICAgICAgICAgICAgIChjb21iaW5hdGlvbnMgYSBrKSkpCiAgICAgICAgICAoaW90YSBuIDEpKQ==