GWM Presents a number of cards - you select Yes or No to check if your imagined number is there. After 6 questions the number you thought of is displayed. A classic automatic magic trick often used in Christmas Crackers.
Unless you gave an incorrect answer, when the result is GiGo - Garbage In, Garbage Out. This variation allows a range of choice other than 0-64 or 0-128 etc. The technique is identical in every way (but looks cleverer) than simple binary splitting - 'is your number <50? (Yes - is number <25; no:is number <75) until you halve your way to the target.
package require Tk
# 'magic' interactive eneration of magic cards trick
global sum
proc addresult {nres onoff nmax} {
global sum
if {$onoff == 1} {
incr sum $nres
}
incr nres $nres
puts "Result $sum $nres"
makeCard $nmax $nres
}
proc showresult {nmax} {
global sum
catch {destroy .bguess} {} ;
catch {destroy .t} {} ;# delete it. Same as clear.
catch {destroy .byes} {} ;
catch {destroy .bno} {} ;
catch {destroy .end} {} ;
button .bguess -text "Your number was\n$sum" -command "givehelp $nmax" -font {Arial 32 bold}
pack .bguess
}
proc givehelp {nmax} {
global sum
catch {destroy .bguess} {} ;
catch {destroy .t} {} ;# delete it. Same as clear.
catch {destroy .byes} {} ;
catch {destroy .bno} {} ;
catch {destroy .end} {} ;
button .bguess -text "Choose a number between\n0 & $nmax" -command "runtrick $nmax" -font {Arial 32 bold}
pack .bguess
}
proc makeCard {nmax ntest} {
catch {destroy .bguess} {} ;
catch {destroy .t} {} ;# delete it. Same as clear.
catch {destroy .byes} {} ;
catch {destroy .bno} {} ;
catch {destroy .end} {} ;
if { $nmax >$ntest } {
text .t -bg beige
button .byes -text "Yes" -command "addresult $ntest 1 $nmax"
button .bno -text "No" -command "addresult $ntest 0 $nmax"
button .end -text "Quit" -command "exit"
pack .t .byes .bno .end
pack .byes .bno .end -side left
.t insert end "Is your number in this set:\n"
set i 1
set nextnewl 10
while {$i<$nmax} {
set frac [expr (($i/$ntest))]
if {[expr $frac%2==1 ] } {
.t insert end " $i"
}
incr i
if {$i>$nextnewl} {
.t insert end "\n"
incr nextnewl 10
}
}
} else {
showresult $nmax
}
}
proc runtrick {nmax} {
global sum
set sum 0
makeCard $nmax 1
}
proc starttrick {nmax} {
givehelp $nmax
}
set sum 0
starttrick 100