/
ch-2.pl
executable file
·79 lines (63 loc) · 1.9 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
76
77
78
79
#!/usr/bin/env perl
#
# The Weekly Challenge - Perl & Raku
# (https://theweeklychallenge.org)
#
# Challenge 220 Task 2: Squareful
#
# Perl solution by Matthias Muth.
#
use strict;
use warnings;
use feature 'say';
use lib '.';
use TestExtractor;
use List::Util qw( sum min max );
sub is_perfect_square {
my $sqrt = sqrt( $_[0] );
return int( $sqrt ) == $sqrt;
}
$| = 1;
my $indent = "";
sub squareful {
my ( @ints ) = @_;
vsay $indent, "squareful( @ints )";
$indent .= " ";
if ( @ints == 1 ) {
vsay $indent, "returning ( [ @ints ] )";
substr $indent, -4, 4, "";
return [ @ints ];
}
my %unique_ints = map { $_ => 1 } @ints;
my @unique_ints = sort { $a <=> $b } keys %unique_ints;
vsay $indent, "unique ints: ", pp @unique_ints;
my %first_positions;
$first_positions{ $ints[$_] } //= $_
for 0..$#ints;
vsay $indent, "first_positions: ", pp \%first_positions;
my @results;
for my $int ( @unique_ints ) {
vsay $indent, "trying to start with $int";
my @remaining_ints = @ints;
splice @remaining_ints, $first_positions{$int}, 1, ();
vsay $indent, "remaining_ints: ( @remaining_ints )";
my @squareful_subsets = squareful( @remaining_ints );
vsay $indent, "squareful_subsets: ", pp( @squareful_subsets );
push @results,
map [ $int, @{$squareful_subsets[$_]} ],
grep {
my $perfect =
is_perfect_square( $int + $squareful_subsets[$_][0] );
vsay $indent, "$int + $squareful_subsets[$_][0] = ",
$int + $squareful_subsets[$_][0], " is",
$perfect ? " a" : " no", " perfect square";
$perfect
} 0..$#squareful_subsets;
vsay $indent, "\@results now: ", pp @results;
}
vsay $indent, "returning ", pp @results;
substr $indent, -4, 4, "";
return @results;
}
@ARGV = qw( -v );
run_tests;