combinatorics 0.3.0 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/.document +1 -1
  3. data/.gemtest +0 -0
  4. data/.github/workflows/ruby.yml +28 -0
  5. data/.gitignore +4 -5
  6. data/Benchmarks.md +281 -0
  7. data/ChangeLog.md +42 -0
  8. data/Gemfile +14 -0
  9. data/LICENSE.txt +1 -2
  10. data/README.md +178 -69
  11. data/Rakefile +7 -27
  12. data/benchmarks/cartesian_product.rb +18 -0
  13. data/benchmarks/choose.rb +19 -0
  14. data/benchmarks/derange.rb +18 -0
  15. data/benchmarks/list_comprehension.rb +20 -4
  16. data/benchmarks/permute.rb +18 -0
  17. data/benchmarks/power_set.rb +18 -0
  18. data/combinatorics.gemspec +54 -83
  19. data/gemspec.yml +25 -0
  20. data/lib/combinatorics/cartesian_product/cardinality.rb +45 -0
  21. data/lib/combinatorics/cartesian_product/extensions/array.rb +7 -0
  22. data/lib/combinatorics/cartesian_product/extensions/set.rb +9 -0
  23. data/lib/combinatorics/cartesian_product/extensions.rb +2 -0
  24. data/lib/combinatorics/cartesian_product/mixin.rb +57 -0
  25. data/lib/combinatorics/cartesian_product.rb +3 -0
  26. data/lib/combinatorics/choose/cardinality.rb +99 -0
  27. data/lib/combinatorics/choose/extensions/array.rb +5 -0
  28. data/lib/combinatorics/choose/extensions/set.rb +6 -0
  29. data/lib/combinatorics/choose/extensions.rb +2 -0
  30. data/lib/combinatorics/choose/mixin.rb +53 -0
  31. data/lib/combinatorics/choose.rb +3 -0
  32. data/lib/combinatorics/derange/cardinality.rb +23 -0
  33. data/lib/combinatorics/derange/extensions/array.rb +5 -0
  34. data/lib/combinatorics/derange/extensions.rb +1 -0
  35. data/lib/combinatorics/derange/mixin.rb +47 -0
  36. data/lib/combinatorics/derange.rb +3 -0
  37. data/lib/combinatorics/enumerator.rb +2 -0
  38. data/lib/combinatorics/extensions/math.rb +176 -0
  39. data/lib/combinatorics/extensions/range.rb +2 -2
  40. data/lib/combinatorics/generator.rb +7 -4
  41. data/lib/combinatorics/list_comprehension.rb +6 -1
  42. data/lib/combinatorics/permute/cardinality.rb +98 -0
  43. data/lib/combinatorics/permute/extensions/array.rb +7 -0
  44. data/lib/combinatorics/permute/extensions/set.rb +9 -0
  45. data/lib/combinatorics/permute/extensions.rb +2 -0
  46. data/lib/combinatorics/permute/mixin.rb +48 -0
  47. data/lib/combinatorics/permute.rb +3 -0
  48. data/lib/combinatorics/power_set/cardinality.rb +36 -0
  49. data/lib/combinatorics/power_set/mixin.rb +19 -22
  50. data/lib/combinatorics/power_set.rb +1 -0
  51. data/lib/combinatorics/version.rb +4 -0
  52. data/lib/combinatorics.rb +8 -0
  53. data/spec/cartesian_product/array_spec.rb +10 -0
  54. data/spec/cartesian_product/cardinality_spec.rb +64 -0
  55. data/spec/cartesian_product/mixin_examples.rb +98 -0
  56. data/spec/cartesian_product/set_spec.rb +10 -0
  57. data/spec/choose/array_spec.rb +9 -0
  58. data/spec/choose/cardinality_spec.rb +132 -0
  59. data/spec/choose/mixin_examples.rb +48 -0
  60. data/spec/choose/set_spec.rb +9 -0
  61. data/spec/combinatorics_spec.rb +5 -1
  62. data/spec/derange/array_spec.rb +10 -0
  63. data/spec/derange/cardinality_spec.rb +14 -0
  64. data/spec/derange/mixin_examples.rb +52 -0
  65. data/spec/enumerator_spec.rb +1 -1
  66. data/spec/extensions/math_spec.rb +100 -0
  67. data/spec/extensions/range_spec.rb +13 -13
  68. data/spec/generator_spec.rb +1 -1
  69. data/spec/list_comprehension_spec.rb +11 -11
  70. data/spec/permute/array_spec.rb +10 -0
  71. data/spec/permute/cardinality_spec.rb +146 -0
  72. data/spec/permute/mixin_examples.rb +42 -0
  73. data/spec/permute/set_spec.rb +10 -0
  74. data/spec/power_set/array_spec.rb +3 -2
  75. data/spec/power_set/cardinality_spec.rb +32 -0
  76. data/spec/power_set/mixin_examples.rb +17 -8
  77. data/spec/power_set/set_spec.rb +3 -2
  78. data/spec/spec_helper.rb +3 -3
  79. metadata +106 -104
  80. data/VERSION +0 -1
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e0761711a88421b7b0214a3b585b6a843401bd1e84bb189c87a0c4167d7e5f32
4
+ data.tar.gz: 6c42e53311328f5d0f6c27ea339c3539046fee352dfb548155d35183a19d5aef
5
+ SHA512:
6
+ metadata.gz: 1d9df890fc1669969b84e48a0b3d6126111cc6e13369308f76c274e0227fcd475a9047872ef247dc83b009f4b5d234526aa9d88c0c59cff7c9129d080c93a044
7
+ data.tar.gz: 53eabbc7025dbaa9e79d8fe44c8d68c0182de3b575f425f6b4d0231c88920a8ee7b8c85bfd8f94743b8a618184525d0db5264d37232bd8793396b93afbfb1a0f
data/.document CHANGED
@@ -1,4 +1,4 @@
1
- lib/**/*.rb
2
1
  -
