diff options
| author | Mistivia <i@mistivia.com> | 2024-12-22 20:51:21 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-12-22 20:51:21 +0800 |
| commit | 4ed0e540b455273e224661407d9a2eae75574e20 (patch) | |
| tree | f1a6049446cd8ecc922fb0d38915455739a0fa37 | |
| parent | 18c7e8c49e23b2579d8979e895eca410cf785658 (diff) | |
day 8 part 2
| -rw-r--r-- | 08/2.tcl | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/08/2.tcl b/08/2.tcl new file mode 100644 index 0000000..c52b397 --- /dev/null +++ b/08/2.tcl @@ -0,0 +1,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] |
