fork download
  1. #lang racket
  2.  
  3. (require srfi/41)
  4.  
  5. ;; 順列
  6.  
  7. (define (perm xs r)
  8. (if (zero? r)
  9. '(())
  10. (append-map (lambda (x)
  11. (map (lambda (ys)
  12. (cons x ys)) (permutations (remove x xs) (- r 1))))
  13. xs)))
  14.  
  15. ;; 手抜き版
  16.  
  17. (define (comb xs r)
  18. (map set->list (set->list (list->set (map list->set (perm xs r))))))
  19.  
  20. ;; 集合版
  21.  
  22. (define (set-combination st r)
  23. (cond ((zero? r) (set (set)))
  24. ((= r (set-count st)) (set st))
  25. (else (let ((s (set-rest st)))
  26. (set-union
  27. (for/set ((i (set-combination s (- r 1))))
  28. (set-add i (set-first st)))
  29. (set-combination s r))))))
  30.  
  31. ;; リスト版
  32.  
  33. (define (combination xs r)
  34. (cond ((zero? r) '(()))
  35. ((= r (length xs)) `(,xs))
  36. (else (let ((s (cdr xs)))
  37. `(,@(map (lambda (x)
  38. (cons (car xs) x)) (combination s (- r 1)))
  39. ,@(combination s r))))))
  40.  
  41. ;; 遅延評価版
  42.  
  43. (define (stream-combination strm r)
  44. (cond ((zero? r) (stream stream-null))
  45. ((= r (stream-length strm)) (stream strm))
  46. (else (let ((s (stream-cdr strm)))
  47. (stream-append
  48. (stream-map (lambda (x)
  49. (stream-cons (stream-car strm) x))
  50. (stream-combination s (- r 1)))
  51. (stream-combination s r))))))
Success #stdin #stdout 0.62s 99520KB
stdin
Standard input is empty
stdout
Standard output is empty