3
2
  LICENSE.txt
3
+ Benchmarks.md
4
4
  ChangeLog.md
data/.gemtest ADDED
File without changes
@@ -0,0 +1,28 @@
1
+ name: CI
2
+
3
+ on: [ push, pull_request ]
4
+
5
+ jobs:
6
+ tests:
7
+ runs-on: ubuntu-latest
8
+ strategy:
9
+ fail-fast: false
10
+ matrix:
11
+ ruby:
12
+ - 2.6
13
+ - 2.7
14
+ - '3.0'
15
+ - 3.1
16
+ - jruby
17
+ - truffleruby
18
+ name: Ruby ${{ matrix.ruby }}
19
+ steps:
20
+ - uses: actions/checkout@v2
21
+ - name: Set up Ruby
22
+ uses: ruby/setup-ruby@v1
23
+ with:
24
+ ruby-version: ${{ matrix.ruby }}
25
+ - name: Install dependencies
26
+ run: bundle install --jobs 4 --retry 3
27
+ - name: Run tests
28
+ run: bundle exec rake test
data/.gitignore CHANGED
@@ -1,8 +1,7 @@
1
- pkg
2
- doc
3
- web
4
- tmp
1
+ /Gemfile.lock
2
+ /pkg
3
+ /doc
4
+ /.yardoc
5
5
  .DS_Store
6
- .yardoc
7
6
  *.swp
8
7
  *~
