package require Tk ::safe::interpCreate slave set types { { {Tcl Scripts} .tcl } { {All Files} * }} set fname [tk_getOpenFile \ -defaultextension .tcl \ -filetypes $types] if { [string equal {} $fname] } exit set f [open $fname r] set ftext [read $f] close $f slave eval $ftext set results [slave eval { proc permute { list } { set retval [list] if { [llength $list] == 0 } { return [list [list]] } for { set i 0 } { $i < [llength $list] } { incr i } { set e [lindex $list $i] foreach p [permute [lreplace $list $i $i]] { lappend p $e lappend retval $p } } return $retval } set f 0 set s 0 set cases {} foreach p [permute { {a a} {b b} {c c} {d d} {e e} }] { lappend cases $p set have($p) {} set r [sort5 $p] if { [string compare {{a a} {b b} {c c} {d d} {e e}} $r] } { incr f } else { incr s } } for { set i 0 } { $i < 32 } { incr i } { set trial {} set result {} set list0 {} set list1 {} set data [list [expr int(1000000*rand())] [expr int(1000000*rand())] [expr int(1000000*rand())] [expr int(1000000*rand())] [expr int(1000000*rand())]] set j 1 foreach value $data { set key [expr { ( $i & $j ) != 0 }] set pair [list $key $value] lappend trial $pair lappend list$key $pair incr j $j } set result $list0 foreach x $list1 { lappend result $x } lappend cases $trial set r [sort5 $trial] if { [string compare $r $result] } { incr f } else { incr s } } return [list $f $s [llength $cases] [time { foreach c $cases { set r [sort5 $c] } } 1000]] }] foreach {fail success cases time} $results {} grid [label .l0 -text "File: $fname"] grid [label .l1 -text "Failures: $fail / $cases"] grid [label .l2 -text "Successes: $success / $cases"] grid [label .l3 -text "Time: $time"]
Tcl2002 programming contest: problem 1The Great Canadian Tcl/Tk Programming Contest, eh?