12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- 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]
|