# CARD TRICK

Computers seem like magic to many people, but the following program goes one stage further and turns the computer into a magician enabling it to find a card chosen secretly by an onlooker. The presentation of the trick is as follows: the thirteen cards of one suit are fanned out face down, and the onlooker takes one and remembers it. The remaining pile of cards is cut once, and the onlooker then replaces the chosen card wherever he likes. The pile is then divided in two, and the two halves are shuffled together. Finally, the cards are fanned out face-up on the table, and the order of the cards is typed into the computer, representing Ace as 1, Jack as 11, Queen as 12, and King as 13. After a brief pause the computer announces which was the chosen card! The trick can be repeated any number of times, and the computer will almost always be right.

For example, suppose the cards are in the sequence shown below: Having typed in the sequence of cards the program will print.

`YOU PICKED THE 3`

The trick depends for its success on the cards being shuffled only once, and the shuffle should be of the sort that divides the packet into two halves, and merges the two halves back into one pile; this shuffle is sometimes called a riffle shuffle. The cards can be cut at any time, but only into two piles.

Program Operation

The program works by comparing the new order of the cards with their order the previous time the trick was performed; for each card a number is calculated which represents how far the processes of shuffling and cutting have moved that card from its previous neighbours. The higher this score, the more out of sequence is the card concerned. The card with the highest score is likely to be the one that was chosen.

When the programs are first executed they assume that the cards were in numerical order, ace up to king. If the cards are not in order when the trick is performed the computer will, most likely, get the trick wrong at the first attempt, but in some ways this adds to the mystery and can be attributed to "warming up"! Subsequently, the initial order is replaced by the new order of the cards, as typed in; therefore the order of the cards should not be disturbed between presentations of the trick.

There are cases in which the computer cannot be certain about which card was the chosen one. For example, if the card is returned to its original position then no information is available to the computer. Less obviously, if the card is replaced next to its previous neighbour, it is ambiguous whether it or its neighbour was the chosen card. Cutting the pack before asking the onlooker to replace the card encourages him to replace the card in a different position, minimising the chances of these events occurring.

BBC Computer Version

```10  REM ... Card Trick ...
20  DIM A(13),B(13),S(13)```

The cards are represented by the numbers 1 (for ace) to 13 (for king). First time, assume cards in order. Then the sequence of cards is read in.

```30  FOR J=l TO 13: A(J)=J: NEXT J
50  FOR J=l TO 13: S(J)=0
60  INPUT B(J): NEXT J```

Each of the cards in the previous sequence A(J) is searched for in the new sequence, and its position there is subtracted from the positions of each of the cards that were its neighbours in the previous sequence. The sequences are considered as circular, so 13 is added to any difference that turns out negative.

``` 70  T=A(13): PROCFIND
80  FOR J=l TO 13: L=X: R=T
90  T=A(J): PROCFIND
100  Q=X-L: IF Q<0 THEN Q=Q+13```

The cards distance from one neighbour, plus its distance from the other neighbour, is saved as that card's score.

```110  S(T)=S(T)+Q: S(R)=S(R)+Q
120  NEXT J```

The card with the maximum score is found and displayed as the chosen card.

```130  M=0
140  FOR J=l TO 13: A(J)=B(J)
150  IF S(J)>=M THEN Z=J: M=S(J)
160  NEXT J
170  PRINT "YOU PICKED THE "; Z
180  GOTO 40```

PROCFIND - Find card T in array B, and return number in X.

```200  DEF PROCFIND
210  FOR K=l TO 13: IF T=B(K) THEN X=K 220  NEXT K: ENDPROC```

Variables:

```A(1)..A(13) - Old array of cards
B(1)..B(13) - New array of cards
J - Counter
M - Maximum score
S(1)..S(13) - Scores for each card```

Atom Version

```10 REM ... CARD TRICK ...
20 DIM AA(13),BB(13),SS(13); @=0```

The cards are represented by the numbers 1 (for ace) to 13 (for king). First time, assume cards in order. Then the sequence of cards is read in.

```30 FOR J=l TO 13; AA(J)=J; NEXT J
50 FOR J=l TO 13; SS(J)=0
60 INPUT B; BB(J)=B; NEXT J```

Each of the cards in the previous sequence AA(J) is searched for in the new sequence, and its position there is subtracted from the positions of each of the cards that were its neighbours in the previous sequence. The sequences are considered as circular, so 13 is added to any difference that turns out negative.

``` 70 T=AA(13); GOSUB f
80 FOR J=1 TO 13; L=X; R=T
90 T=AA(J); GOSUB f
100 Q=X-L; IF Q<0 THEN Q=Q+13```

The cards distance from one neighbour, plus its distance from the other neighbour, is saved as that card's score.

```110 SS(T)=SS(T)+Q; SS(R)=SS(R)+Q
120 NEXT J```

The card with the maximum score is found and displayed as the chosen card.

```130 M=G
140 FOR J=l TO 13; AA(J)=BB(J)
150 IF SS(J)>=N THEN Z=J; M=SS(J) 160 NEXT J
170 PRINT "YOU PICKED THE " Z'
180 GOTO 40```

f - Find card T in array BB, and return number in X.

`210fFOR K=l TO 13; IF T=BB(K) THEN X=K 220 NEXT K; RETURN`

Variables:

```AA(1)..AA(13) - Old array of cards
B - Card entered
BB(1)..BB(13) - New array of cards
J - Counter
M - Maximum score
SS(1)..SS(13) - Scores for each card```