/
ch-1.raku
62 lines (53 loc) · 1.41 KB
/
ch-1.raku
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
sub task1a ( @ns --> Numeric ) {
my $half = +@ns div 2;
my $odd = +@ns !%% 2;
my @left = @ns.head($half);
my $middle = @ns.skip($half)[0] if $odd;
my @right = @ns.skip($half + (1 if $odd));
return (@left »~« @right.reverse).sum + ($middle // 0);
}
sub task1b ( @ns --> Numeric ) {
my @r = @ns;
my @l = @r.splice(0, * div 2);
my $m = @r.splice(0, 1)[0] if @ns % 2;
die "Cannot happen" if +@l != +@r;
return (@l »~« @r.reverse).sum
+ ($m // 0);
}
sub task1c ( @ns --> Numeric ) {
return (@ns.head(@ns/2) »~« @ns.tail(@ns/2).reverse).sum
+ (@ns.skip(@ns/2)[0] if @ns % 2);
}
sub task1d ( @ns_in --> Numeric ) {
my @ns = @ns_in;
my $ret = 0;
$ret += @ns.shift ~ @ns.pop while @ns > 1;
$ret += @ns.shift if @ns;
return $ret;
}
sub task1e ( @ns --> Numeric ) {
my ($i, $j) = 0, @ns.end;
my $ret = 0;
$ret += @ns[$i++, $j--].join while $i < $j;
$ret += @ns[$i] if $i == $j;
return $ret;
}
my @subs =
:&task1a,
:&task1b,
:&task1c,
:&task1d,
:&task1e,
;
my @tests =
( 1286, ( 6, 12, 25, 1 ) ),
( 489, ( 10, 7, 31, 5, 2, 2 ) ),
( 112, ( 1, 2, 10 ) ),
( 0, [] ),
;
use Test; plan +@tests * @subs;
for @subs -> ( :key($sub_name), :value(&task1) ) {
for @tests -> ( $expected, @in ) {
is task1(@in), $expected, "$sub_name : $expected";
}
}