day 15 solution
parent
5ad3c05219
commit
f638ffbff7
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,95 @@
|
||||||
|
#!/usr/bin/env tclsh
|
||||||
|
source ../prelude.tcl
|
||||||
|
|
||||||
|
proc slurp filename {
|
||||||
|
set fd [open $filename]
|
||||||
|
set data [read $fd]
|
||||||
|
close $fd
|
||||||
|
return $data
|
||||||
|
}
|
||||||
|
|
||||||
|
set sample "rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7"
|
||||||
|
set input [trim [slurp ./input]]
|
||||||
|
|
||||||
|
proc ord c {
|
||||||
|
return [scan $c "%c"]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc hash s {
|
||||||
|
set h 0
|
||||||
|
foreach c [split $s ""] {
|
||||||
|
set h [expr {(($h + [ord $c]) * 17) % 256}]
|
||||||
|
}
|
||||||
|
return $h
|
||||||
|
}
|
||||||
|
|
||||||
|
proc sum s {
|
||||||
|
set t 0
|
||||||
|
foreach part [split $s ","] {
|
||||||
|
incr t [hash $part]
|
||||||
|
}
|
||||||
|
return $t
|
||||||
|
}
|
||||||
|
|
||||||
|
puts [hash HASH]
|
||||||
|
puts [sum $sample]
|
||||||
|
puts [sum $input]
|
||||||
|
|
||||||
|
proc place {boxp lens} {
|
||||||
|
upvar $boxp box
|
||||||
|
set i [string first "=" $lens]
|
||||||
|
if {$i >= 0} {
|
||||||
|
set label [string range $lens 0 $i-1]
|
||||||
|
set num [string range $lens $i+1 end]
|
||||||
|
set h [hash $label]
|
||||||
|
set i 0
|
||||||
|
set found 0
|
||||||
|
if {![info exists box($h)]} { set box($h) {} }
|
||||||
|
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 {
|
||||||
|
set label [trim $lens "-"]
|
||||||
|
set h [hash $label]
|
||||||
|
#puts "$lens $label $h"
|
||||||
|
if {[info exists box($h)]} {
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc solve input {
|
||||||
|
set parts [split $input ","]
|
||||||
|
foreach part $parts {
|
||||||
|
place box $part
|
||||||
|
#puts [array get box]
|
||||||
|
}
|
||||||
|
set t 0
|
||||||
|
foreach {h elems} [array get box] {
|
||||||
|
set slot 0
|
||||||
|
foreach {l n} $elems {
|
||||||
|
incr slot
|
||||||
|
incr t [expr {($h+1) * $slot * $n}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
puts $t
|
||||||
|
}
|
||||||
|
|
||||||
|
solve $sample
|
||||||
|
solve $input
|
Loading…
Reference in New Issue