From 85f44e291bf5c2f1676e5e0e041a60e1aa963411 Mon Sep 17 00:00:00 2001 From: CY Fung Date: Mon, 17 Apr 2023 07:45:44 +0800 Subject: Week 212 Task 2 --- challenge-212/cheok-yin-fung/perl/ch-2.pl | 49 +++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 challenge-212/cheok-yin-fung/perl/ch-2.pl diff --git a/challenge-212/cheok-yin-fung/perl/ch-2.pl b/challenge-212/cheok-yin-fung/perl/ch-2.pl new file mode 100644 index 0000000000..626d849f87 --- /dev/null +++ b/challenge-212/cheok-yin-fung/perl/ch-2.pl @@ -0,0 +1,49 @@ +# The Weekly Challenge 212 +# Task 2 Rearrange Groups +use v5.30.0; +use warnings; +use List::Util qw/min all/; +use List::MoreUtils qw/frequency/; +use Data::Printer; + +sub rg { + my @list = $_[0]->@*; + my $size = $_[1]; + my @result = (); + while (scalar @list != 0) { + my %freq = frequency @list; + my $m = min @list; + return -1 if !(all {defined($freq{$m+$_}) && $freq{$m+$_} >= $freq{$m}} 1..$size-1); + push @result, [ $m..$m+$size-1 ] for 1..$freq{$m}; + my $first_pop = $freq{$m}; + for my $k (0..$size-1) { + $freq{$m+$k} -= $first_pop; + } + @list = (); + for my $key (keys %freq) { + push @list, $key for 1..$freq{$key}; + } + } + return @result; +} + +my @r; +say "Example 1"; +@r = rg([1,2,3,5,1,2,7,6,3], 3); +p @r; +say "Example 2"; +@r = rg([1,2,3], 2); +p @r; +say "Example 3"; +@r = rg([1,2,4,3,5,3], 3); +p @r; +say "Example 4"; +@r = rg([1,5,2,6,4,7], 3); +p @r; +say "modified Example 4"; +@r = rg([1,5,2,6,4,7], 2); +p @r; +say "Test"; +@r = rg([1,2,2,3,3,4], 3); +p @r; + -- cgit