Permutations/Derangements: Difference between revisions
Content added Content deleted
(→{{header|Kotlin}}: Updated example see https://github.com/dkandalov/rosettacode-kotlin for details) |
(Added Julia language) |
||
Line 1,690: | Line 1,690: | ||
Computed approximation to !20 (15 significant digits): 895014631192902000</lang> |
Computed approximation to !20 (15 significant digits): 895014631192902000</lang> |
||
=={{header|Julia}}== |
|||
{{trams|Python}} |
|||
<lang julia># v0.6 |
|||
using Combinatorics |
|||
derangements(n::Int) = (perm for perm in permutations(1:n) |
|||
if all(indx != p for (indx, p) in enumerate(perm))) |
|||
function subfact(n::Integer)::Integer |
|||
if n in (0, 2) |
|||
return 1 |
|||
elseif n == 1 |
|||
return 0 |
|||
elseif 1 ≤ n ≤ 18 |
|||
return round(Int, factorial(n) / e) |
|||
elseif n > 0 |
|||
return (n - 1) * ( subfact(n - 1) + subfact(n - 2) ) |
|||
else |
|||
error() |
|||
end |
|||
end |
|||
println("Derangements of [1, 2, 3, 4]") |
|||
for perm in derangements(4) |
|||
println(perm) |
|||
end |
|||
@printf("\n%5s%13s%13s\n", "n", "derangements", "!n") |
|||
for n in 1:10 |
|||
ders = derangements(n) |
|||
subf = subfact(n) |
|||
@printf("%5i%13i%13i\n", n, length(collect(ders)), subf) |
|||
end |
|||
println("\n!20 = ", subfact(20))</lang> |
|||
{{out}} |
|||
<pre>Derangements of [1, 2, 3, 4] |
|||
[2, 1, 4, 3] |
|||
[2, 3, 4, 1] |
|||
[2, 4, 1, 3] |
|||
[3, 1, 4, 2] |
|||
[3, 4, 1, 2] |
|||
[3, 4, 2, 1] |
|||
[4, 1, 2, 3] |
|||
[4, 3, 1, 2] |
|||
[4, 3, 2, 1] |
|||
n derangements !n |
|||
1 0 0 |
|||
2 1 1 |
|||
3 2 2 |
|||
4 9 9 |
|||
5 44 44 |
|||
6 265 265 |
|||
7 1854 1854 |
|||
8 14833 14833 |
|||
9 133496 133496 |
|||
10 1334961 1334961 |
|||
!20 = 895014631192902121</pre> |
|||
=={{header|Kotlin}}== |
=={{header|Kotlin}}== |
||
<lang scala>// version 1.1.2 |
<lang scala>// version 1.1.2 |