summaryrefslogtreecommitdiffstats
path: root/2024/tcl/06.tcl
diff options
context:
space:
mode:
authorAleteoryx <alyx@aleteoryx.me>2024-12-07 15:22:26 -0500
committerAleteoryx <alyx@aleteoryx.me>2024-12-07 15:22:26 -0500
commitf62e9e8045844195febe990ddc0f049d1bc45902 (patch)
treef9108604b6f4a94a67cd1868efab40fc2860ae73 /2024/tcl/06.tcl
parent92dd4115528a495a2acf3958de52d5511fc3108a (diff)
downloadadventofcode-f62e9e8045844195febe990ddc0f049d1bc45902.tar.gz
adventofcode-f62e9e8045844195febe990ddc0f049d1bc45902.tar.bz2
adventofcode-f62e9e8045844195febe990ddc0f049d1bc45902.zip
2024.6, finally
Diffstat (limited to '2024/tcl/06.tcl')
-rwxr-xr-x2024/tcl/06.tcl90
1 files changed, 90 insertions, 0 deletions
diff --git a/2024/tcl/06.tcl b/2024/tcl/06.tcl
new file mode 100755
index 0000000..fa48061
--- /dev/null
+++ b/2024/tcl/06.tcl
@@ -0,0 +1,90 @@
+#!/bin/env tclsh
+
+source lib.tcl
+setup 6
+
+puts {Part 1: Count unique guard coords}
+
+set map(grid) {}
+foreach line $input {
+ lappend map(grid) [split $line ""]
+}
+set map(h) [llength $map(grid)]
+set map(w) [llength [lindex $map(grid) 0]]
+set map(visits) {}
+set map(debug) $map(grid)
+set guard(y) [lsearch $map(grid) *^*]
+set guard(x) [lsearch [lindex $map(grid) $guard(y)] ^]
+set guard(dir) 0
+set placed_obstructions {}
+
+set rot_map {{-1 0} {0 1} {1 0} {0 -1}}
+
+proc step_guard {} {
+ global guard rot_map map
+ dict set map(visits) [list $guard(y) $guard(x)] $guard(dir) 1
+ lset map(debug) $guard(y) $guard(x) [lindex {^ > v <} $guard(dir)]
+
+ lassign [lindex $rot_map $guard(dir)] ydir xdir
+ set ynew [expr {$guard(y) + $ydir}]
+ set xnew [expr {$guard(x) + $xdir}]
+
+ if {$ynew < 0 || $ynew >= $map(h) || $xnew < 0 || $xnew >= $map(w)} { return 0 }
+
+ if {[lindex $map(grid) $ynew $xnew] == "#"} {
+ set guard(dir) [expr {($guard(dir) + 1) % 4}]
+ return 1
+ }
+
+ set guard(y) $ynew
+ set guard(x) $xnew
+ return 1
+}
+
+# sigh
+set potential_loops 0
+while {[step_guard]} {
+ puts -nonewline "Unique coords: [llength [dict keys $map(visits)]]\r"
+ flush stdout
+
+ lassign [lindex $rot_map $guard(dir)] ydir xdir
+ set ynew [expr {$guard(y) + $ydir}]
+ set xnew [expr {$guard(x) + $xdir}]
+ if {$ynew < 0 || $ynew >= $map(h) || $xnew < 0 || $xnew >= $map(w)} continue
+
+ # it took me. 2 hours. to realize i needed the clause after the ||. god dammit.
+ if {[dict exists $placed_obstructions [list $ynew $xnew]] || [dict exists $map(visits) [list $ynew $xnew]]} {
+ continue
+ }
+ if {[dict exists $map(visits) [list $guard(y) $guard(x)] [expr {($guard(dir) + 1) % 4}]]} {
+# foreach line $map(debug) {
+# puts [join $line ""]
+# }
+ dict incr placed_obstructions [list $ynew $xnew] 1
+ incr potential_loops
+ } elseif {[lindex $map(grid) $ynew $xnew] != "#"} {
+ set map_backup [array get map]
+ set guard_backup [array get guard]
+
+ lset map(grid) $ynew $xnew "#"
+ lset map(debug) $ynew $xnew "#"
+
+ while {[step_guard]} {
+ if {[dict exists $map(visits) [list $guard(y) $guard(x)] $guard(dir)]} {
+ dict incr placed_obstructions [list $ynew $xnew] 2
+ incr potential_loops
+ break
+ }
+ }
+
+ array set map $map_backup
+ array set guard $guard_backup
+ }
+}
+
+puts "Unique coords: [llength [dict keys $map(visits)]]"
+
+puts ""
+puts {Part 2: Number of potential looping obstructions}
+
+puts "Potential count: [llength [dict keys $placed_obstructions]]"