-
Notifications
You must be signed in to change notification settings - Fork 321
/
ch-2.pl
executable file
·75 lines (52 loc) · 1.59 KB
/
ch-2.pl
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
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/perl -s
use v5.16;
use Test2::V0;
use experimental 'signatures';
our ($tests, $examples, $trim);
run_tests() if $tests || $examples; # does not return
$trim //= -1;
die <<EOS unless @ARGV;
usage: $0 [-examples] [-tests] [-trim=LIM] [--] [N1 N2...]
-examples
run the examples from the challenge
-tests
run some tests
-trim=LIM
use LIM as trim limit. Default: -1
N1 N2...
List to be trimmed
EOS
sub trim_low :prototype($\@);
### Input and Output
trim_low($trim, @ARGV);
say "@ARGV";
### Implementation
# The simplistic statement "grep $_ > $i, @n;" cannot be the solution to
# a PWC task. There must be something beyond that. I presume the given
# array has to be modified.
sub trim_low :prototype($\@) ($low, $arr) {
# Moving backwards over the array simplifies things as removing an
# element does not change the indices of not yet processed items.
for (my $i = $#$arr; $i >= 0; $i--) {
splice @$arr, $i, 1 if $arr->[$i] <= $low;
}
# Returning a ref to the modified array.
$arr;
}
### Examples and tests
sub run_tests {
SKIP: {
skip "examples" unless $examples;
is &trim_low(3, [1, 4, 2, 3, 5]), [4, 5], 'example 1';
is &trim_low(4, [9, 0, 6, 2, 3, 8, 5]), [9, 6, 8, 5], 'example 2';
}
SKIP: {
skip "tests" unless $tests;
is do {&trim_low(3, my $arr = [1, 4, 2, 3, 5]); $arr},
[4, 5], 'example 1 - modified array';
is do {&trim_low(4, my $arr = [9, 0, 6, 2, 3, 8, 5]); $arr},
[9, 6, 8, 5], 'example 2 - modified array';
}
done_testing;
exit;
}