#!/usr/local/bin/tclsh if {[llength $argv] ni {2 3}} { puts stderr "usage: 2019-7int programfile firstinput [secondinput]" exit 1 } set programfile [lindex $argv 0] set input [lrange $argv 1 end] set fd [open $programfile r] set list [split [string trimright [read $fd] \n] ,] close $fd proc normalize op { format %05d $op } set pc 0 while 1 { set op [normalize [lindex $list $pc]] set im1 [string index $op 2] set im2 [string index $op 1] # 3rd parameter is always position mode set i [expr {$pc + 1}] set j [expr {$pc + 2}] set k [expr {$pc + 3}] switch -glob -- $op { *01 { if {$im1} { set a [lindex $list $i] } else { set a [lindex $list [lindex $list $i]] } if {$im2} { set b [lindex $list $j] } else { set b [lindex $list [lindex $list $j]] } lset list [lindex $list $k] [expr {$a + $b}] incr pc 4 } *02 { if {$im1} { set a [lindex $list $i] } else { set a [lindex $list [lindex $list $i]] } if {$im2} { set b [lindex $list $j] } else { set b [lindex $list [lindex $list $j]] } lset list [lindex $list $k] [expr {$a * $b}] incr pc 4 } *03 { if {[llength $input] == 0} {gets stdin input} lset list [lindex $list $i] [lindex $input 0] set input [lrange $input 1 end] incr pc 2 } *04 { if {$im1} { puts [lindex $list $i] } else { puts [lindex $list [lindex $list $i]] } incr pc 2 } *05 { if {$im1} { set a [lindex $list $i] } else { set a [lindex $list [lindex $list $i]] } if {$im2} { set b [lindex $list $j] } else { set b [lindex $list [lindex $list $j]] } if {$a != 0} { set pc $b } else { incr pc 3 } } *06 { if {$im1} { set a [lindex $list $i] } else { set a [lindex $list [lindex $list $i]] } if {$im2} { set b [lindex $list $j] } else { set b [lindex $list [lindex $list $j]] } if {$a == 0} { set pc $b } else { incr pc 3 } } *07 { if {$im1} { set a [lindex $list $i] } else { set a [lindex $list [lindex $list $i]] } if {$im2} { set b [lindex $list $j] } else { set b [lindex $list [lindex $list $j]] } lset list [lindex $list $k] [expr {$a < $b}] incr pc 4 } *08 { if {$im1} { set a [lindex $list $i] } else { set a [lindex $list [lindex $list $i]] } if {$im2} { set b [lindex $list $j] } else { set b [lindex $list [lindex $list $j]] } lset list [lindex $list $k] [expr {$a == $b}] incr pc 4 } *99 break } }