day 15 use dicts
tcl's dict type is exactly what we need for this problem: an order-preserving de-duplicated list of key-value pairs.main
parent
94bf752568
commit
c592761d00
|
@ -44,33 +44,12 @@ proc place {boxp lens} {
|
||||||
set h [hash $label]
|
set h [hash $label]
|
||||||
set i 0
|
set i 0
|
||||||
set found 0
|
set found 0
|
||||||
if {![info exists box($h)]} { set box($h) {} }
|
dict set box($h) $label $num
|
||||||
foreach {l n} $box($h) {
|
|
||||||
if {$l eq $label} {
|
|
||||||
lset box($h) $i+1 $num
|
|
||||||
set found 1
|
|
||||||
break
|
|
||||||
}
|
|
||||||
incr i 2
|
|
||||||
}
|
|
||||||
if {!$found} {
|
|
||||||
lappend box($h) $label $num
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
set label [trim $lens "-"]
|
set label [trim $lens "-"]
|
||||||
set h [hash $label]
|
set h [hash $label]
|
||||||
#puts "$lens $label $h"
|
#puts "$lens $label $h"
|
||||||
if {[info exists box($h)]} {
|
dict unset box($h) $label
|
||||||
set i 0
|
|
||||||
foreach {l n} $box($h) {
|
|
||||||
if {$l eq $label} {
|
|
||||||
#puts "removing $i from $h"
|
|
||||||
set box($h) [lreplace $box($h) $i $i+1]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
incr i 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,7 +62,7 @@ proc solve input {
|
||||||
set t 0
|
set t 0
|
||||||
foreach {h elems} [array get box] {
|
foreach {h elems} [array get box] {
|
||||||
set slot 0
|
set slot 0
|
||||||
foreach {l n} $elems {
|
dict for {l n} $elems {
|
||||||
incr slot
|
incr slot
|
||||||
incr t [expr {($h+1) * $slot * $n}]
|
incr t [expr {($h+1) * $slot * $n}]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue