diff --git a/builtin.c b/builtin.c index 7cc2b958..7cb402a0 100644 --- a/builtin.c +++ b/builtin.c @@ -1486,7 +1486,17 @@ static const char* const jq_builtins[] = { "def first: .[0];", "def last: .[-1];", "def nth($n): .[$n];", - // # transpose a possibly jagged matrix, quickly; + "def combinations:" + " if length == 0 then [] else" + " .[0][] as $x" + " | (.[1:] | combinations) as $y" + " | [$x] + $y" + " end;", + "def combinations(n):" + " . as $dot" + " | [range(n) | $dot]" + " | combinations;", + // # transpose a possibly jagged matrix, quickly; // # rows are padded with nulls so the result is always rectangular. "def transpose:" " if . == [] then []" diff --git a/docs/content/3.manual/manual.yml b/docs/content/3.manual/manual.yml index 05e1733f..8d4800d0 100644 --- a/docs/content/3.manual/manual.yml +++ b/docs/content/3.manual/manual.yml @@ -1307,6 +1307,21 @@ sections: input: '["foobar", "barfoo"]' output: ['[false, true]'] + - title: "`combinations`, `combinations(n)`" + body: | + + Outputs all combinations of the elements of the arrays in the + input array. If given an argument `n`, it outputs all combinations + of `n` repetitions of the input array. + + examples: + - program: 'combinations' + input: '[[1,2], [3, 4]]' + output: ['[1, 3]', '[1, 4]', '[2, 3]', '[2, 4]'] + - program: 'combinations(2)' + input: '[0, 1]' + output: ['[0, 0]', '[0, 1]', '[1, 0]', '[1, 1]'] + - title: "`ltrimstr(str)`" body: |