Ordered partitions: Difference between revisions

m
→‎{{header|Wren}}: Changed to Wren S/H
(→‎{{header|Perl 6}}: provisional fix)
m (→‎{{header|Wren}}: Changed to Wren S/H)
 
(27 intermediate revisions by 15 users not shown)
Line 1:
{{task|Discrete math}}
 
In this task we want to find the ordered partitions into fixed-size blocks. This task is related to [[Combinations]] in that it has to do with discrete mathematics and moreover a helper function to compute combinations is (probably) needed to solve this task.
In this task we want to find the ordered partitions into fixed-size blocks.
 
This task is related to [[Combinations]] in that it has to do with discrete mathematics and moreover a helper function to compute combinations is (probably) needed to solve this task.
 
<math>partitions(\mathit{arg}_1,\mathit{arg}_2,...,\mathit{arg}_n)</math> should generate all distributions of the elements in <math>\{1,...,\Sigma_{i=1}^n\mathit{arg}_i\}</math> into <math>n</math> blocks of respective size <math>\mathit{arg}_1,\mathit{arg}_2,...,\mathit{arg}_n</math>.
Line 29 ⟶ 32:
:<math>{\mathit{arg}_1+\mathit{arg}_2+...+\mathit{arg}_n \choose \mathit{arg}_1} \cdot {\mathit{arg}_2+\mathit{arg}_3+...+\mathit{arg}_n \choose \mathit{arg}_2} \cdot \ldots \cdot {\mathit{arg}_n \choose \mathit{arg}_n}</math>
(see [http://en.wikipedia.org/wiki/Binomial_coefficient the definition of the binomial coefficient] if you are not familiar with this notation) and the number of elements remains the same regardless of how the argument is permuted
(i.e. the [http://en.wikipedia.org/wiki/Multinomial_coefficient multinomial coefficient]). Also, <math>partitions(1,1,1)</math> creates the permutations of <math>\{1,2,3\}</math> and thus there would be <math>3! = 6</math> elements in the list.
 
Also, <math>partitions(1,1,1)</math> creates the permutations of <math>\{1,2,3\}</math> and thus there would be <math>3! = 6</math> elements in the list.
 
Note: Do not use functions that are not in the standard library of the programming language you use. Your file should be written so that it can be executed on the command line and by default outputs the result of <math>partitions(2,0,2)</math>. If the programming language does not support polyvariadic functions pass a list as an argument.
Line 37 ⟶ 42:
Here are some explanatory remarks on the notation used in the task description:
 
<math>\{1, \ldots, n\}</math> denotes the set of consecutive numbers from <math>1</math> to <math>n</math>, e.g. <math>\{1,2,3\}</math> if <math>n = 3</math>. <math>\Sigma</math> is the mathematical notation for summation, e.g. <math>\Sigma_{i=1}^3 i = 6</math> (see also [http://en.wikipedia.org/wiki/Summation#Capital-sigma_notation]). <math>\mathit{arg}_1,\mathit{arg}_2,...,\mathit{arg}_n</math> are the arguments — natural numbers — that the sought function receives.
 
<math>\Sigma</math> is the mathematical notation for summation, e.g. <math>\Sigma_{i=1}^3 i = 6</math> (see also [http://en.wikipedia.org/wiki/Summation#Capital-sigma_notation]).
 
<math>\mathit{arg}_1,\mathit{arg}_2,...,\mathit{arg}_n</math> are the arguments — natural numbers — that the sought function receives.
<br><br>
 
=={{header|11l}}==
{{trans|Nim}}
 
<syntaxhighlight lang="11l">F partitions(lengths)
[[[Int]]] r
[(Int, Int)] slices
V delta = -1
V idx = 0
L(length) lengths
assert(length >= 0, ‘lengths must not be negative.’)
delta += length
slices.append((idx, delta))
idx += length
 
V n = sum(lengths)
V perm = Array(1 .. n)
 
L
[[Int]] part
L(start, end) slices
V s = perm[start .. end]
I !s.is_sorted()
L.break
part.append(s)
L.was_no_break
r.append(part)
 
I !perm.next_permutation()
L.break
 
R r
 
F toString(part)
V result = ‘(’
L(s) part
I result.len > 1
result ‘’= ‘, ’
result ‘’= ‘{’s.join(‘, ’)‘}’
R result‘)’
 
F displayPermutations(lengths)
print(‘Ordered permutations for (’lengths.join(‘, ’)‘):’)
L(part) partitions(lengths)
print(toString(part))
 
:start:
I :argv.len > 1
displayPermutations(:argv[1..].map(Int))
E
displayPermutations([2, 0, 2])</syntaxhighlight>
 
{{out}}
<pre>
Ordered permutations for (2, 0, 2):
({1, 2}, {}, {3, 4})
({1, 3}, {}, {2, 4})
({1, 4}, {}, {2, 3})
({2, 3}, {}, {1, 4})
({2, 4}, {}, {1, 3})
({3, 4}, {}, {1, 2})
 
Ordered permutations for (1, 1, 1):
({1}, {2}, {3})
({1}, {3}, {2})
({2}, {1}, {3})
({2}, {3}, {1})
({3}, {1}, {2})
({3}, {2}, {1})
</pre>
 
=={{header|Ada}}==
partitions.ads:
<langsyntaxhighlight Adalang="ada">with Ada.Containers.Indefinite_Ordered_Sets;
with Ada.Containers.Ordered_Sets;
package Partitions is
Line 53 ⟶ 133:
(Partition);
function Create_Partitions (Args : Arguments) return Partition_Sets.Set;
end Partitions;</langsyntaxhighlight>
 
partitions.adb:
<langsyntaxhighlight Adalang="ada">package body Partitions is
-- compare number sets (not provided)
function "<" (Left, Right : Number_Sets.Set) return Boolean is
Line 203 ⟶ 283:
return Result;
end Create_Partitions;
end Partitions;</langsyntaxhighlight>
 
example main.adb:
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO;
with Partitions;
procedure Main is
Line 266 ⟶ 346:
Ada.Text_IO.New_Line;
end;
end Main;</langsyntaxhighlight>
 
Output:
Line 279 ⟶ 359:
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> DIM list1%(2) : list1%() = 2, 0, 2
PRINT "partitions(2,0,2):"
PRINT FNpartitions(list1%())
Line 330 ⟶ 410:
j% -= 1
ENDWHILE
= TRUE</langsyntaxhighlight>
'''Output:'''
<pre>
Line 366 ⟶ 446:
=={{header|C}}==
Watch out for blank for loops. Iterative permutation generation is described at [[http://en.wikipedia.org/wiki/Permutation#Systematic_generation_of_all_permutations]]; code messness is purely mine.
<langsyntaxhighlight Clang="c">#include <stdio.h>
 
int next_perm(int size, int * nums)
Line 416 ⟶ 496:
 
return 1;
}</langsyntaxhighlight>
Output:
<pre>Part 2 0 2:
Line 434 ⟶ 514:
{ 0 } { 1 2 } { 3 5 6 } { 4 7 8 9 }
....</pre>
With bitfield:<langsyntaxhighlight lang="c">#include <stdio.h>
 
typedef unsigned int uint;
Line 484 ⟶ 564:
 
return 0;
}</langsyntaxhighlight>
 
=={{header|C sharp}}==
<syntaxhighlight lang="csharp">using System;
using System.Linq;
using System.Collections.Generic;
 
public static class OrderedPartitions
{
public static void Main() {
var input = new [] { new[] { 0, 0, 0, 0, 0 }, new[] { 2, 0, 2 }, new[] { 1, 1, 1 } };
foreach (int[] sizes in input) {
foreach (var partition in Partitions(sizes)) {
Console.WriteLine(partition.Select(set => set.Delimit(", ").Encase('{','}')).Delimit(", ").Encase('(', ')'));
}
Console.WriteLine();
}
}
 
static IEnumerable<IEnumerable<int[]>> Partitions(params int[] sizes) {
var enumerators = new IEnumerator<int[]>[sizes.Length];
var unused = Enumerable.Range(1, sizes.Sum()).ToSortedSet();
var arrays = sizes.Select(size => new int[size]).ToArray();
 
for (int s = 0; s >= 0; ) {
if (s == sizes.Length) {
yield return arrays;
s--;
}
if (enumerators[s] == null) {
enumerators[s] = Combinations(sizes[s], unused.ToArray()).GetEnumerator();
} else {
unused.UnionWith(arrays[s]);
}
if (enumerators[s].MoveNext()) {
enumerators[s].Current.CopyTo(arrays[s], 0);
unused.ExceptWith(arrays[s]);
s++;
} else {
enumerators[s] = null;
s--;
}
}
}
 
static IEnumerable<T[]> Combinations<T>(int count, params T[] array) {
T[] result = new T[count];
foreach (int pattern in BitPatterns(array.Length - count, array.Length)) {
for (int b = 1 << (array.Length - 1), i = 0, r = 0; b > 0; b >>= 1, i++) {
if ((pattern & b) == 0) result[r++] = array[i];
}
yield return result;
}
}
 
static IEnumerable<int> BitPatterns(int ones, int length) {
int initial = (1 << ones) - 1;
int blockMask = (1 << length) - 1;
for (int v = initial; v >= initial; ) {
yield return v;
if (v == 0) break;
 
int w = (v | (v - 1)) + 1;
w |= (((w & -w) / (v & -v)) >> 1) - 1;
v = w & blockMask;
}
}
 
static string Delimit<T>(this IEnumerable<T> source, string separator) => string.Join(separator, source);
static string Encase(this string s, char start, char end) => start + s + end;
}</syntaxhighlight>
{{out}}
<pre>
({}, {}, {}, {}, {})
 
({1, 2}, {}, {3, 4})
({1, 3}, {}, {2, 4})
({1, 4}, {}, {2, 3})
({2, 3}, {}, {1, 4})
({2, 4}, {}, {1, 3})
({3, 4}, {}, {1, 2})
 
({1}, {2}, {3})
({1}, {3}, {2})
({2}, {1}, {3})
({2}, {3}, {1})
({3}, {1}, {2})
({3}, {2}, {1})</pre>
 
=={{header|C++}}==
<syntaxhighlight lang="cpp">
#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>
 
void partitions(std::vector<size_t> args) {
size_t sum = std::accumulate(std::begin(args), std::end(args), 0);
std::vector<size_t> nums(sum);
std::iota(std::begin(nums), std::end(nums), 1);
do {
size_t total_index = 0;
std::vector<std::vector<size_t>> parts;
for (const auto& a : args) {
std::vector<size_t> part;
bool cont = true;
for (size_t j = 0; j < a; ++j) {
for (const auto& p : part) {
if (nums[total_index] < p) {
cont = false;
break;
}
}
if (cont) {
part.push_back(nums[total_index]);
++total_index;
}
}
if (part.size() != a) {
break;
}
parts.push_back(part);
}
if (parts.size() == args.size()) {
std::cout << "(";
for (const auto& p : parts) {
std::cout << "{ ";
for (const auto& e : p) {
std::cout << e << " ";
}
std::cout << "},";
}
std::cout << ")," << std::endl;
}
} while (std::next_permutation(std::begin(nums), std::end(nums)));
}
 
int main() {
std::vector<size_t> args = { 2, 0, 2 };
partitions(args);
std::cin.ignore();
std::cin.get();
return 0;
}</syntaxhighlight>
 
{{out}}
<pre>({ 1 2 },{ },{ 3 4 },),
({ 1 3 },{ },{ 2 4 },),
({ 1 4 },{ },{ 2 3 },),
({ 2 3 },{ },{ 1 4 },),
({ 2 4 },{ },{ 1 3 },),
({ 3 4 },{ },{ 1 2 },),</pre>
 
=={{header|Common Lisp}}==
Lexicographical generation of partitions. Pros: can handle duplicate elements; probably faster than some methods generating all permutations then throwing bad ones out. Cons: clunky (which is probably my fault).
<langsyntaxhighlight lang="lisp">(defun fill-part (x i j l)
(let ((e (elt x i)))
(loop for c in l do
Line 533 ⟶ 764:
(loop while a do
(format t "~a~%" a)
(setf a (next-part a #'string<))))</langsyntaxhighlight>output
<pre>#((1 2) NIL (3 4))
#((1 3) NIL (2 4))
Line 549 ⟶ 780:
{{trans|Python}}
Using module of the third D entry of the Combination Task.
<langsyntaxhighlight lang="d">import std.stdio, std.algorithm, std.range, std.array, std.conv,
combinations3;
 
Line 573 ⟶ 804:
auto b = args.length > 1 ? args.dropOne.to!(int[]) : [2, 0, 2];
writefln("%(%s\n%)", b.orderPart);
}</langsyntaxhighlight>
{{out}}
<pre>[[1, 2], [], [3, 4]]
Line 584 ⟶ 815:
===Alternative Version===
{{trans|C}}
<langsyntaxhighlight lang="d">import core.stdc.stdio;
 
void genBits(size_t N)(ref uint[N] bits, in ref uint[N] parts,
Line 627 ⟶ 858:
uint[parts.length] bits;
genBits(bits, parts, m - 1, m - 1, 0, parts[0], 0);
}</langsyntaxhighlight>
{{out}}
<pre>[1 2 ][][3 4 ]
Line 637 ⟶ 868:
 
=={{header|EchoLisp}}==
<langsyntaxhighlight lang="scheme">
(lib 'list) ;; (combinations L k)
 
Line 663 ⟶ 894:
writeln
(_partitions (range 1 (1+ (apply + args))) args )))
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 700 ⟶ 931:
{{trans|Ruby}}
Brute force approach:
<langsyntaxhighlight lang="elixir">defmodule Ordered do
def partition([]), do: [[]]
def partition(mask) do
Line 729 ⟶ 960:
IO.inspect part
end)
end)</langsyntaxhighlight>
 
{{out}}
Line 755 ⟶ 986:
[[1, 2], [], [3, 4]]
</pre>
 
 
=={{header|FreeBASIC}}==
{{trans|BBC BASIC}}
<syntaxhighlight lang="freebasic">Function Perm(x() As Integer) As Boolean
Dim As Integer i, j
For i = Ubound(x,1)-1 To 0 Step -1
If x(i) < x(i+1) Then Exit For
Next i
If i < 0 Then Return False
j = Ubound(x,1)
While x(j) <= x(i)
j -= 1
Wend
Swap x(i), x(j)
i += 1
j = Ubound(x,1)
While i < j
Swap x(i), x(j)
i += 1
j -= 1
Wend
Return True
End Function
 
Function Particiones(list() As Integer) As String
Dim As Integer i, j, n, p ', x()
Dim As String oSS = ""
n = Ubound(list)
Dim As Integer x(n)
For i = 0 To n
If list(i) Then
For j = 1 To list(i)
x(p) = i
p += 1
Next j
End If
Next i
Do
For i = 0 To n
oSS += " ( "
For j = 0 To Ubound(x,1)
If x(j) = i Then oSS += Str(j+1) + " "
Next j
oSS += ")"
Next i
oSS += Chr(13) + Chr(10)
Loop Until Not Perm(x())
Return oSS
End Function
 
Dim list2(2) As Integer = {1, 1, 1}
Print "Particiones(1, 1, 1):"
Print Particiones(list2())
Dim list3(3) As Integer = {1, 2, 0, 1}
Print !"\nParticiones(1, 2, 0, 1):"
Print Particiones(list3())
 
Sleep</syntaxhighlight>
{{out}}
<pre>
Particiones(1, 1, 1):
( 1 ) ( 2 ) ( 3 )
( 1 ) ( 3 ) ( 2 )
( 2 ) ( 1 ) ( 3 )
( 3 ) ( 1 ) ( 2 )
( 2 ) ( 3 ) ( 1 )
( 3 ) ( 2 ) ( 1 )
 
 
Particiones(1, 2, 0, 1):
( 1 ) ( 2 3 ) ( ) ( 4 )
( 1 ) ( 2 4 ) ( ) ( 3 )
( 1 ) ( 3 4 ) ( ) ( 2 )
( 2 ) ( 1 3 ) ( ) ( 4 )
( 2 ) ( 1 4 ) ( ) ( 3 )
( 3 ) ( 1 2 ) ( ) ( 4 )
( 4 ) ( 1 2 ) ( ) ( 3 )
( 3 ) ( 1 4 ) ( ) ( 2 )
( 4 ) ( 1 3 ) ( ) ( 2 )
( 2 ) ( 3 4 ) ( ) ( 1 )
( 3 ) ( 2 4 ) ( ) ( 1 )
( 4 ) ( 2 3 ) ( ) ( 1 )
</pre>
 
 
=={{header|GAP}}==
<langsyntaxhighlight lang="gap">FixedPartitions := function(arg)
local aux;
aux := function(i, u)
Line 784 ⟶ 1,100:
FixedPartitions(1, 1, 1);
# [ [ [ 1 ], [ 2 ], [ 3 ] ], [ [ 1 ], [ 3 ], [ 2 ] ], [ [ 2 ], [ 1 ], [ 3 ] ],
# [ [ 2 ], [ 3 ], [ 1 ] ], [ [ 3 ], [ 1 ], [ 2 ] ], [ [ 3 ], [ 2 ], [ 1 ] ] ]</langsyntaxhighlight>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 846 ⟶ 1,162:
}
ordered_part(n)
}</langsyntaxhighlight>
Example command line use:
<pre>
Line 882 ⟶ 1,198:
=={{header|Groovy}}==
Solution:
<langsyntaxhighlight lang="groovy">def partitions = { int... sizes ->
int n = (sizes as List).sum()
def perms = n == 0 ? [[]] : (1..n).permutations()
Line 894 ⟶ 1,210:
return recomp[0] <=> recomp[1]
}
}</langsyntaxhighlight>
 
Test:
<langsyntaxhighlight lang="groovy">partitions(2, 0, 2).each {
println it
}</langsyntaxhighlight>
 
Output:
Line 910 ⟶ 1,226:
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">import Data.List ((\\))
 
comb :: Int -> [a] -> [[a]]
Line 922 ⟶ 1,238:
p xs (k:ks) = [ cs:rs | cs <- comb k xs, rs <- p (xs \\ cs) ks ]
 
main = print $ partitions [2,0,2]</langsyntaxhighlight>
 
An alternative where <code>\\</code> is not needed anymore because <code>comb</code> now not only
keeps the chosen elements but also the not chosen elements together in a tuple.
 
<langsyntaxhighlight lang="haskell">comb :: Int -> [a] -> [([a],[a])]
comb 0 xs = [([],xs)]
comb _ [] = []
Line 938 ⟶ 1,254:
p xs (k:ks) = [ cs:rs | (cs,zs) <- comb k xs, rs <- p zs ks ]
 
main = print $ partitions [2,0,2]</langsyntaxhighlight>
 
Output:
Line 947 ⟶ 1,263:
 
Faster by keeping track of the length of lists:
<syntaxhighlight lang="haskell">import Data.Bifunctor (first, second)
<lang haskell>-- choose m out of n items, return tuple of chosen and the rest
choose aa _ 0 = [([], aa)]
choose aa@(a:as) n m
| n == m = [(aa, [])]
| otherwise = map (\(x,y) -> (a:x, y)) (choose as (n-1) (m-1)) ++
map (\(x,y) -> (x, a:y)) (choose as (n-1) m)
 
-- choose m out of n items, return tuple of chosen and the rest
partitions x = combos [1..n] n x where
n = sum x
combos _ _ [] = [[]]
combos s n (x:xs) = [ l : r | (l,rest) <- choose s n x,
r <- combos rest (n - x) xs]
 
choose :: [Int] -> Int -> Int -> [([Int], [Int])]
choose [] _ _ = [([], [])]
choose aa _ 0 = [([], aa)]
choose aa@(a : as) n m
| n == m = [(aa, [])]
| otherwise =
(first (a :) <$> choose as (n - 1) (m - 1))
<> (second (a :) <$> choose as (n - 1) m)
 
partitions :: [Int] -> [[[Int]]]
partitions x = combos [1 .. n] n x
where
n = sum x
combos _ _ [] = [[]]
combos s n (x : xs) =
[ l : r
| (l, rest) <- choose s n x,
r <- combos rest (n - x) xs
]
 
main :: IO ()
main = mapM_ print $ partitions [5,5,5]</lang>
main = mapM_ print $ partitions [5, 5, 5]</syntaxhighlight>
 
=={{header|J}}==
Line 967 ⟶ 1,294:
Brute force approach:
 
<langsyntaxhighlight lang="j">require'stats'
partitions=: ([,] {L:0 (i.@#@, -. [)&;)/"1@>@,@{@({@comb&.> +/\.)</langsyntaxhighlight>
 
First we compute each of the corresponding combinations for each argument, then we form their cartesian product and then we restructure each of those products by: eliminating from values populating the the larger set combinations the combinations already picked from the smaller set and using the combinations from the larger set to index into the options which remain.
Line 974 ⟶ 1,301:
Examples:
 
<langsyntaxhighlight lang="j"> partitions 2 0 2
┌───┬┬───┐
│0 1││2 3│
Line 1,012 ⟶ 1,339:
360360
*/ (! +/\.)3 5 7
360360</langsyntaxhighlight>
 
Here's some intermediate results for that first example:
 
<langsyntaxhighlight Jlang="j"> +/\. 2 0 2
4 2 2
({@comb&.> +/\.) 2 0 2
Line 1,037 ⟶ 1,364:
├───┼┼───┤
│2 3││0 1│
└───┴┴───┘</langsyntaxhighlight>
 
In other words, initially we just work with relevant combinations (working from right to left). To understand the step which produces the final result, consider this next sequence of results (J's <code>/</code> operator works from right to left, as that's the pattern established by assignment operations, and because that has some interesting and useful mathematical properties):
 
<langsyntaxhighlight Jlang="j"> ([,] {L:0 (i.@#@, -. [)&;)/0 1;0 1
┌───┬───┐
│0 1│2 3│
Line 1,052 ⟶ 1,379:
┌───┬───┬───┬───┐
│0 1│2 3│4 5│6 7│
└───┴───┴───┴───┘</langsyntaxhighlight>
 
Breaking down that last example:
 
<langsyntaxhighlight Jlang="j"> (<0 1) ([,] {L:0 (i.@#@, -. [)&;)0 1;2 3;4 5
┌───┬───┬───┬───┐
│0 1│2 3│4 5│6 7│
└───┴───┴───┴───┘</langsyntaxhighlight>
 
Here, on the right hand side we form 0 1 0 1 2 3 4 5, count how many things are in it (8), form 0 1 2 3 4 5 6 7 from that and then remove 0 1 (the values in the left argument) leaving us with 2 3 4 5 6 7. Meanwhile, on the left side, keep our left argument intact and use the indices in the remaining boxes to select from the right argument. In theoretical terms this is not particularly efficient, but we are working with very short lists here (because otherwise we run out of memory for the result as a whole), so the actual cost is trivial. Also note that sequential loops tend to be faster than nested loops (though we do get the effect of a nested loop, here - and that was the theoretical inefficiency).
 
=={{header|Java}}==
 
<syntaxhighlight lang="java">
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
 
public final class OrderedPartitions {
 
public static void main(String[] aArgs) {
List<Integer> sizes = ( aArgs == null || aArgs.length == 0 ) ?
List.of( 2, 0, 2 ) : Arrays.stream(aArgs).map( s -> Integer.valueOf(s) ).toList();
System.out.println("Partitions for " + sizes + ":");
final int total = sizes.stream().reduce(0, Integer::sum);
List<Integer> permutation = IntStream.rangeClosed(1, total).boxed().collect(Collectors.toList());
while ( hasNextPermutation(permutation) ) {
List<List<Integer>> partition = new ArrayList<List<Integer>>();
int sum = 0;
boolean isValid = true;
for ( int size : sizes ) {
List<Integer> subList = permutation.subList(sum, sum + size);
if ( ! isIncreasing(subList) ) {
isValid = false;
break;
}
partition.add(subList);
sum += size;
}
if ( isValid ) {
System.out.println(" ".repeat(4) + partition);
}
}
}
private static boolean hasNextPermutation(List<Integer> aPerm) {
final int lastIndex = aPerm.size() - 1;
int i = lastIndex;
while ( i > 0 && aPerm.get(i - 1) >= aPerm.get(i) ) {
i--;
}
if ( i <= 0 ) {
return false;
}
int j = lastIndex;
while ( aPerm.get(j) <= aPerm.get(i - 1) ) {
j--;
}
swap(aPerm, i - 1, j);
j = lastIndex;
while ( i < j ) {
swap(aPerm, i++, j--);
}
return true;
}
private static boolean isIncreasing(List<Integer> aList) {
return aList.stream().sorted().toList().equals(aList);
}
private static void swap(List<Integer> aList, int aOne, int aTwo) {
final int temp = aList.get(aOne);
aList.set(aOne, aList.get(aTwo));
aList.set(aTwo, temp);
}
 
}
</syntaxhighlight>
{{ out }}
<pre>
Partitions for [2, 0, 2]:
[[1, 3], [], [2, 4]]
[[1, 4], [], [2, 3]]
[[2, 3], [], [1, 4]]
[[2, 4], [], [1, 3]]
[[3, 4], [], [1, 2]]
</pre>
 
=={{header|JavaScript}}==
Line 1,069 ⟶ 1,483:
{{trans|Haskell}}
 
<langsyntaxhighlight JavaScriptlang="javascript">(function () {
'use strict';
 
Line 1,129 ⟶ 1,543:
return partitions(2, 0, 2);
 
})();</langsyntaxhighlight>
 
{{Out}}
 
<langsyntaxhighlight JavaScriptlang="javascript">[[[1, 2], [], [3, 4]],
[[1, 3], [], [2, 4]],
[[1, 4], [], [2, 3]],
[[2, 3], [], [1, 4]],
[[2, 4], [], [1, 3]],
[[3, 4], [], [1, 2]]]</langsyntaxhighlight>
 
=={{header|jq}}==
{{works with|jq|1.4}}
''The approach adopted here is similar to the [[#Python]] solution''.
<langsyntaxhighlight lang="jq"># Generate a stream of the distinct combinations of r items taken from the input array.
def combination(r):
if r > length or r < 0 then empty
Line 1,162 ⟶ 1,576:
| [$c] + ($mask[1:] | p(s - $c))
end;
. as $mask | p( [range(1; 1 + ($mask|add))] );</langsyntaxhighlight>
'''Example''':
<langsyntaxhighlight lang="jq">([],[0,0,0],[1,1,1],[2,0,2])
| . as $test_case
| "partitions \($test_case):" , ($test_case | partition), ""</langsyntaxhighlight>
{{Out}}
<langsyntaxhighlight lang="sh">$ jq -M -n -c -r -f Ordered_partitions.jq
 
partitions []:
Line 1,190 ⟶ 1,604:
[[2,3],[],[1,4]]
[[2,4],[],[1,3]]
[[3,4],[],[1,2]]</langsyntaxhighlight>
 
=={{header|Julia}}==
The method used, as seen in the function masked(), is to take a brute force permutation of size n = sum of partition,
partition it using the provided mask, and then sort the inner lists in order to properly filter duplicates.
<syntaxhighlight lang="julia">
<lang Julian>
using Combinatorics
 
Line 1,221 ⟶ 1,635:
println(orderedpartitions([1, 1, 1]))
 
</syntaxhighlight>
</lang>
{{output}}
<pre>
Line 1,239 ⟶ 1,653:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.1.3
 
fun nextPerm(perm: IntArray): Boolean {
Line 1,307 ⟶ 1,721:
while (nextPerm(perm))
println("]")
}</langsyntaxhighlight>
 
{{out}}
Line 1,340 ⟶ 1,754:
=={{header|Lua}}==
A pretty verbose solution. Maybe somebody can replace with something terser/better.
<langsyntaxhighlight lang="lua">--- Create a list {1,...,n}.
local function range(n)
local res = {}
Line 1,428 ⟶ 1,842:
end
io.write "]"
io.write "\n"</langsyntaxhighlight>
 
Output:
Line 1,436 ⟶ 1,850:
</pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
 
This code works as follows:
 
'''Permutations''' finds all permutations of the numbers ranging from 1 to n.
 
'''w''' finds the required partition for an individual permutation.
 
'''m''' finds partitions for all permutations.
 
'''Sort''' and '''Union''' eliminate duplicates.
 
<syntaxhighlight lang="mathematica">w[partitions_]:=Module[{s={},t=Total@partitions,list=partitions,k}, n=Length[list];
<lang Mathematica>
w[partitions_]:=Module[{s={},t=Total@partitions,list=partitions,k}, n=Length[list];
While[n>0,s=Join[s,{Take[t,(k=First[list])]}];t=Drop[t,k];list=Rest[list];n--]; s]
m[p_]:=(Sort/@#)&/@(w[#,p]&/@Permutations[Range@Total[p]])//Union</syntaxhighlight>
'''Usage'''
Grid displays the output in a table.
<syntaxhighlight lang="mathematica">Grid@m[{2, 0, 2}]
Grid@m[{1, 1, 1}]</syntaxhighlight>
[[File:Example.png]]
 
=={{header|Nim}}==
m[p_]:=(Sort/@#)&/@(w[#,p]&/@Permutations[Range@Total[p]])//Union
We use the function <code>nextPermutation</code> form standard module “algorithm” to build the permutations. The partition is built by using a list of slices. We keep only the partitions which contain sequences sorted by ascending order. Those partitions are yielded by an iterator.
</lang>
 
The iterator may be called with a list of integer arguments or a single list of integers as argument.
As requested, the arguments specifying the length of each sequence may also be provided on the command line.
 
<syntaxhighlight lang="nim">import algorithm, math, sequtils, strutils
'''Usage'''
 
type Partition = seq[seq[int]]
Grid displays the output in a table.
 
<lang Mathematica>
Grid@m[{2, 0, 2}]
 
func isIncreasing(s: seq[int]): bool =
Grid@m[{1, 1, 1}]
## Return true if the sequence is sorted in increasing order.
</lang>
var prev = 0
for val in s:
if prev >= val: return false
prev = val
result = true
 
 
[[File:Example.png]]
iterator partitions(lengths: varargs[int]): Partition =
## Yield the partitions for lengths "lengths".
 
# Build the list of slices to use for partitionning.
var slices: seq[Slice[int]]
var delta = -1
var idx = 0
for length in lengths:
assert length >= 0, "lengths must not be negative."
inc delta, length
slices.add idx..delta
inc idx, length
 
# Build the partitions.
let n = sum(lengths)
var perm = toSeq(1..n)
while true:
 
block buildPartition:
var part: Partition
for slice in slices:
let s = perm[slice]
if not s.isIncreasing():
break buildPartition
part.add s
yield part
 
if not perm.nextPermutation():
break
 
 
func toString(part: Partition): string =
## Return the string representation of a partition.
result = "("
for s in part:
result.addSep(", ", 1)
result.add '{' & s.join(", ") & '}'
result.add ')'
 
 
when isMainModule:
 
import os
 
proc displayPermutations(lengths: varargs[int]) =
## Display the permutations.
echo "Ordered permutations for (", lengths.join(", "), "):"
for part in partitions(lengths):
echo part.toString
 
if paramCount() > 0:
var args: seq[int]
for param in commandLineParams():
try:
let val = param.parseInt()
if val < 0: raise newException(ValueError, "")
args.add val
except ValueError:
quit "Wrong parameter: " & param
displayPermutations(args)
 
else:
displayPermutations(2, 0, 2)</syntaxhighlight>
 
{{out}}
<pre>$ ./ordered_partitions
Ordered permutations for (2, 0, 2):
({1, 2}, {}, {3, 4})
({1, 3}, {}, {2, 4})
({1, 4}, {}, {2, 3})
({2, 3}, {}, {1, 4})
({2, 4}, {}, {1, 3})
({3, 4}, {}, {1, 2})</pre>
<pre>$ ./ordered_partitions 1 1 1
Ordered permutations for (1, 1, 1):
({1}, {2}, {3})
({1}, {3}, {2})
({2}, {1}, {3})
({2}, {3}, {1})
({3}, {1}, {2})
({3}, {2}, {1})</pre>
 
=={{header|Perl}}==
===Threaded Generator Method===
Code 1: threaded generator method. This code demonstrates how to make something like Python's
This code demonstrates how to make something like Python's
generators or Go's channels by using Thread::Queue. Granted, this is horribly inefficient, with constantly creating and killing threads and whatnot (every time a partition is created, a thread is made to produce the next partition, so thousands if not millions of threads live and die, depending on the problem size). But algorithms are often more naturally expressed in a coroutine manner -- for this example, "making a new partition" and "picking elements for a partition" can be done in separate recursions cleanly if so desired. It's about 20 times slower than the next code example, so there.
 
<syntaxhighlight lang ="perl">use Thread 'async'strict;
use warnings;
use Thread 'async';
use Thread::Queue;
 
Line 1,498 ⟶ 2,001:
};
 
$q = new Thread::Queue->new;
(async{ &$gen; # start the main work load
$q->enqueue(undef) # signal that there's no more data
Line 1,514 ⟶ 2,017:
print "@$a | @$b | @$rb\n";
}
}</syntaxhighlight>
}
</lang>
 
Code 2: ===Recursive solution.===
{{trans|Perl 6Raku}}
<syntaxhighlight lang ="perl">use List::Util 1.33 qw(sum pairmap)strict;
use warnings;
use List::Util 1.33 qw(sum pairmap);
 
sub partition {
Line 1,537 ⟶ 2,041:
 
print "(" . join(', ', map { "{".join(', ', @$_)."}" } @$_) . ")\n"
for partition( @ARGV ? @ARGV : (2, 0, 2) );</langsyntaxhighlight>
 
Example command-line use:
Line 1,558 ⟶ 2,062:
</pre>
 
The set of ordered partitions is not returned in lexicographical order itself; but it's supposed to be a set so that's hopefully okay. (One could sort the output before printing, but (unlike in Perl 6Raku) Perl's built-in sort routine cannot meaningfully compare arrays without being passed a custom comparator to do that, which is a little messy and thus omitted here.)
 
=={{header|Perl 6}}==
{{works with|Rakudo|2018.04.1}}
<lang perl6>sub partition(@mask is copy) {
my @op;
my $last = [+] @mask or return [] xx 1;
for @mask.kv -> $k, $v {
next unless $v;
temp @mask[$k] -= 1;
for partition @mask -> @p {
@p[$k].push: $last;
@op.push: @p;
}
}
return @op;
}
 
.say for reverse partition [2,0,2];</lang>
{{out}}
<pre>[[1, 2], (Any), [3, 4]]
[[1, 3], (Any), [2, 4]]
[[2, 3], (Any), [1, 4]]
[[1, 4], (Any), [2, 3]]
[[2, 4], (Any), [1, 3]]
[[3, 4], (Any), [1, 2]]</pre>
 
=={{header|Phix}}==
Uses the permutes() routine [new in 1.0.2], which handles duplicate elements properly, so in the {1,2,3,4} test
Note that the builtin permute() function returns results in an idiosyncratic manner, so we use sort a lot and check for duplicates,
this only generates 12,600 combinations, whereas the previous version generated and obviously filtered and sorted
which might make this a tad inefficient.
all of the possible 3,628,800 full permutations, therefore it is now at least a couple of hundred times faster.
<lang Phix>function partitions(sequence s)
<!--<syntaxhighlight lang="phix">(phixonline)-->
integer N = sum(s)
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
sequence set = tagset(N), perm,
<span style="color: #7060A8;">requires</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"1.0.2"</span><span style="color: #0000FF;">)</span>
results = {}, result, resi
<span style="color: #008080;">function</span> <span style="color: #000000;">partitions</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
for i=1 to factorial(N) do
<span style="color: #004080;">integer</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">N</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
perm = permute(i,set)
<span style="color: #004080;">sequence</span> <span style="color: #000000;">pset</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{},</span> <span style="color: #000080;font-style:italic;">-- eg s==={2,0,2} -&gt; {1,1,3,3}</span>
integer n = 1
<span style="color: #000000;">rn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">l</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- "" -&gt; <nowiki>{{</nowiki>0,0},{},{0,0<nowiki>}}</nowiki></span>
result = {}
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">l</span> <span style="color: #008080;">do</span>
for j=1 to length(s) do
<span style="color: #000000;">pset</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span>
resi = {}
<span style="color: #000000;">rn</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span>
for k=1 to s[j] do
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
resi = append(resi,perm[n])
<span style="color: #008080;">if</span> <span style="color: #000000;">pset</span><span style="color: #0000FF;">={}</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">rn</span><span style="color: #0000FF;">}</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> <span style="color: #000080;font-style:italic;">-- edge case</span>
n += 1
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">permutes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pset</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #000080;font-style:italic;">-- eg {1,1,3,3} means put 1,2 in [1], 3,4 in [3]
result = append(result,sort(resi))
-- .. {3,3,1,1} means put 1,2 in [3], 3,4 in [1]</span>
end for
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
if not find(result,results) then
<span style="color: #004080;">sequence</span> <span style="color: #000000;">ri</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span> <span style="color: #000080;font-style:italic;">-- a "flat" permute</span>
results = append(results,result)
<span style="color: #000000;">rdii</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">l</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- where per set</span>
end if
<span style="color: #004080;">integer</span> <span style="color: #000000;">rii</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
end for
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ri</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
return sort(results)
<span style="color: #004080;">integer</span> <span style="color: #000000;">rdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ri</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">],</span> <span style="color: #000080;font-style:italic;">-- which set</span>
end function
<span style="color: #000000;">rnx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rdii</span><span style="color: #0000FF;">[</span><span style="color: #000000;">rdx</span><span style="color: #0000FF;">]</span> <span style="color: #000080;font-style:italic;">-- wherein""</span>
 
<span style="color: #000000;">rii</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
ppOpt({pp_Nest,1})
<span style="color: #000000;">rn</span><span style="color: #0000FF;">[</span><span style="color: #000000;">rdx</span><span style="color: #0000FF;">][</span><span style="color: #000000;">rnx</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rii</span> <span style="color: #000080;font-style:italic;">-- plant 1..N</span>
pp(partitions({2,0,2}))
<span style="color: #000000;">rdii</span><span style="color: #0000FF;">[</span><span style="color: #000000;">rdx</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rnx</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span>
pp(partitions({1,1,1}))
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
pp(partitions({1,2,0,1}))
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rii</span><span style="color: #0000FF;">=</span><span style="color: #000000;">N</span><span style="color: #0000FF;">)</span>
pp(partitions({}))
<span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rn</span><span style="color: #0000FF;">)</span>
pp(partitions({0,0,0}))</lang>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">test</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">q</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">partitions</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">string</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">ia</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">q</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">?{</span><span style="color: #008000;">"is"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">}:{</span><span style="color: #008000;">"are"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"s"</span><span style="color: #0000FF;">})</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"There %s %,d ordered partion%s for %v:\n{%s}\n"</span><span style="color: #0000FF;">,</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">ia</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">q</span><span style="color: #0000FF;">),</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">p</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">shorten</span><span style="color: #0000FF;">(</span><span style="color: #000000;">q</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%v"</span><span style="color: #0000FF;">),</span><span style="color: #008000;">"\n "</span><span style="color: #0000FF;">)})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #7060A8;">papply</span><span style="color: #0000FF;">({{</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">},{},{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}},</span><span style="color: #000000;">test</span><span style="color: #0000FF;">)</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
There are 6 ordered partions for {2,0,2}:
{{{1,2}, {}, {3,4}},
{{{1,32}, {}, {23,4}},
{{1,43}, {}, {2,34}},
{{21,34}, {}, {12,43}},
{{2,43}, {}, {1,34}},
{{32,4}, {}, {1,2}3}}
{{{13,4}, {2}, {31,2}}},
There are 6 ordered partions for {1,1,1}:
{{1}, {3}, {2}},
{{2{1}, {12}, {3}},
{{21}, {3}, {12}},
{{32}, {1}, {23}},
{{3}, {21}, {1}2}}
{{{12}, {2,3}, {1}, {4}},
{{13}, {2,4}, {1}, {3}},
There are 12 ordered partions for {1,2,0,1}:
{{1}, {3,4}, {}, {2}},
{{2{1}, {12,3}, {}, {4}},
{{21}, {12,4}, {}, {3}},
{{21}, {3,4}, {}, {12}},
{{32}, {1,23}, {}, {4}},
{{32}, {1,4}, {}, {23}},
{{3}, {1,2,4}, {}, {14}},
{{4}, {1,2}, {}, {3}},
{{43}, {1,34}, {}, {2}},
{{4}, {21,3}, {}, {1}2}}
{{2},{3,4},{},{1}}
{{3},{2,4},{},{1}}
{{4},{2,3},{},{1}}}
There are 12,600 ordered partions for {1,2,3,4}:
{{{1},{2,3},{4,5,6},{7,8,9,10}}
{{1},{2,3},{4,5,7},{6,8,9,10}}
{{1},{2,3},{4,5,8},{6,7,9,10}}
{{1},{2,3},{4,5,9},{6,7,8,10}}
{{1},{2,3},{4,5,10},{6,7,8,9}}
...
{{9},{7,10},{5,6,8},{1,2,3,4}}
{{10},{7,9},{5,6,8},{1,2,3,4}}
{{8},{9,10},{5,6,7},{1,2,3,4}}
{{9},{8,10},{5,6,7},{1,2,3,4}}
{{10},{8,9},{5,6,7},{1,2,3,4}}}
There is 1 ordered partion for {}:
{{}}
There is 1 ordered partion for {0,0,0}:
{{{}, {}, {}}}
{{{},{},{}}}
</pre>
 
=={{header|PicoLisp}}==
Uses the 'comb' function from [[Combinations#PicoLisp]]
<langsyntaxhighlight PicoLisplang="picolisp">(de partitions (Args)
(let Lst (range 1 (apply + Args))
(recur (Args Lst)
Line 1,659 ⟶ 2,167:
'((R) (cons L R))
(recurse (cdr Args) (diff Lst L)) ) )
(comb (car Args) Lst) ) ) ) ) )</langsyntaxhighlight>
Output:
<pre>: (more (partitions (2 0 2)))
Line 1,680 ⟶ 2,188:
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">from itertools import combinations
 
def partitions(*args):
Line 1,694 ⟶ 2,202:
return p(s, *args)
 
print partitions(2, 0, 2)</langsyntaxhighlight>
 
An equivalent but terser solution.
<langsyntaxhighlight lang="python">from itertools import combinations as comb
 
def partitions(*args):
Line 1,706 ⟶ 2,214:
return p(range(1, sum(args) + 1), *args)
 
print partitions(2, 0, 2)</langsyntaxhighlight>
 
Output:
Line 1,713 ⟶ 2,221:
[[(0, 1), (), (2, 3)], [(0, 2), (), (1, 3)], [(0, 3), (), (1, 2)], [(1, 2), (), (0, 3)], [(1, 3), (), (0, 2)], [(2, 3), (), (0, 1)]]
</pre>
 
 
Or, more directly, without importing the ''combinations'' library:
{{Works with|Python|3.7}}
<syntaxhighlight lang="python">'''Ordered Partitions'''
 
 
# partitions :: [Int] -> [[[Int]]]
def partitions(xs):
'''Ordered partitions of xs.'''
n = sum(xs)
 
def go(s, n, ys):
return [
[l] + r
for (l, rest) in choose(s)(n)(ys[0])
for r in go(rest, n - ys[0], ys[1:])
] if ys else [[]]
return go(enumFromTo(1)(n), n, xs)
 
 
# choose :: [Int] -> Int -> Int -> [([Int], [Int])]
def choose(xs):
'''(m items chosen from n items, the rest)'''
def go(xs, n, m):
f = cons(xs[0])
choice = choose(xs[1:])(n - 1)
return [([], xs)] if 0 == m else (
[(xs, [])] if n == m else (
[first(f)(x) for x in choice(m - 1)] +
[second(f)(x) for x in choice(m)]
)
)
return lambda n: lambda m: go(xs, n, m)
 
 
# TEST ----------------------------------------------------
# main :: IO ()
def main():
'''Tests of the partitions function'''
 
f = partitions
print(
fTable(main.__doc__ + ':')(
lambda x: '\n' + f.__name__ + '(' + repr(x) + ')'
)(
lambda ps: '\n\n' + '\n'.join(
' ' + repr(p) for p in ps
)
)(f)([
[2, 0, 2],
[1, 1, 1]
])
)
 
 
# DISPLAY -------------------------------------------------
 
# fTable :: String -> (a -> String) ->
# (b -> String) -> (a -> b) -> [a] -> String
def fTable(s):
'''Heading -> x display function -> fx display function ->
f -> xs -> tabular string.
'''
def go(xShow, fxShow, f, xs):
ys = [xShow(x) for x in xs]
w = max(map(len, ys))
return s + '\n' + '\n'.join(map(
lambda x, y: y.rjust(w, ' ') + ' -> ' + fxShow(f(x)),
xs, ys
))
return lambda xShow: lambda fxShow: lambda f: lambda xs: go(
xShow, fxShow, f, xs
)
 
 
# GENERIC -------------------------------------------------
 
# cons :: a -> [a] -> [a]
def cons(x):
'''Construction of a list from x as head,
and xs as tail.
'''
return lambda xs: [x] + xs
 
 
# enumFromTo :: (Int, Int) -> [Int]
def enumFromTo(m):
'''Integer enumeration from m to n.'''
return lambda n: list(range(m, 1 + n))
 
 
# first :: (a -> b) -> ((a, c) -> (b, c))
def first(f):
'''A simple function lifted to a function over a tuple,
with f applied only the first of two values.
'''
return lambda xy: (f(xy[0]), xy[1])
 
 
# second :: (a -> b) -> ((c, a) -> (c, b))
def second(f):
'''A simple function lifted to a function over a tuple,
with f applied only the second of two values.
'''
return lambda xy: (xy[0], f(xy[1]))
 
 
# MAIN ---
if __name__ == '__main__':
main()</syntaxhighlight>
{{Out}}
<pre>Tests of the partitions function:
 
partitions([2, 0, 2]) ->
 
[[1, 2], [], [3, 4]]
[[1, 3], [], [2, 4]]
[[1, 4], [], [2, 3]]
[[2, 3], [], [1, 4]]
[[2, 4], [], [1, 3]]
[[3, 4], [], [1, 2]]
 
partitions([1, 1, 1]) ->
 
[[1], [2], [3]]
[[1], [3], [2]]
[[2], [1], [3]]
[[2], [3], [1]]
[[3], [1], [2]]
[[3], [2], [1]]</pre>
 
=={{header|Racket}}==
Line 1,718 ⟶ 2,357:
{{trans|Haskell}}
 
<syntaxhighlight lang="racket">
<lang Racket>
#lang racket
(define (comb k xs)
Line 1,742 ⟶ 2,381:
(run 2 0 2)
(run 1 1 1)
</syntaxhighlight>
</lang>
 
Output:
Line 1,762 ⟶ 2,401:
((3) (2) (1))
</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2018.04.1}}
<syntaxhighlight lang="raku" line>sub partition(@mask is copy) {
my @op;
my $last = [+] @mask or return [] xx 1;
for @mask.kv -> $k, $v {
next unless $v;
temp @mask[$k] -= 1;
for partition @mask -> @p {
@p[$k].push: $last;
@op.push: @p;
}
}
return @op;
}
 
.say for reverse partition [2,0,2];</syntaxhighlight>
{{out}}
<pre>[[1, 2], (Any), [3, 4]]
[[1, 3], (Any), [2, 4]]
[[2, 3], (Any), [1, 4]]
[[1, 4], (Any), [2, 3]]
[[2, 4], (Any), [1, 3]]
[[3, 4], (Any), [1, 2]]</pre>
 
=={{header|REXX}}==
<langsyntaxhighlight lang="rexx">//*REXX program displays the ordered partitions as: orderedPartitions(i, j, k, ···). */
call orderedPartitions 2,0,2 /*Note: 2,,2 will also work. */
call orderedPartitions 1,1,1
call orderedPartitions 1,2,0,1 /*Note: 1,2,,1 will also work. */
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
orderedPartitions: procedure; #=arg(); hdr=; bot.=; top.=; low=; high=; d=123456789
t=0 /*T: is the sum of all the arguments.*/
do i=1 for #; t=t + arg(i) /*sum all the highest numbers in parts.*/
end /*i*/ /* [↑] may have an omitted argument. */
hdr= ' partitions for: ' /*define [↓]the process eachstart of the argumentsheader text. */
do j=1 for #; _= arg(j) /* _: is the Jth argument. */
len.j=max(1, _) /*LEN: length of args, 0=special. «0 is special»*/
bot.j=left(d, _); if _==0 then bot.j=0 /*define the bottom number. for range.*/
top.j=right(left(d,t),_); if _==0 then top.j=0 /* " " top " " " */
@.j=left(d, t); if _==0 then @.j=0 /*define the digits used for VERIFY. */
hdr=hdr _ /*build (by appending) display header.*/
low=low || bot.j; high=high || top.j /*the low and high numbers for DO below*/
end /*j*/
/* [↓] same as: okD=left('0'd, t+1) */
 
/*define the legal digits to be used. */
okD=left(0 || d, t + 1) /*define the legal digits to be used. */
say; center(' partitions for: ' hdr=center(hdr" ", 60, ''); say hdr /*display centered title for the output*/
say /*show a blank line (as a separator). */
say
do g=low to high /* [↑] generate the ordered partitions*/
if verify(g, okD) \==0 then iterate /*filter out unwanted decimal digits. partitions (digs)*/
p=1 /*P: is the position of a decimal dig.*/
$= /*$: will be the transformed numbers. */
Line 1,794 ⟶ 2,460:
if verify(_, @.k) \==0 then iterate g /*is the decimal digit not valid ? */
!= /* [↓] validate the decimal number. */
if @.k\==0 then do j=1 for length(_); z=substr(_, j, 1) /*get a dig.*/
if pos(z, $)\==0 then iterate g /*previous. ?*/
!=!','z /*add comma.*/
if j==1 then iterate then iterate /*is firstt?*/
if z<=substr(_, j-1, 1) then iterate g /*ordered. ?*/
if pos(z, _, 1 +pos(z, _))\==0 then iterate g /*duplicate.?*/
end /*j*/
p=p + len.k /*point to the next decimal number. digit (num)*/
$=$ ' {'strip( translate(!, ,0), ,",")'}' /*dress number up by suppessing LZ ··· */
end /*k*/
say leftcenter(''$, 18length(hdr) $ ) /*display numbers in ordered partition.*/
end /*g*/
return</syntaxhighlight>
say
return</lang>
{{out|output|text=&nbsp; when using the default inputs:}}
<pre>
══════════════════ partitions for: 2 0 2 ══════════════════
───────────────── partitions for: 2 0 2 ──────────────────
 
{1,2} {} {3,4}
{1,3} {} {2,4}
{1,4} {} {2,3}
{2,3} {} {1,4}
{2,4} {} {1,3}
{3,4} {} {1,2}
 
══════════════════ partitions for: 1 1 1 ══════════════════
───────────────── partitions for: 1 1 1 ──────────────────
 
{1} {2} {3}
{1} {3} {2}
{2} {1} {3}
{2} {3} {1}
{3} {1} {2}
{3} {2} {1}
 
────────────────═════════════════ partitions for: 1 2 0 1 ─────────────────═════════════════
 
{1} {2,3} {} {4}
{1} {2,4} {} {3}
{1} {3,4} {} {2}
{2} {1,3} {} {4}
{2} {1,4} {} {3}
{2} {3,4} {} {1}
{3} {1,2} {} {4}
{3} {1,4} {} {2}
{3} {2,4} {} {1}
{4} {1,2} {} {3}
{4} {1,3} {} {2}
{4} {2,3} {} {1}
</pre>
 
=={{header|Ruby}}==
'''Brute force approach:''' simple but very slow
<langsyntaxhighlight lang="ruby">def partition(mask)
return [[]] if mask.empty?
[*1..mask.inject(:+)].permutation.map {|perm|
mask.map {|num_elts| perm.shift(num_elts).sort }
}.uniq
end</langsyntaxhighlight>
 
'''Recursive version:''' faster
{{trans|Python}}
<langsyntaxhighlight lang="ruby">def part(s, args)
return [[]] if args.empty?
s.combination(args[0]).each_with_object([]) do |c, res|
Line 1,864 ⟶ 2,529:
return [[]] if args.empty?
part((1..args.inject(:+)).to_a, args)
end</langsyntaxhighlight>
 
'''Test:'''
<langsyntaxhighlight lang="ruby">[[],[0,0,0],[1,1,1],[2,0,2]].each do |test_case|
puts "partitions #{test_case}:"
partition(test_case).each{|part| p part }
puts
end</langsyntaxhighlight>
{{Output}}
<pre>
Line 1,895 ⟶ 2,560:
[[2, 4], [], [1, 3]]
[[3, 4], [], [1, 2]]
</pre>
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">
use itertools::Itertools;
 
type NArray = Vec<Vec<Vec<usize>>>;
 
fn generate_partitions(args: &[usize]) -> NArray {
// calculate the sum of all partitions
let max = args.iter().sum();
 
// generate combinations with the given lengths
// for each partition
let c = args.iter().fold(vec![], |mut acc, arg| {
acc.push((1..=max).combinations(*arg).collect::<Vec<_>>());
acc
});
 
// create a cartesian product of all individual combinations
// filter/keep only where all the elements are there and exactly once
c.iter()
.map(|i| i.iter().cloned())
.multi_cartesian_product()
.unique()
.filter(|x| x.iter().cloned().flatten().unique().count() == max)
.collect::<Vec<_>>()
}
 
#[allow(clippy::clippy::ptr_arg)]
fn print_partitions(result: &NArray) {
println!("Partitions:");
for partition in result {
println!("{:?}", partition);
}
}
fn main() {
print_partitions(generate_partitions(&[2, 0, 2]).as_ref());
print_partitions(generate_partitions(&[1, 1, 1]).as_ref());
print_partitions(generate_partitions(&[2, 3]).as_ref());
print_partitions(generate_partitions(&[0]).as_ref());
}
</syntaxhighlight>
{{out}}
<pre>
Partitions:
[[1, 2], [], [3, 4]]
[[1, 3], [], [2, 4]]
[[1, 4], [], [2, 3]]
[[2, 3], [], [1, 4]]
[[2, 4], [], [1, 3]]
[[3, 4], [], [1, 2]]
Partitions:
[[1], [2], [3]]
[[1], [3], [2]]
[[2], [1], [3]]
[[2], [3], [1]]
[[3], [1], [2]]
[[3], [2], [1]]
Partitions:
[[1, 2], [3, 4, 5]]
[[1, 3], [2, 4, 5]]
[[1, 4], [2, 3, 5]]
[[1, 5], [2, 3, 4]]
[[2, 3], [1, 4, 5]]
[[2, 4], [1, 3, 5]]
[[2, 5], [1, 3, 4]]
[[3, 4], [1, 2, 5]]
[[3, 5], [1, 2, 4]]
[[4, 5], [1, 2, 3]]
Partitions:
[[]]
</pre>
 
=={{header|Sidef}}==
{{trans|Ruby}}
<langsyntaxhighlight lang="ruby">func part(_, {.is_empty}) { [[]] }
func partitions({.is_empty}) { [[]] }
 
Line 1,905 ⟶ 2,642:
gather {
s.combinations(args[0], { |*c|
part(s - c, args.ftslice(1)).each{|r| take([c] + r) }
})
}
Line 1,918 ⟶ 2,655:
partitions(test_case).each{|part| say part }
print "\n"
}</langsyntaxhighlight>
 
{{out}}
Line 1,947 ⟶ 2,684:
=={{header|Tcl}}==
{{tcllib|struct::set}}
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
package require struct::set
 
Line 1,998 ⟶ 2,735:
 
return [buildPartitions $startingSet {*}$args]
}</langsyntaxhighlight>
Demonstration code:
<langsyntaxhighlight lang="tcl">puts [partitions 1 1 1]
puts [partitions 2 2]
puts [partitions 2 0 2]
puts [partitions 2 2 0]</langsyntaxhighlight>
Output:
<pre>
Line 2,013 ⟶ 2,750:
 
=={{header|Ursala}}==
<langsyntaxhighlight Ursalalang="ursala">#import std
#import nat
 
Line 2,020 ⟶ 2,757:
-+
~&art^?\~&alNCNC ^|JalSPfarSPMplrDSL/~& ^DrlPrrPlXXS/~&rt ^DrlrjXS/~&l choices@lrhPX,
^\~& nrange/1+ sum:-0+-</langsyntaxhighlight>
The library function <code>choices</code> used in this solution takes a pair <math>(s,k)</math> and returns the set of all subsets of <math>s</math> having cardinality <math>k</math>. The library function <code>nrange</code> takes a pair of natural numbers to the minimum consecutive sequence containing them. The <code>sum</code> function adds a pair of natural numbers.<langsyntaxhighlight Ursalalang="ursala">#cast %nLLL
 
test = opart <2,0,2></langsyntaxhighlight>
output:
<pre><
Line 2,032 ⟶ 2,769:
<<2,4>,<>,<1,3>>,
<<3,4>,<>,<1,2>>></pre>
 
=={{header|Wren}}==
{{trans|Go}}
<syntaxhighlight lang="wren">import "os" for Process
 
var genPart // recursive so predeclare
genPart = Fn.new { |n, res, pos|
if (pos == res.count) {
var x = List.filled(n.count, null)
for (i in 0...x.count) x[i] = []
var i = 0
for (c in res) {
x[c].add(i+1)
i = i + 1
}
System.print(x)
return
}
for (i in 0...n.count) {
if (n[i] != 0) {
n[i] = n[i] - 1
res[pos] = i
genPart.call(n, res, pos+1)
n[i] = n[i] + 1
}
}
}
 
var orderedPart = Fn.new { |nParts|
System.print("Ordered %(nParts)")
var sum = 0
for (c in nParts) sum = sum + c
genPart.call(nParts, List.filled(sum, 0), 0)
}
 
var args = Process.arguments
if (args.count == 0) {
orderedPart.call([2, 0, 2])
return
}
var n = List.filled(args.count, 0)
var i = 0
for (a in args) {
n[i] = Num.fromString(a)
if (n[i] < 0) {
System.print("negative partition size not meaningful")
return
}
i = i + 1
}
orderedPart.call(n)</syntaxhighlight>
 
{{out}}
<pre>
$ wren_cli ordered_partitions.wren
Ordered [2, 0, 2]
[[1, 2], [], [3, 4]]
[[1, 3], [], [2, 4]]
[[1, 4], [], [2, 3]]
[[2, 3], [], [1, 4]]
[[2, 4], [], [1, 3]]
[[3, 4], [], [1, 2]]
 
$ wren_cli ordered_partitions.wren 1 1 1
Ordered [1, 1, 1]
[[1], [2], [3]]
[[1], [3], [2]]
[[2], [1], [3]]
[[3], [1], [2]]
[[2], [3], [1]]
[[3], [2], [1]]
 
$ wren_cli ordered_partitions.wren 1 2 3 4 | head
Ordered [1, 2, 3, 4]
[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]
[[1], [2, 3], [4, 5, 7], [6, 8, 9, 10]]
[[1], [2, 3], [4, 5, 8], [6, 7, 9, 10]]
[[1], [2, 3], [4, 5, 9], [6, 7, 8, 10]]
[[1], [2, 3], [4, 5, 10], [6, 7, 8, 9]]
[[1], [2, 3], [4, 6, 7], [5, 8, 9, 10]]
[[1], [2, 3], [4, 6, 8], [5, 7, 9, 10]]
[[1], [2, 3], [4, 6, 9], [5, 7, 8, 10]]
[[1], [2, 3], [4, 6, 10], [5, 7, 8, 9]]
</pre>
 
=={{header|zkl}}==
{{trans|Python}}
<langsyntaxhighlight lang="zkl">fcn partitions(args){
args=vm.arglist;
s:=(1).pump(args.sum(0),List); // (1,2,3,...)
Line 2,047 ⟶ 2,868:
res
}(s,args)
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">args:=vm.arglist.apply("toInt"); // aka argv[1..]
if(not args) args=T(2,0,2);
partitions(args.xplode()).pump(Console.println,Void);
// or: foreach p in (partitions(1,1,1)){ println(p) }</langsyntaxhighlight>
{{out}}
<pre>
9,476

edits