-- -- Perl Weekly Challenge 211 -- Task 2 -- -- See -- CREATE SCHEMA IF NOT EXISTS pwc211; -- see CREATE FUNCTION pwc211.permute(anyarray) RETURNS SETOF anyarray LANGUAGE SQL IMMUTABLE AS $f$ SELECT (WITH RECURSIVE r(n,p,a,b) AS (SELECT i, $1[1:0], $1, array_upper($1,1) UNION ALL SELECT n / b, p || a[n % b + 1], a[1:n % b] || a[n % b + 2:b], b-1 FROM r WHERE b > 0) SELECT p FROM r WHERE b=0) FROM generate_series(0,factorial( (array_upper($1,1)) )::integer-1) i; $f$; CREATE OR REPLACE FUNCTION pwc211.task2_plpgsql( a int[] ) RETURNS SETOF int[] AS $CODE$ DECLARE split_at int := 0; current_array int[]; l int[]; r int []; avg_l numeric; avg_r numeric; BEGIN split_at := array_length( a, 1 ) / 2; FOR current_array IN SELECT * FROM pwc211.permute( a ) LOOP l := current_array[ 1:split_at ]; r := current_array[ (split_at + 1): array_length( a, 1 ) ]; SELECT avg( v ) INTO avg_l FROM unnest( l ) v; SELECT avg( v ) INTO avg_r FROM unnest( r ) v; IF avg_r = avg_l THEN RETURN NEXT l; RETURN NEXT r; RETURN; END IF; END LOOP; RETURN; END $CODE$ LANGUAGE plpgsql;