aboutsummaryrefslogtreecommitdiff
path: root/challenge-220/bruce-gray/perl/ch-2.pl
blob: 92f066bdbae465d93997709040edd328ac43b380 (plain)
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
use v5.36;
sub is_perfect_square ( $n ) {
    return $n == ( int(sqrt $n) ** 2 );
}

sub task2 ( @ns ) {

    my %square_pairs;
    for     my $x (@ns) {
        for my $y (@ns) {
            if ( is_perfect_square( $x + $y ) ) {
                $square_pairs{$x}{$y} = $y;
                $square_pairs{$y}{$x} = $x;
            }
        }
    }

    my ( $bag_add, $bag_del, $bag_keys, $bag_empty );
    {
        my %n_count;
        $bag_add   = sub ( $n ) { $n_count{$n}++; };
        $bag_del   = sub ( $n ) { $n_count{$n}--;  delete $n_count{$n} if not $n_count{$n}; };
        $bag_keys  = sub ()     { sort { $a <=> $b } keys %n_count };
        $bag_empty = sub ()     {                     not %n_count };
    }

    $bag_add->($_) for @ns;

    my $recursing = sub ( $head ) {
        return [$head] if $bag_empty->();

        my @ret;
        for my $c ( grep {defined} @{$square_pairs{$head}}{ $bag_keys->() } ) {
            $bag_del->($c);
            push @ret, map { [$head, @{$_} ] } __SUB__->( $c );
            $bag_add->($c);
        }
        return @ret;
    };

    my @ret;
    for my $head ( $bag_keys->() ) {
        $bag_del->($head);
        push @ret, $recursing->( $head );
        $bag_add->($head);
    }

    return \@ret;
}


my @tests = (
    [ [1, 17, 8] , [ [1, 8, 17], [17, 8, 1] ] ],
    [ [2,  2, 2] , [ [2, 2,  2],            ] ],

    [ [ 1..14 ] , [  ] ],
    [ [ 1..15 ] , [ [8, 1, 15, 10, 6, 3, 13, 12, 4, 5, 11, 14, 2, 7, 9],
                        [9, 7, 2, 14, 11, 5, 4, 12, 13, 3, 6, 10, 15, 1, 8] ] ],
    [ [ 1..16 ] , [ [8, 1, 15, 10, 6, 3, 13, 12, 4, 5, 11, 14, 2, 7, 9, 16],
                        [16, 9, 7, 2, 14, 11, 5, 4, 12, 13, 3, 6, 10, 15, 1, 8] ] ],
    [ [ 1..17 ] , [ [16, 9, 7, 2, 14, 11, 5, 4, 12, 13, 3, 6, 10, 15, 1, 8, 17],
                        [17, 8, 1, 15, 10, 6, 3, 13, 12, 4, 5, 11, 14, 2, 7, 9, 16] ] ],
    [ [ 1..18 ] , [  ] ],
    [ [ 1..19 ] , [  ] ],
    [ [ 1..20 ] , [  ] ],
    [ [ 1..21 ] , [  ] ],
    [ [ 1..22 ] , [  ] ],
    [ [ 1..23 ] , [
        [2, 23, 13, 12, 4, 21, 15, 10, 6, 19, 17, 8, 1, 3, 22, 14, 11, 5, 20, 16, 9, 7, 18],
        [9, 16, 20, 5, 11, 14, 22, 3, 1, 8, 17, 19, 6, 10, 15, 21, 4, 12, 13, 23, 2, 7, 18],
        [18, 7, 2, 23, 13, 12, 4, 21, 15, 10, 6, 19, 17, 8, 1, 3, 22, 14, 11, 5, 20, 16, 9],
        [18, 7, 9, 16, 20, 5, 11, 14, 2, 23, 13, 12, 4, 21, 15, 10, 6, 19, 17, 8, 1, 3, 22],
        [18, 7, 9, 16, 20, 5, 11, 14, 22, 3, 1, 8, 17, 19, 6, 10, 15, 21, 4, 12, 13, 23, 2],
        [22, 3, 1, 8, 17, 19, 6, 10, 15, 21, 4, 12, 13, 23, 2, 14, 11, 5, 20, 16, 9, 7, 18], ] ],
    [ [ 1..24 ] , [  ] ],
    [ [ 1..25 ] , [
        [2, 23, 13, 12, 24, 25, 11, 14, 22, 3, 1, 8, 17, 19, 6, 10, 15, 21, 4, 5, 20, 16, 9, 7, 18],
        [3, 22, 14, 2, 23, 13, 12, 4, 21, 15, 10, 6, 19, 17, 8, 1, 24, 25, 11, 5, 20, 16, 9, 7, 18],
        [4, 21, 15, 10, 6, 19, 17, 8, 1, 3, 22, 14, 2, 23, 13, 12, 24, 25, 11, 5, 20, 16, 9, 7, 18],
        [8, 17, 19, 6, 10, 15, 21, 4, 12, 13, 23, 2, 14, 22, 3, 1, 24, 25, 11, 5, 20, 16, 9, 7, 18],
        [9, 16, 20, 5, 4, 21, 15, 10, 6, 19, 17, 8, 1, 3, 22, 14, 11, 25, 24, 12, 13, 23, 2, 7, 18],
        [10, 15, 21, 4, 12, 13, 23, 2, 14, 22, 3, 6, 19, 17, 8, 1, 24, 25, 11, 5, 20, 16, 9, 7, 18],
        [11, 25, 24, 12, 13, 23, 2, 14, 22, 3, 1, 8, 17, 19, 6, 10, 15, 21, 4, 5, 20, 16, 9, 7, 18],
        [13, 23, 2, 14, 22, 3, 1, 8, 17, 19, 6, 10, 15, 21, 4, 12, 24, 25, 11, 5, 20, 16, 9, 7, 18],
        [18, 7, 2, 23, 13, 12, 24, 25, 11, 14, 22, 3, 1, 8, 17, 19, 6, 10, 15, 21, 4, 5, 20, 16, 9],
        [18, 7, 9, 16, 20, 5, 4, 21, 15, 10, 6, 19, 17, 8, 1, 3, 22, 14, 2,