#!/usr/bin/env tclsh set mask0 0; set mask1 0 proc setmask {mask} { global mask0 mask1 set mask0 0; set mask1 0 set i 0 foreach bit [lreverse [split $mask {}]] { switch -- $bit { X {} 0 { set mask0 [expr {$mask0 | (2**$i)}] } 1 { set mask1 [expr {$mask1 | (2**$i)}] } } incr i } set mask0 [expr {0xfffffffff ^ $mask0}] } while {[gets stdin line] >= 0} { if {[scan $line {mem[%ld] = %ld} addr val] == 2} { set mem($addr) [expr {($val | $mask1) & $mask0}] # puts "mem($addr) = $mem($addr)" } elseif {[scan $line {mask = %s} mask] == 1} { setmask $mask # puts "[format {%x %x} $mask0 $mask1]" } } set sum 0 foreach {addr val} [array get mem] { incr sum $val } puts $sum