diff options
| author | Mistivia <i@mistivia.com> | 2024-12-22 21:10:51 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-12-22 21:10:51 +0800 |
| commit | f73acfecac8016f282c02c4ec859b3244d0a6265 (patch) | |
| tree | 9f7b57b8a6dc6a2932d1058872466b4d3f5a3fac /09/1.tcl | |
| parent | 4ed0e540b455273e224661407d9a2eae75574e20 (diff) | |
day 9 part 1
Diffstat (limited to '09/1.tcl')
| -rw-r--r-- | 09/1.tcl | 55 |
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 |
