aboutsummaryrefslogtreecommitdiff
path: root/08/2.tcl
blob: c52b397411494359e93dd09d3b5aab4781086e75 (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
set fp [open "input"]
set lines {}
while {[gets $fp line] >= 0} {
    lappend lines $line
}

close $fp

set height [llength $lines]
set width [string length [lindex $lines 0]]

proc char_at {x y} {
    global lines
    return [string index [lindex $lines $y] $x]
}

proc in_range {x y} {
    global height width
    if {$x < 0 || $x >= $width} {
        return 0
    }
    if {$y < 0 || $y >= $height} {
        return 0
    }
    return 1
}

proc build_antenna_map {} {
    global height width
    set antenna_map {}
    for {set x 0} {$x < $width} {incr x} {
        for {set y 0} {$y < $height} {incr y} {
            set c [char_at $x $y]
            if {$c == "."} {
                continue
            }
            dict update antenna_map $c site_list {
                lappend site_list [list $x $y]
            }
        }
    }
    return $antenna_map
}

set antenna_map [build_antenna_map]
set antinodes {}

foreach k [dict keys $antenna_map] {
    set site_list [dict get $antenna_map $k]
    set len [llength $site_list]
    for {set i 0} {$i < $len} {incr i} {
        for {set j [expr {$i + 1}]} {$j < $len} {incr j} {
            set x1 [lindex [lindex $site_list $i] 0]
            set y1 [lindex [lindex $site_list $i] 1]
            set x2 [lindex [lindex $site_list $j] 0]
            set y2 [lindex [lindex $site_list $j] 1]
            set delta_x [expr {$x2 - $x1}]
            set delta_y [expr {$y2 - $y1}]
            while {[in_range $x2 $y2]} {
                dict set antinodes [list $x2 $y2] {}
                set x2 [expr {$x2 + $delta_x}]
                set y2 [expr {$y2 + $delta_y}]
            }
            while {[in_range $x1 $y1]} {
                dict set antinodes [list $x1 $y1] {}
                set x1 [expr {$x1 - $delta_x}]
                set y1 [expr {$y1 - $delta_y}]
            }            
        }
    }
}

puts [dict size $antinodes]