#!/usr/local/bin/wish
label .label -text "digits:"
entry .digits -textvariable n -width 3
label .ave -text "average:"
entry .average -textvariable "avg" -width 5
set n 6
set avg 0
set tally 0
set game 0
grid .label -row 0 -column 0 
grid .digits -row 0 -column 2
grid .ave -row 0 -column 3
grid .average -row 0 -column 5

button .reset -text "reset" -command "Reset"
grid .reset -row 1 -column 0 -columnspan 3

set guess ""
button .guess -text "guess:" -command "Check"
grid .guess -row 2 -column 0 -columnspan 3
entry .entry -textvariable guess -width 10
grid .entry -row 2 -column 3

set move 0

bind . <Return> "Check"
bind . <space> "Reset"

set answer ""
for {set i 1} {$i <= $n} {incr i} {
append answer "[expr int([expr rand()*2])]"
}

proc Reset {} {
global move guess answer n
for {set i 1} {$i <= $move} {incr i} {
destroy .l$i
}
if {[winfo exists .answer]} {
destroy .answer
}
set move 0
set guess ""
set answer ""
for {set i 1} {$i <= $n} {incr i} {
append answer "[expr int([expr rand()*2])]"
}
}

proc Check {} {
global n move guess answer tally game avg
incr move
set w 0
for {set i 0} {$i < $n} {incr i} {
if {[string index $guess $i] == [string index $answer $i]} {incr w}
}
set b [expr [Min [Weight $guess] [Weight $answer]] + \
[Min [expr $n - [Weight $guess]] [expr $n- [Weight $answer]]] - $w]
if {$w == $n} {
label .answer -text "$answer"
grid .answer -row 1 -column 3
set game [expr $game + 1]
set tally [expr $tally + $move]
set avg [expr 1.0*$tally/$game]
} else {
label .l$move -text "$guess $w $b"
grid .l$move -row [expr $move + 2] -column 0 -columnspan 12
set guess ""
}
}

proc Min {x y} {
if {$x < $y} {
set r $x
} else {
set r $y
}
return $r
}

proc Weight {la} {
set r 0
for {set i 0} {$i < [string length $la]} {incr i} {
if {[string index $la $i] == 1} {incr r}
}
return $r
}
