Combinations and permutations: Difference between revisions
Content added Content deleted
(Moved Rust to the proper place) |
|||
Line 2,505: | Line 2,505: | ||
Ruby's Arrays have a permutation and a combination method which result in (lazy) enumerators. These Enumerators have a "size" method, which returns the size of the enumerator, or nil if it can’t be calculated lazily. (Since Ruby 2.0) |
Ruby's Arrays have a permutation and a combination method which result in (lazy) enumerators. These Enumerators have a "size" method, which returns the size of the enumerator, or nil if it can’t be calculated lazily. (Since Ruby 2.0) |
||
<syntaxhighlight lang="ruby">(1..60).to_a.combination(53).size #=> 386206920</syntaxhighlight> |
<syntaxhighlight lang="ruby">(1..60).to_a.combination(53).size #=> 386206920</syntaxhighlight> |
||
=={{header|Rust}}== |
|||
{{trans|zig}} |
|||
Almost a verbatim port... the logic is retained but I renounce anyway to use `io::stdout()`, `println!()` is enough. I wonder why f64?! |
|||
<syntaxhighlight lang="rust"> |
|||
fn perm(n: f64, k: f64) -> f64 { |
|||
let mut result: f64 = 1.0; |
|||
let mut i: f64 = 0.0; |
|||
while i < k { |
|||
result *= n - i; |
|||
i += 1.0; |
|||
} |
|||
result |
|||
} |
|||
fn comb(n: f64, k: f64) -> f64 { |
|||
perm(n, k) / perm(k, k) |
|||
} |
|||
fn main() { |
|||
const P: f64 = 12.0; |
|||
const C: f64 = 60.0; |
|||
let mut j: f64 = 1.0; |
|||
let mut k: f64 = 10.0; |
|||
while j < P { |
|||
println!("P({},{}) = {}", P, j, perm(P, j).floor()); |
|||
j += 1.0; |
|||
} |
|||
while k < C { |
|||
println!("C({},{}) = {}", C, k, comb(C, k).floor()); |
|||
k += 10.0; |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
P(12,1) = 12 |
|||
P(12,2) = 132 |
|||
P(12,3) = 1320 |
|||
P(12,4) = 11880 |
|||
P(12,5) = 95040 |
|||
P(12,6) = 665280 |
|||
P(12,7) = 3991680 |
|||
P(12,8) = 19958400 |
|||
P(12,9) = 79833600 |
|||
P(12,10) = 239500800 |
|||
P(12,11) = 479001600 |
|||
C(60,10) = 75394027566 |
|||
C(60,20) = 4191844505805495 |
|||
C(60,30) = 118264581564861420 |
|||
C(60,40) = 4191844505805495 |
|||
C(60,50) = 75394027566 |
|||
</pre> |
|||
=={{header|Scheme}}== |
=={{header|Scheme}}== |
||
Line 3,187: | Line 3,251: | ||
} |
} |
||
}</syntaxhighlight> |
}</syntaxhighlight> |
||
{{out}} |
|||
<pre> |
|||
P(12,1) = 12 |
|||
P(12,2) = 132 |
|||
P(12,3) = 1320 |
|||
P(12,4) = 11880 |
|||
P(12,5) = 95040 |
|||
P(12,6) = 665280 |
|||
P(12,7) = 3991680 |
|||
P(12,8) = 19958400 |
|||
P(12,9) = 79833600 |
|||
P(12,10) = 239500800 |
|||
P(12,11) = 479001600 |
|||
C(60,10) = 75394027566 |
|||
C(60,20) = 4191844505805495 |
|||
C(60,30) = 118264581564861420 |
|||
C(60,40) = 4191844505805495 |
|||
C(60,50) = 75394027566 |
|||
</pre> |
|||
=={{header|Rust}}== |
|||
{{trans|zig}} |
|||
Almost a verbatim port... the logic is retained but I renounce anyway to use `io::stdout()`, `println!()` is enough. I wonder why f64?! |
|||
<syntaxhighlight lang="rust"> |
|||
fn perm(n: f64, k: f64) -> f64 { |
|||
let mut result: f64 = 1.0; |
|||
let mut i: f64 = 0.0; |
|||
while i < k { |
|||
result *= n - i; |
|||
i += 1.0; |
|||
} |
|||
result |
|||
} |
|||
fn comb(n: f64, k: f64) -> f64 { |
|||
perm(n, k) / perm(k, k) |
|||
} |
|||
fn main() { |
|||
const P: f64 = 12.0; |
|||
const C: f64 = 60.0; |
|||
let mut j: f64 = 1.0; |
|||
let mut k: f64 = 10.0; |
|||
while j < P { |
|||
println!("P({},{}) = {}", P, j, perm(P, j).floor()); |
|||
j += 1.0; |
|||
} |
|||
while k < C { |
|||
println!("C({},{}) = {}", C, k, comb(C, k).floor()); |
|||
k += 10.0; |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
{{out}} |
{{out}} |