My kid asked me to think of a number between 1 and 60 and to point out which of five cards the number showed at. And then he "divined" my number. I thought for a moment and then I proposed another guessing game for him: tell me your number between 1 and 60 and then I "divined" the cards the number should show off. My guesses proved to be flawless to the amusement of him and his sister.
The really good part was when I explained (very mildly) how the cards were built by representing the numbers in binary and assigning each card a position and the numbers which had a bit 1 in that position. I managed to do it without fuss and without letting them realize I was actually lecturing on something.
They enjoyed the decomposition algorithm I taught them - decomposing 28 to 16 + 8 + 4 or 13 to 8 + 4 + 1. All very simple with ordinary mathematics a young kid can handle easily. All of a sudden, the "magical" trick turned out to be a simple mathematic problem at their reach.
The real trick was building the cards - not really a trick after the rationale was found, but boring and error-prone to do by hand. So I wrote this:
#!/usr/bin/perl
use strict;
use warnings;
my %cards = (
1 => [],
2 => [],
4 => [],
8 => [],
16 => []
);
my @keys = sort { $a <=> $b } keys %cards;
sub add_number {
my $n = shift;
for my $k (@keys) {
last if $k>$n;
push @{$cards{$k}}, $n if $n & $k;
}
}
sub show {
for my $k (@keys) {
my @numbers = @{$cards{$k}};
last unless @numbers; # don't show empty cards
printf "%3.d:". (" %3.d" x @numbers) . "(%d)\n", $k, @numbers, scalar @numbers;
}
print "\n";
}
for my $i (1..63) {
add_number($i);
}
show();
That was instructive after all.