aboutsummaryrefslogtreecommitdiff
path: root/challenge-148/abigail/tcl/ch-2.tcl
blob: f398cdbbd1c1c53cb744020f935fd7b652445d3a (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
#!/usr/local/opt/tcl-tk/bin/tclsh

#
# See https://theweeklychallenge.org/blog/perl-weekly-challenge-148
#

#
# Run as: tclsh ch-2.tcl
#

set COUNT 5
set A     0
set B     1
set C     2
set SUM   3
set out   {}
for {set i 0} {$i < $COUNT} {incr i} {
    lset out $i $A             999999
    lset out $i $B             999999
    lset out $i $C             999999
    lset out $i $SUM [expr 3 * 999999]
}

set max_index 0

for {set k 0} {$k < [lindex $out $max_index $SUM]} {incr k} {
    set a  [expr 3 * $k + 2]
    set f1 [expr     $k + 1]
    set f2 [expr 8 * $k + 5]

    set d1 {}
    for {set i 1} {$i * $i <= $f1} {incr i} {
        if {$f1 % $i == 0} {
            lappend d1 $i
            if {$i != $f1 / $i} {
                lappend d1 [expr $f1 / $i]
            }
        }
    }

    set d2 {}
    for {set i 1} {$i * $i <= $f2} {incr i} {
        if {$f2 % $i == 0} {
            set s1 [expr isqrt ($i)]
            set s2 [expr isqrt ($f2 / $i)]
            if {$s1 * $s1 == $i} {
                lappend d2 $s1
            }
            if {$s2 * $s2 == $f2 / $i && $s1 != $s2} {
                lappend d2 $s2
            }
        }
    }

    foreach d1v $d1 {
        foreach d2v $d2 {
            set b [expr $d1v * $d2v]
            set c [expr $f1 * $f1 * $f2 / ($b * $b)]
            if {$a + $b + $c < [lindex $out $max_index $SUM]} {
                set seen 0
                for {set i 0} {$i < $COUNT} {incr i} {
                    if {[lindex $out $i $A] == $a && \
                        [lindex $out $i $B] == $b} {
                        set seen 1
                    }
                }
                if {$seen > 0} {
                    break
                }

                lset out $max_index $A $a
                lset out $max_index $B $b
                lset out $max_index $C $c
                lset out $max_index $SUM [expr $a + $b + $c]

                set max_index 0
                set max_sum [lindex $out $max_index $SUM]
                for {set i 1} {$i < $COUNT} {incr i} {
                    if {$max_sum < [lindex $out $i $SUM]} {
                        set max_sum [lindex $out $i $SUM]
                        set max_index $i
                    }
                }
            }
        }
    }
}

foreach row $out {
    puts -nonewline [lindex $row $A]
    puts -nonewline " "
    puts -nonewline [lindex $row $B]
    puts -nonewline " "
    puts            [lindex $row $C]
}