# Essays/88 Hats

## The Puzzle

The "88 Hats" puzzle was posed by Andrew Nikitin to the J Forum on 2007-06-05. The following is a slightly modified version.

88 people stand in a circle, each having a hat with a number from 0 to 87 written on it. Everyone can see the numbers on other people's hats but can not see his own number. They simultaneously write a number on a piece of paper and give it to the judge. If at least one of them wrote a number that is on his own hat then everyone wins, otherwise everyone loses. What strategy should they use to guarantee victory?
(Numbers on the hats do not have to be all different. People can not exchange any information during the procedure but can agree on some strategy beforehand.)

The puzzle was solved by John Randall a day later.

Solution below.

## A Winning Strategy

The strategy works for any number of hats m . Beforehand, the people number themselves from 0 to m-1 . Let h be the list of hat numbers, and n{s be the sum of the numbers that person n sees. Then n{w , the number that person n writes, is m|n-n{s .

```   m=: 13

] h=: ?.@#~ m
10 3 3 6 11 11 4 0 10 2 5 6 2

] s=: 1 +/\. h
63 70 70 67 62 62 69 73 63 71 68 67 71

] w=: m | (i.m) - s
2 9 10 1 7 8 2 12 10 3 7 9 6

w ,: h
2 9 10 1  7  8 2 12 10 3 7 9 6
10 3  3 6 11 11 4  0 10 2 5 6 2

+/ w = h
1
```

Here's why it works. Let t=:m|+/h be the sum of all the hat numbers, modulo m . The following are equal:

```t
m|(t{s)+m|t-t{s        NB. modulo arithmetic
m|(t{s)+t{w            NB. definition of w
```

Moreover, since t{s is the sum of all hats excluding t{h , it must be that t=m|(t{s)+t{h . Therefore m|(t{s)+t{w and m|(t{s)+t{h are equal and so t{w and t{h are equal. That is, the written number t{w for person t matches his hat number t{h .

```   ] t=: m|+/h
8
t{w
10
t{h
10
```

It is instructive to examine what the "winning strategy" does for 2 hats. The strategy calls for person n to write m|n-n{s . When m=:2 ,  this reduces to person 0 writing the hat number of person 1 and person 1 writing the negation of the hat number of person 0. The tabulation of all possible hat numberings and corresponding writings shows that in each scenario there is a written number that equals a hat number.

 numbering writing 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 0

## An Abstraction

Let G be an abelian group of size m with operation g and whose group members are items of u . Compute s=: 1 g/\.h{u ; n{s is the "sum" of hat numbers that person n sees. Then the written number n{w is u i. (n{u) g gi n{s where gi x is the inverse of x in the group. (In the previous section G is the group of integers under addition modulo m ; the group elements u are i.m .)

Why does it work? Let t=: u i. g/h{u be the index of the "sum" of all the hat numbers. The following are equal:

```(t{u)
(t{u) g (t{s) g gi (t{s)  NB. group inverse and identity
(t{s) g (t{u) g gi (t{s)  NB. associative and commutative
(t{s) g (t{w){u           NB. definition of w
```

Moreover, since t{s is the sum of all hats excluding (t{h){u and the group is abelian, it follows that (t{u)=(t{s) g (t{h){u .  Therefore (t{s) g (t{w){u and (t{s) g (t{h){u are equal, and so (t{w){u and (t{h){u are equal and consequently t{w and t{h are equal. That is, the written number t{w for person t matches his hat number t{h .

## 88 Hats

The original puzzle has m=:88 . Since

```   I. 88 = 5 p: i.1000
89 115 178 184 230 276
```

There are at least 7 different strategies, derived from addition modulo 88 and multiplication modulo each b of 89 115 178 184 230 276 on the numbers co-prime to b . Thus:

```NB. winning strategy based on group table x for hat numbering y
NB. default group table is + modulo #y

win=: ((# | +/~@i.@#) \$: ]) : (4 : 0)
assert. y e. i.m=.#y
assert. (\$x) -: m,m
assert. x -: |:x          NB. must be abelian
G=. ({.x) i. x            NB. standardize group table
g=. G {~ ;&.>             NB. group operation
gi=. {&G i."1 0:          NB. inverse
(i.m) g gi 1 g/\.y
)
```

The left argument x of win is a group table. It is standardized by doing ({.x)i.x ,  whence the group elements are i.m and the identity element is 0.

```   mgrp=: | */~@I.@(1 = ] +. i.)  NB. group table for * modulo y

mgrp 7
1 2 3 4 5 6
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
5 3 1 6 4 2
6 5 4 3 2 1
mgrp 9
1 2 4 5 7 8
2 4 8 1 5 7
4 8 7 2 1 5
5 1 2 7 8 4
7 5 1 8 4 2
8 7 5 4 2 1
```

mgrp b computes the group table for the integers under multiplication modulo b .  The group elements are the numbers co-prime to b .

```   m=: 88
h=: ?.@#~ m

I. h = win h
19
I. h = (mgrp  89) win h
28
I. h = (mgrp 115) win h
15
I. h = (mgrp 178) win h
40
I. h = (mgrp 184) win h
71
I. h = (mgrp 230) win h
55
I. h = (mgrp 276) win h
38
```

Contributed by Andrew Nikitin, John Randall, and Roger Hui. Dyalog APL version available here.