data/Benchmarks.md ADDED
@@ -0,0 +1,281 @@
1
+ # Benchmarks
2
+
3
+ Benchmarks for the {Combinatorics} code can be found in the `benchmarks/`
4
+ directory.
5
+
6
+ Benchmark machine specs:
7
+
8
+ * CPU: AMD Athlon(tm) 64 Processor 3400+ (2202.785 MHz)
9
+ * Cache Size: 1024 KB
10
+ * Memory: 1 Gb
11
+
12
+ ## List Comprehensions:
13
+
14
+ Ruby 1.9.2-p290 (2011-07-09 revision 32553) [x86_64-linux]:
15
+
16
+ user system total real
17
+ singleton: 0.050000 0.020000 0.070000 ( 0.081225)
18
+ single-enum: 0.000000 0.000000 0.000000 ( 0.009706)
19
+ depth 1: 0.000000 0.000000 0.000000 ( 0.000652)
20
+ depth 2: 0.070000 0.010000 0.080000 ( 0.084974)
21
+ depth 3: 5.670000 0.240000 5.910000 ( 6.623347)
22
+
23
+ JRuby 1.6.4 (ruby-1.8.7-p330) (2011-08-23 17ea768)
24
+ (OpenJDK 64-Bit Server VM 1.6.0_22) [linux-amd64-java]:
25
+
26
+ user system total real
27
+ singleton: 1.365000 0.000000 1.365000 ( 1.212000)
28
+ single-enum: 0.134000 0.000000 0.134000 ( 0.134000)
29
+ depth 1: 0.046000 0.000000 0.046000 ( 0.045000)
30
+ depth 2: 1.613000 0.000000 1.613000 ( 1.614000)
31
+ depth 3: 10.054000 0.000000 10.054000 ( 10.054000)
32
+
33
+ Rubinius 2.0.0dev (1.8.7 5e67b11e yyyy-mm-dd JI) [x86_64-unknown-linux-gnu]:
34
+
35
+ user system total real
36
+ singleton: 0.802878 0.112983 0.915861 ( 1.722362)
37
+ single-enum: 0.128980 0.011998 0.140978 ( 0.176392)
38
+ depth 1: 0.000000 0.000000 0.000000 ( 0.000897)
39
+ depth 2: 0.058991 0.004999 0.063990 ( 0.143435)
40
+ depth 3: 3.483470 0.148977 3.632447 ( 5.156510)
41
+
42
+ ## Cartesian Product
43
+
44
+ Ruby 1.9.2-p290 (2011-07-09 revision 32553) [x86_64-linux]:
45
+
46
+ user system total real
47
+ {100} x {100} 0.070000 0.000000 0.070000 ( 0.084734)
48
+ {200} x {200} 0.290000 0.020000 0.310000 ( 0.347752)
49
+ {400} x {400} 1.370000 0.070000 1.440000 ( 1.582130)
50
+ {800} x {800} 8.250000 0.370000 8.620000 ( 9.498290)
51
+
52
+ JRuby 1.6.4 (ruby-1.8.7-p330) (2011-08-23 17ea768)
53
+ (OpenJDK 64-Bit Server VM 1.6.0_22) [linux-amd64-java]:
54
+
55
+ user system total real
56
+ {100} x {100} 2.469000 0.000000 2.469000 ( 2.349000)
57
+ {200} x {200} 2.575000 0.000000 2.575000 ( 2.574000)
58
+ {400} x {400} 2.354000 0.000000 2.354000 ( 2.354000)
59
+ {800} x {800} 7.730000 0.000000 7.730000 ( 7.730000)
60
+
61
+ Rubinius 2.0.0dev (1.8.7 5e67b11e yyyy-mm-dd JI) [x86_64-unknown-linux-gnu]:
62
+
63
+ user system total real
64
+ {100} x {100} 0.114982 0.051992 0.166974 ( 1.184129)
65
+ {200} x {200} 0.391941 0.159976 0.551917 ( 1.396105)
66
+ {400} x {400} 1.333797 0.653901 1.987698 ( 3.120384)
67
+ {800} x {800} 5.961093 2.614602 8.575695 ( 13.643119)
68
+
69
+ ## Choose
70
+
71
+ Ruby 1.9.2-p290 (2011-07-09 revision 32553) [x86_64-linux]:
72
+
73
+ user system total real
74
+ n=20 k=1 0.000000 0.000000 0.000000 ( 0.000172)
75
+ n=20 k=2 0.010000 0.000000 0.010000 ( 0.003592)
76
+ n=20 k=3 0.010000 0.000000 0.010000 ( 0.017710)
77
+ n=20 k=4 0.040000 0.000000 0.040000 ( 0.060566)
78
+ n=20 k=5 0.180000 0.010000 0.190000 ( 0.211709)
79
+ n=20 k=6 0.490000 0.030000 0.520000 ( 0.583004)
80
+ n=20 k=7 1.110000 0.070000 1.180000 ( 1.307065)
81
+ n=20 k=8 1.980000 0.050000 2.030000 ( 2.204111)
82
+ n=20 k=9 2.770000 0.120000 2.890000 ( 3.221468)
83
+ n=20 k=10 3.310000 0.150000 3.460000 ( 3.904973)
84
+ n=20 k=11 3.120000 0.150000 3.270000 ( 4.085721)
85
+ n=20 k=12 2.520000 0.140000 2.660000 ( 3.139445)
86
+ n=20 k=13 1.570000 0.060000 1.630000 ( 1.853883)
87
+ n=20 k=14 0.820000 0.040000 0.860000 ( 1.142598)
88
+ n=20 k=15 0.350000 0.020000 0.370000 ( 0.436363)
89
+ n=20 k=16 0.110000 0.000000 0.110000 ( 0.141398)
90
+ n=20 k=17 0.030000 0.010000 0.040000 ( 0.047691)
91
+ n=20 k=18 0.000000 0.000000 0.000000 ( 0.003746)
92
+ n=20 k=19 0.000000 0.000000 0.000000 ( 0.000438)
93
+ n=20 k=20 0.000000 0.000000 0.000000 ( 0.000043)
94
+
95
+ JRuby 1.6.4 (ruby-1.8.7-p330) (2011-08-23 17ea768)
96
+ (OpenJDK 64-Bit Server VM 1.6.0_22) [linux-amd64-java]:
97
+
98
+ user system total real
99
+ n=20 k=1 0.271000 0.000000 0.271000 ( 0.048000)
100
+ n=20 k=2 0.163000 0.000000 0.163000 ( 0.163000)
101
+ n=20 k=3 0.184000 0.000000 0.184000 ( 0.184000)
102
+ n=20 k=4 0.759000 0.000000 0.759000 ( 0.759000)
103
+ n=20 k=5 1.157000 0.000000 1.157000 ( 1.157000)
104
+ n=20 k=6 1.116000 0.000000 1.116000 ( 1.116000)
105
+ n=20 k=7 0.490000 0.000000 0.490000 ( 0.490000)
106
+ n=20 k=8 0.632000 0.000000 0.632000 ( 0.632000)
107
+ n=20 k=9 0.907000 0.000000 0.907000 ( 0.908000)
108
+ n=20 k=10 1.040000 0.000000 1.040000 ( 1.040000)
109
+ n=20 k=11 0.991000 0.000000 0.991000 ( 0.991000)
110
+ n=20 k=12 0.784000 0.000000 0.784000 ( 0.784000)
111
+ n=20 k=13 0.513000 0.000000 0.513000 ( 0.514000)
112
+ n=20 k=14 0.285000 0.000000 0.285000 ( 0.285000)
113
+ n=20 k=15 0.141000 0.000000 0.141000 ( 0.142000)
114
+ n=20 k=16 0.045000 0.000000 0.045000 ( 0.045000)
115
+ n=20 k=17 0.009000 0.000000 0.009000 ( 0.009000)
116
+ n=20 k=18 0.004000 0.000000 0.004000 ( 0.004000)
117
+ n=20 k=19 0.001000 0.000000 0.001000 ( 0.001000)
118
+ n=20 k=20 0.000000 0.000000 0.000000 ( 0.000000)
119
+
120
+ Rubinius 2.0.0dev (1.8.7 5e67b11e yyyy-mm-dd JI) [x86_64-unknown-linux-gnu]:
121
+
122
+ user system total real
123
+ n=20 k=1 0.001000 0.000000 0.001000 ( 0.001005)
124
+ n=20 k=2 0.005999 0.000000 0.005999 ( 0.016681)
125
+ n=20 k=3 0.051992 0.002000 0.053992 ( 0.177731)
126
+ n=20 k=4 0.159976 0.005999 0.165975 ( 0.564428)
127
+ n=20 k=5 0.412938 0.016998 0.429936 ( 1.410280)
128
+ n=20 k=6 1.045841 0.034994 1.080835 ( 1.220624)
129
+ n=20 k=7 2.234661 0.073989 2.308650 ( 2.514775)
130
+ n=20 k=8 3.821419 0.157976 3.979395 ( 4.479381)
131
+ n=20 k=9 5.377183 0.230965 5.608148 ( 6.545616)
132
+ n=20 k=10 6.270047 0.271958 6.542005 ( 7.481663)
133
+ n=20 k=11 6.056079 0.201970 6.258049 ( 7.179931)
134
+ n=20 k=12 4.684288 0.237963 4.922251 ( 5.829043)
135
+ n=20 k=13 3.066534 0.122982 3.189516 ( 3.633006)
136
+ n=20 k=14 1.716739 0.060990 1.777729 ( 2.083863)
137
+ n=20 k=15 0.708892 0.031996 0.740888 ( 0.814869)
138
+ n=20 k=16 0.233965 0.006999 0.240964 ( 0.272663)
139
+ n=20 k=17 0.057992 0.000999 0.058991 ( 0.075194)
140
+ n=20 k=18 0.008999 0.001000 0.009999 ( 0.015695)
141
+ n=20 k=19 0.001999 0.000000 0.001999 ( 0.001539)
142
+ n=20 k=20 0.000000 0.000000 0.000000 ( 0.000253)
143
+
144
+ ## Permute
145
+
146
+ Ruby 1.9.2-p290 (2011-07-09 revision 32553) [x86_64-linux]:
147
+
148
+ user system total real
149
+ r=1 0.000000 0.000000 0.000000 ( 0.000029)
150
+ r=2 0.000000 0.000000 0.000000 ( 0.000029)
151
+ r=3 0.010000 0.000000 0.010000 ( 0.002234)
152
+ r=4 0.000000 0.000000 0.000000 ( 0.002388)
153
+ r=5 0.020000 0.000000 0.020000 ( 0.028709)
154
+ r=6 0.100000 0.000000 0.100000 ( 0.119063)
155
+ r=7 0.380000 0.030000 0.410000 ( 0.462036)
156
+ r=8 1.210000 0.080000 1.290000 ( 1.447420)
157
+ r=9 2.510000 0.130000 2.640000 ( 2.919967)
158
+ r=10 2.840000 0.200000 3.040000 ( 3.664906)
159
+
160
+ JRuby 1.6.4 (ruby-1.8.7-p330) (2011-08-23 17ea768)
161
+ (OpenJDK 64-Bit Server VM 1.6.0_22) [linux-amd64-java]:
162
+
163
+ user system total real
164
+ r=1 0.274000 0.000000 0.274000 ( 0.041000)
165
+ r=2 0.001000 0.000000 0.001000 ( 0.001000)
166
+ r=3 0.012000 0.000000 0.012000 ( 0.012000)
167
+ r=4 0.154000 0.000000 0.154000 ( 0.154000)
168
+ r=5 0.306000 0.000000 0.306000 ( 0.307000)
169
+ r=6 0.081000 0.000000 0.081000 ( 0.081000)
170
+ r=7 0.168000 0.000000 0.168000 ( 0.168000)
171
+ r=8 0.516000 0.000000 0.516000 ( 0.517000)
172
+ r=9 1.224000 0.000000 1.224000 ( 1.224000)
173
+ r=10 1.649000 0.000000 1.649000 ( 1.649000)
174
+
175
+ Rubinius 2.0.0dev (1.8.7 5e67b11e yyyy-mm-dd JI) [x86_64-unknown-linux-gnu]:
176
+
177
+ user system total real
178
+ r=1 0.001000 0.000000 0.001000 ( 0.000062)
179
+ r=2 0.001000 0.000000 0.001000 ( 0.004535)
180
+ r=3 0.006000 0.000000 0.006000 ( 0.016175)
181
+ r=4 0.049993 0.003000 0.052993 ( 0.171867)
182
+ r=5 0.153976 0.012998 0.166974 ( 0.584311)
183
+ r=6 0.578912 0.020997 0.599909 ( 0.654977)
184
+ r=7 2.694590 0.106984 2.801574 ( 3.170215)
185
+ r=8 9.167606 0.337948 9.505554 ( 10.952164)
186
+ r=9 21.419744 0.785881 22.205625 ( 24.619187)
187
+ r=10 29.557506 1.087834 30.645340 ( 34.234011)
188
+
189
+ ## Derange
190
+
191
+ Ruby 1.9.2-p290 (2011-07-09 revision 32553) [x86_64-linux]:
192
+
193
+ user system total real
194
+ n=1 0.000000 0.000000 0.000000 ( 0.000021)
195
+ n=2 0.000000 0.000000 0.000000 ( 0.000041)
196
+ n=3 0.000000 0.000000 0.000000 ( 0.000021)
197
+ n=4 0.000000 0.000000 0.000000 ( 0.000069)
198
+ n=5 0.000000 0.000000 0.000000 ( 0.000393)
199
+ n=6 0.000000 0.000000 0.000000 ( 0.002281)
200
+ n=7 0.020000 0.010000 0.030000 ( 0.028188)
201
+ n=8 0.170000 0.000000 0.170000 ( 0.207589)
202
+ n=9 1.630000 0.070000 1.700000 ( 1.974767)
203
+ n=10 17.200000 0.670000 17.870000 ( 20.047089)
204
+
205
+ JRuby 1.6.4 (ruby-1.8.7-p330) (2011-08-23 17ea768)
206
+ (OpenJDK 64-Bit Server VM 1.6.0_22) [linux-amd64-java]:
207
+
208
+ user system total real
209
+ n=1 0.150000 0.000000 0.150000 ( 0.023000)
210
+ n=2 0.003000 0.000000 0.003000 ( 0.003000)
211
+ n=3 0.001000 0.000000 0.001000 ( 0.001000)
212
+ n=4 0.006000 0.000000 0.006000 ( 0.007000)
213
+ n=5 0.022000 0.000000 0.022000 ( 0.022000)
214
+ n=6 0.173000 0.000000 0.173000 ( 0.173000)
215
+ n=7 1.045000 0.000000 1.045000 ( 1.045000)
216
+ n=8 0.821000 0.000000 0.821000 ( 0.821000)
217
+ n=9 1.917000 0.000000 1.917000 ( 1.917000)
218
+ n=10 25.652000 0.000000 25.652000 ( 25.652000)
219
+
220
+ Rubinius 2.0.0dev (1.8.7 5e67b11e yyyy-mm-dd JI) [x86_64-unknown-linux-gnu]:
221
+
222
+ user system total real
223
+ n=1 0.000000 0.000000 0.000000 ( 0.000025)
224
+ n=2 0.000000 0.000000 0.000000 ( 0.000394)
225
+ n=3 0.000000 0.000000 0.000000 ( 0.000145)
226
+ n=4 0.000000 0.000000 0.000000 ( 0.000637)
227
+ n=5 0.004000 0.000000 0.004000 ( 0.010315)
228
+ n=6 0.036994 0.003000 0.039994 ( 0.151349)
229
+ n=7 0.130980 0.009998 0.140978 ( 0.584286)
230
+ n=8 0.579912 0.028996 0.608908 ( 0.946738)
231
+ n=9 5.563154 0.191970 5.755124 ( 6.588485)
232
+ n=10 59.973882 2.427631 62.401513 ( 80.877847)
233
+
234
+ ## Power Set
235
+
236
+ Ruby 1.9.2-p290 (2011-07-09 revision 32553) [x86_64-linux]:
237
+
238
+ user system total real
239
+ n=10 0.000000 0.000000 0.000000 ( 0.015275)
240
+ n=11 0.020000 0.000000 0.020000 ( 0.033685)
241
+ n=12 0.050000 0.000000 0.050000 ( 0.063667)
242
+ n=13 0.110000 0.010000 0.120000 ( 0.131612)
243
+ n=14 0.230000 0.010000 0.240000 ( 0.276595)
244
+ n=15 0.500000 0.010000 0.510000 ( 0.559058)
245
+ n=16 1.040000 0.050000 1.090000 ( 1.222567)
246
+ n=17 2.110000 0.120000 2.230000 ( 2.607683)
247
+ n=18 4.410000 0.230000 4.640000 ( 5.223074)
248
+ n=19 9.240000 0.460000 9.700000 ( 10.995905)
249
+ n=20 19.280000 0.810000 20.090000 ( 23.152085)
250
+
251
+ JRuby 1.6.4 (ruby-1.8.7-p330) (2011-08-23 17ea768)
252
+ (OpenJDK 64-Bit Server VM 1.6.0_22) [linux-amd64-java]:
253
+
254
+ user system total real
255
+ n=10 0.539000 0.000000 0.539000 ( 0.369000)
256
+ n=11 0.609000 0.000000 0.609000 ( 0.609000)
257
+ n=12 0.490000 0.000000 0.490000 ( 0.490000)
258
+ n=13 0.701000 0.000000 0.701000 ( 0.701000)
259
+ n=14 1.013000 0.000000 1.013000 ( 1.013000)
260
+ n=15 0.729000 0.000000 0.729000 ( 0.729000)
261
+ n=16 0.306000 0.000000 0.306000 ( 0.306000)
262
+ n=17 0.601000 0.000000 0.601000 ( 0.601000)
263
+ n=18 1.291000 0.000000 1.291000 ( 1.291000)
264
+ n=19 2.591000 0.000000 2.591000 ( 2.591000)
265
+ n=20 5.573000 0.000000 5.573000 ( 5.573000)
266
+
267
+ Rubinius 2.0.0dev (1.8.7 5e67b11e yyyy-mm-dd JI) [x86_64-unknown-linux-gnu]:
268
+
269
+ user system total real
270
+ n=10 0.050992 0.009999 0.060991 ( 0.196739)
271
+ n=11 0.088986 0.011998 0.100984 ( 0.295952)
272
+ n=12 0.141979 0.003999 0.145978 ( 0.632228)
273
+ n=13 0.248962 0.012998 0.261960 ( 0.939763)
274
+ n=14 0.482927 0.015998 0.498925 ( 0.562893)
275
+ n=15 0.988849 0.035994 1.024843 ( 1.134604)
276
+ n=16 2.034691 0.076988 2.111679 ( 2.342626)
277
+ n=17 4.188363 0.158976 4.347339 ( 4.882135)
278
+ n=18 8.595693 0.347947 8.943640 ( 10.191949)
279
+ n=19 17.662315 0.674898 18.337213 ( 20.490505)
280
+ n=20 36.434461 1.536766 37.971227 ( 42.821087)
281
+
data/ChangeLog.md CHANGED
@@ -1,3 +1,45 @@
1
+ ### 0.4.4 / 2022-01-16
2
+
3
+ * Fixed a bug in {Combinatorics::Choose.cardinality} for when `0`
4
+ is given and `0` was returned instead of `1`.
5
+
6
+ ### 0.4.3 / 2012-05-28
7
+
8
+ * Fixed a typo in the gemspec, which incorrectly set
9
+ `required_rubygems_version` to the same value as `required_ruby_version`.
10
+
11
+ ### 0.4.2 / 2012-05-27
12
+
13
+ * Avoid warnings on JRuby by checking for `::Generator` before
14
+ `::Enumerator::Generator` in `combinatorics/generator`.
15
+ * Raise a `NameError` when the `Generator` class cannot be found in
16
+ `combinatorics/generator`.
17
+ * Replaced ore-tasks with
18
+ [rubygems-tasks](https://github.com/postmodern/rubygems-tasks#readme).
19
+
20
+ ### 0.4.1 / 2011-10-15
21
+
22
+ * Fixed a typo in the gemspec.
23
+
24
+ ### 0.4.0 / 2011-10-15
25
+
26
+ * Added {Math.sigma}.
27
+ * Added {Math.pi}.
28
+ * Added {Math.factorial}.
29
+ * Added {Math.subfactorial}.
30
+ * Added {Combinatorics::CartesianProduct}.
31
+ * Added {Combinatorics::Choose}.
32
+ * Added {Combinatorics::Derange}.
33
+ * Added {Combinatorics::Permute}.
34
+ * Added {Combinatorics::PowerSet}.
35
+
36
+ ### 0.3.1 / 2010-10-26
37
+
38
+ * Do not call `enum_for` on `Enumerator` objects passed to
39
+ {Array#comprehension}.
40
+ * Improved {Array#comprehension} benchmarks.
41
+ * Added [benchmark results] (see {file:Benchmarks.md}).
42
+
1
43
  ### 0.3.0 / 2010-10-17
2
44
 
3
45
  * Added {Combinatorics::Generator} which auto-detects the `Generator`
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem 'rake'
7
+ gem 'rubygems-tasks', '~> 0.2'
8
+
9
+ gem 'rspec', '~> 3.0'
10
+
11
+ gem 'kramdown'
12
+ gem 'yard', '~> 0.9'
13
+ gem 'yard-spellcheck', require: false
14
+ end
data/LICENSE.txt CHANGED
@@ -1,5 +1,4 @@
1
-
2
- Copyright (c) 2010 Hal Brodigan
1
+ Copyright (c) 2010-2022 Hal Brodigan
3
2
 
4
3
  Permission is hereby granted, free of charge, to any person obtaining
5
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,96 +1,205 @@
1
1
  # Combinatorics
2
2
 
3
- * [github.com/postmodern/combinatorics](http://github.com/postmodern/combinatorics)
4
- * [github.com/postmodern/combinatorics/issues](http://github.com/postmodern/combinatorics/issues)
5
- * Postmodern (postmodern.mod3 at gmail.com)
3
+ [![CI](https://github.com/postmodern/combinatorics/actions/workflows/ruby.yml/badge.svg)](https://github.com/postmodern/combinatorics/actions/workflows/ruby.yml)
4
+ [![Code Climate](https://codeclimate.com/github/postmodern/combinatorics.svg)](https://codeclimate.com/github/postmodern/combinatorics)
5
+
6
+ * [Source](https://github.com/postmodern/combinatorics)
7
+ * [Issues](https://github.com/postmodern/combinatorics/issues)
8
+ * [Documentation](http://rubydoc.info/gems/combinatorics)
6
9
 
7
10
  ## Description
8
11
 
9
12
  A collection of modules and methods for performing
10
13
  [Combinatoric](http://en.wikipedia.org/wiki/Combinatoric) calculations.
14
+ Methods are defined to compute power sets, Cartesian products, permutations,
15
+ combinations, and derangements.
16
+
17
+ Note: this includes k-combinations and k-permutations, i.e. only generating
18
+ resultant sets of a given size. Each set theory operation method supports block
19
+ arguments to allow continuous code execution during the combinatoric set
20
+ generation process. Each combinatoric operation implementation also supports a
21
+ `cardinality` method which determines the total number of subsets that will be
22
+ created beforehand (to aid in the avoidance of starting an operation which will
23
+ never complete due to exponential computational complexity.)
11
24
 
12
25
  ## Features
13
26
 
14
- * Adds `powerset` to {Array} and {Set}.
15
- * Added {Range#&}, {Range#upto} and {Range#downto}.
16
- * Adds Haskell/Python style list comprehensions via {Array#comprehension}.
27
+ * Adds Haskell/Python style list comprehensions via [Array#comprehension].
28
+ * Provides reusable Combinatorics Mixins:
29
+ * [Combinatorics::CartesianProduct]
30
+ * [Combinatorics::Choose]
31
+ * [Combinatorics::Derange]
32
+ * [Combinatorics::Permute]
33
+ * [Combinatorics::PowerSet]
34
+ * Adds Combinatorics core extension methods to {Array} and {Set}:
35
+ * [cartesian_product]
36
+ * [choose]
37
+ * [derange]
38
+ * [permute]
39
+ * [powerset]
40
+ * Adds additional core extension methods:
41
+ * [Range#&]
42
+ * [Range#upto]
43
+ * [Range#downto]
44
+ * [Math.sigma]
45
+ * [Math.pi]
46
+ * [Math.factorial]
47
+ * [Math.subfactorial]
48
+
49
+ [Array#comprehension]: https://rubydoc.info/gems/combinatorics/Array#comprehension-instance_method
50
+ [Combinatorics::CartesianProduct]: https://rubydoc.info/gems/combinatorics/Combinatorics/CartesianProduct
51
+ [Combinatorics::Choose]: https://rubydoc.info/gems/combinatorics/Combinatorics/Choose
52
+ [Combinatorics::Derange]: https://rubydoc.info/gems/combinatorics/Combinatorics/Derange
53
+ [Combinatorics::Permute]: https://rubydoc.info/gems/combinatorics/Combinatorics/Permute
54
+ [Combinatorics::PowerSet]: https://rubydoc.info/gems/combinatorics/Combinatorics/PowerSet
55
+ [cartesian_product]: https://rubydoc.info/gems/combinatorics/Combinatorics/CartesianProduct/Mixin#cartesian_product-instance_method
56
+ [choose]: https://rubydoc.info/gems/combinatorics/Combinatorics/Choose/Mixin#choose-instance_method
57
+ [derange]: https://rubydoc.info/gems/combinatorics/Combinatorics/Derange/Mixin#derange-instance_method
58
+ [permute]: https://rubydoc.info/gems/combinatorics/Combinatorics/Permute/Mixin#permute-instance_method
59
+ [powerset]: https://rubydoc.info/gems/combinatorics/Combinatorics/PowerSet/Mixin#powerset-instance_method
60
+ [Range#&]: https://rubydoc.info/gems/combinatorics/Range#&-instance_method
61
+ [Range#upto]: https://rubydoc.info/gems/combinatorics/Range#upto-instance_method
62
+ [Range#downto]: https://rubydoc.info/gems/combinatorics/Range#downto-instance_method
63
+ [Math.sigma]: https://rubydoc.info/gems/combinatorics/Math#sigma-class_method
64
+ [Math.pi]: https://rubydoc.info/gems/combinatorics/Math#pi-class_method
65
+ [Math.factorial]: https://rubydoc.info/gems/combinatorics/Math#factorial-class_method
66
+ [Math.subfactorial]: https://rubydoc.info/gems/combinatorics/Math#subfactorial-class_method
17
67
 
18
68
  ## Examples
19
69
 
20
- Power-set of an {Array}:
21
-
22
- require 'combinatorics/power_set'
23
-
24
- [1,2,3,4].powerset
25
- # => [[],
26
- [4],
27
- [3],
28
- [3, 4],
29
- [2],
30
- [2, 4],
31
- [2, 3],
32
- [2, 3, 4],
33
- [1],
34
- [1, 4],
35
- [1, 3],
36
- [1, 3, 4],
37
- [1, 2],
38
- [1, 2, 4],
39
- [1, 2, 3],
40
- [1, 2, 3, 4]]
41
-
42
- Power-set of a {Set}:
43
-
44
- Set['ab', 'cd', 'ef'].powerset
45
- # => [#<Set: {}>,
46
- #<Set: {"ef"}>,
47
- #<Set: {"cd"}>,
48
- #<Set: {"cd", "ef"}>,
49
- #<Set: {"ab"}>,
50
- #<Set: {"ab", "ef"}>,
51
- #<Set: {"ab", "cd"}>,
52
- #<Set: {"ab", "cd", "ef"}>]
70
+ Power-set:
71
+
72
+ ```ruby
73
+ Set['ab', 'cd', 'ef'].powerset
74
+ # => [#<Set: {}>,
75
+ #<Set: {"ef"}>,
76
+ #<Set: {"cd"}>,
77
+ #<Set: {"cd", "ef"}>,
78
+ #<Set: {"ab"}>,
79
+ #<Set: {"ab", "ef"}>,
80
+ #<Set: {"ab", "cd"}>,
81
+ #<Set: {"ab", "cd", "ef"}>]
82
+ ```
83
+
84
+ Cartesian products:
85
+
86
+ ```ruby
87
+ require 'combinatorics/cartesian_product'
88
+
89
+ ['a', 'b', 'c'].cartesian_product([0, 1, 2]).to_a
90
+ # => [["a", 0],
91
+ ["b", 0],
92
+ ["c", 0],
93
+ ["a", 1],
94
+ ["b", 1],
95
+ ["c", 1],
96
+ ["a", 2],
97
+ ["b", 2],
98
+ ["c", 2]]
99
+ ```
100
+
101
+ k-combinations:
102
+
103
+ ```ruby
104
+ require 'combinatorics/choose'
105
+
106
+ ('a'..'f').to_a.choose(2).to_a
107
+ # => [["a", "b"],
108
+ ["a", "c"],
109
+ ["a", "d"],
110
+ ["a", "e"],
111
+ ["a", "f"],
112
+ ["b", "c"],
113
+ ["b", "d"],
114
+ ["b", "e"],
115
+ ["b", "f"],
116
+ ["c", "d"],
117
+ ["c", "e"],
118
+ ["c", "f"],
119
+ ["d", "e"],
120
+ ["d", "f"],
121
+ ["e", "f"]]
122
+ ```
123
+
124
+ Derangements:
125
+
126
+ ```ruby
127
+ require 'combinatorics/derange'
128
+
129
+ [:_, :q, :z, :x].derange.to_a
130
+ # => [[:q, :_, :x, :z],
131
+ [:q, :z, :x, :_],
132
+ [:q, :x, :_, :z],
133
+ [:z, :_, :x, :q],
134
+ [:z, :x, :_, :q],
135
+ [:z, :x, :q, :_],
136
+ [:x, :_, :q, :z],
137
+ [:x, :z, :_, :q],
138
+ [:x, :z, :q, :_]]
139
+ ```
140
+
141
+ Permutation cardinality:
142
+
143
+ ```ruby
144
+ require 'combinatorics/permutation'
145
+
146
+ Combinatorics::Permute.cardinality(128)
147
+ # => 8256
148
+ ```
149
+
150
+ List comprehensions:
151
+
152
+ ```ruby
153
+ require 'combinatorics/list_comprehension'
154
+
155
+ [(0..10).step(2),('a'..'c')].comprehension.to_a
156
+ # => [[0, "a"],
157
+ [0, "b"],
158
+ [0, "c"],
159
+ [2, "a"],
160
+ [2, "b"],
161
+ [2, "c"],
162
+ [4, "a"],
163
+ [4, "b"],
164
+ [4, "c"],
165
+ [6, "a"],
166
+ [6, "b"],
167
+ [6, "c"],
168
+ [8, "a"],
169
+ [8, "b"],
170
+ [8, "c"],
171
+ [10, "a"],
172
+ [10, "b"],
173
+ [10, "c"]]
174
+ ```
53
175
 
54
176
  Find the intersecting sub-range between two ranges:
55
177
 
56
- (1..50) & (20..100)
57
- # => (20..50)
178
+ ```ruby
179
+ (1..50) & (20..100)
180
+ # => (20..50)
181
+ ```
58
182
 
59
183
  Enumerate over every sub-range between two ranges:
60
184
 
61
- (1..5).upto(2..10).to_a
62
- # => [1..5, 1..6, 1..7, 1..8, 1..9, 1..10,
63
- 2..5, 2..6, 2..7, 2..8, 2..9, 2..10]
185
+ ```ruby
186
+ (1..5).upto(2..10).to_a
187
+ # => [1..5, 1..6, 1..7, 1..8, 1..9, 1..10,
188
+ 2..5, 2..6, 2..7, 2..8, 2..9, 2..10]
189
+ ```
64
190
 
65
- List comprehensions:
191
+ ## Requirements
66
192
 
67
- require 'combinatorics/list_comprehension'
68
-
69
- [(0..10).step(2),('a'..'c')].comprehension.to_a
70
- # => [[0, "a"],
71
- [0, "b"],
72
- [0, "c"],
73
- [2, "a"],
74
- [2, "b"],
75
- [2, "c"],
76
- [4, "a"],
77
- [4, "b"],
78
- [4, "c"],
79
- [6, "a"],
80
- [6, "b"],
81
- [6, "c"],
82
- [8, "a"],
83
- [8, "b"],
84
- [8, "c"],
85
- [10, "a"],
86
- [10, "b"],
87
- [10, "c"]]
193
+ * [ruby](http://www.ruby-lang.org/) >= 1.8.7
88
194
 
89
195
  ## Install
90
196
 
91
- $ sudo gem install combinatorics
197
+ ```shell
198
+ $ gem install combinatorics
199
+ ```
92
200
 
93
- ## License
201
+ ## Copyright
94
202
 
95
- See {file:LICENSE.txt} for license information.
203
+ Copyright (c) 2010-2022 Hal Brodigan
96
204
 
205
+ See {file:LICENSE.txt} for license information.