aboutsummaryrefslogtreecommitdiff
path: root/09/1.tcl
diff options
context:
space:
mode:
Diffstat (limited to '09/1.tcl')
-rw-r--r--09/1.tcl55
1 files changed, 55 insertions, 0 deletions
diff --git a/09/1.tcl b/09/1.tcl
new file mode 100644
index 0000000..78ea2c3
--- /dev/null
+++ b/09/1.tcl
@@ -0,0 +1,55 @@
+set fp [open "input"]
+gets $fp line
+close $fp
+
+set line_len [string length $line]
+set layout {}
+set is_file 1
+set file_no 0
+for {set i 0} {$i < $line_len} {incr i} {
+ set num [string index $line $i]
+ if {$is_file} {
+ for {set j 0} {$j < $num} {incr j} {
+ lappend layout $file_no
+ }
+ incr file_no
+ } else {
+ for {set j 0} {$j < $num} {incr j} {
+ lappend layout -1
+ }
+ }
+ set is_file [expr {! $is_file}]
+}
+
+set lp 0
+set rp [expr {[llength $layout] - 1}]
+
+proc swap {lst a b} {
+ upvar $lst uplst
+ set t [lindex $uplst $b]
+ lset uplst $b [lindex $uplst $a]
+ lset uplst $a $t
+}
+
+while {$lp < $rp} {
+ if {[lindex $layout $lp] != -1} {
+ incr lp
+ continue
+ }
+ if {[lindex $layout $rp] == -1} {
+ incr rp -1
+ continue
+ }
+ swap layout $lp $rp
+}
+
+set checksum 0
+set i 0
+while {1} {
+ if {([lindex $layout $i] == -1) || ($i > [llength $layout])} {
+ break
+ }
+ incr checksum [expr {[lindex $layout $i] * $i}]
+ incr i
+}
+puts $checksum