about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNguyễn Gia Phong <mcsinyx@disroot.org>2022-12-09 19:07:26 +0900
committerNguyễn Gia Phong <mcsinyx@disroot.org>2022-12-09 19:07:26 +0900
commitcde44cdda55d0a0139a8e6a98e1aa47831972395 (patch)
tree0cfc6ca45def36ff8ff0d4ec6b44167f5447a2b4
parentf8b0528d933f4b7ac64c8460ed765e8e41240d7d (diff)
downloadcp-cde44cdda55d.tar.gz
cp-cde44cdda55d.tar.zst
[aoc/2022] Finish day 9
-rwxr-xr-xaoc/2022/09/part-one.tcl25
-rwxr-xr-xaoc/2022/09/part-two.tcl30
2 files changed, 55 insertions, 0 deletions
diff --git a/aoc/2022/09/part-one.tcl b/aoc/2022/09/part-one.tcl
new file mode 100755
index 0000000..3e7716a
--- /dev/null
+++ b/aoc/2022/09/part-one.tcl
@@ -0,0 +1,25 @@
+#!/usr/bin/env tclsh
+proc vec x {list [expr {abs($x)}] [expr {($x>0)-($x<0)}]}
+set tx [set hx 0]
+set ty [set hy 0]
+while {1} {
+    set line [gets stdin]
+    if {[eof stdin] || $line == ""} then break
+    lassign [split $line] d n
+    for {set i 0} {$i < $n} {incr i} {
+        switch $d {
+            R {incr hx 1}
+            U {incr hy 1}
+            L {incr hx -1}
+            D {incr hy -1}
+        }
+        lassign [vec [expr {$hx-$tx}]] mx dx
+        lassign [vec [expr {$hy-$ty}]] my dy
+        if {$mx == 2 || $my == 2} {
+            incr tx $dx
+            incr ty $dy
+        }
+        set v($tx,$ty) 1
+    }
+}
+puts [array size v]
diff --git a/aoc/2022/09/part-two.tcl b/aoc/2022/09/part-two.tcl
new file mode 100755
index 0000000..e3d539f
--- /dev/null
+++ b/aoc/2022/09/part-two.tcl
@@ -0,0 +1,30 @@
+#!/usr/bin/env tclsh
+proc vec x {list [expr {abs($x)}] [expr {($x>0)-($x<0)}]}
+for {set i 0} {$i < 10} {incr i} {
+    set kx($i) 0
+    set ky($i) 0
+}
+while {1} {
+    set line [gets stdin]
+    if {[eof stdin] || $line == ""} then break
+    lassign [split $line] d n
+    for {set i 0} {$i < $n} {incr i} {
+        switch $d {
+            R {incr kx(0) 1}
+            U {incr ky(0) 1}
+            L {incr kx(0) -1}
+            D {incr ky(0) -1}
+        }
+        for {set j 1} {$j < 10} {incr j} {
+            set p [expr {$j-1}]
+            lassign [vec [expr {$kx($p)-$kx($j)}]] mx dx
+            lassign [vec [expr {$ky($p)-$ky($j)}]] my dy
+            if {$mx == 2 || $my == 2} {
+                incr kx($j) $dx
+                incr ky($j) $dy
+            }
+        }
+        set v($kx(9),$ky(9)) 1
+    }
+}
+puts [array size v]