# Essays/Krypto

Krypto is a mathematical card game. The Krypto deck has 56 cards: 3 each of numbers 1-6, 4 each of the numbers 7-10, 2 each of 11-17, 1 each of 18-25.

```deck =: (3#1+i.6),(4#7+i.4),(2#11+i.7),18+i.8
```

Six cards are dealt: an objective card and five other cards. A player must use all five of the latter cards' numbers exactly once, using any combination of arithmetic operations (+ , - ,  * , and %)  to form the objective card's number. The first player to come up with a correct formula is the winner. The more strict "International Rules" specify the use of positive integers only; fractional and negative intermediate results are not permitted.

## A Solution

There are a maximum of !5 permutations of the 5 cards and 4 possibilities in each of the 4 places where an operation can be put, for (!5)*4^4 or 30720 total possibilities. This number is small enough to be amenable to an exhaustive approach.

```deal   =: deck {~ 6 ? (#deck)"_
allexp =: ((256*!5)\$'+-*%'{~(4\$4)#:i.256) (<a:;6+5*i.4)} 256#5":(i.!5) A. ]
solve  =: {. ([ ; (=".) ~.@# ]) allexp@}.
Krypto =: solve @ deal

t=: Krypto 0
t
┌──┬─────────────────────────┐
│17│    8 - 19 + 14 -  2 * 21│
│  │    8 - 19 + 14 - 21 *  2│
│  │    8 - 19 - 21 + 14 %  2│
│  │    8 - 14 + 19 -  2 * 21│
│  │    8 - 14 + 19 - 21 *  2│
│  │    8 +  2 - 14 % 19 - 21│
│  │      ...                │
│  │   21 +  8 - 19 - 14 %  2│
│  │   21 - 19 -  8 + 14 %  2│
└──┴─────────────────────────┘
\$ t
2
\$&.> t
┌┬─────┐
││24 25│
└┴─────┘
```

## Intermediate Steps

```   ] d=: deal 0
17 8 19 14 2 21

a=: allexp }.d
\$a
30720 25

8{.a
8 + 19 + 14 +  2 + 21
8 + 19 + 14 +  2 - 21
8 + 19 + 14 +  2 * 21
8 + 19 + 14 +  2 % 21
8 + 19 + 14 -  2 + 21
8 + 19 + 14 -  2 - 21
8 + 19 + 14 -  2 * 21
8 + 19 + 14 -  2 % 21

_5{.a
21 %  2 % 14 * 19 %  8
21 %  2 % 14 % 19 +  8
21 %  2 % 14 % 19 -  8
21 %  2 % 14 % 19 *  8
21 %  2 % 14 % 19 %  8

+/ 17 = ". a
24

solve d
┌──┬─────────────────────────┐
│17│    8 - 19 + 14 -  2 * 21│
│  │    8 - 19 + 14 - 21 *  2│
│  │    8 - 19 - 21 + 14 %  2│
│  │    8 - 14 + 19 -  2 * 21│
│  │    8 - 14 + 19 - 21 *  2│
│  │    8 +  2 - 14 % 19 - 21│
│  │      ...                │
│  │   21 +  8 - 19 - 14 %  2│
│  │   21 - 19 -  8 + 14 %  2│
└──┴─────────────────────────┘
```

deal 0 deals 6 cards from the deck. The first is treated as the objective card.

allexp c takes a 5-element integer list argument and produces a 30720-row character table result, consisting of all !5 permutations of the 5 cards interspersed with all 4^4 arrangements of the four operations + - * % .

Executing the rows of the result a of allexp produces a 30720 numeric list. Comparison of this list with the objective card results in a boolean list that selects the rows of a that are correct formulas.

## International Rules

The international rules can be applied readily:

```interm =: _7 _12 _17 ".@{."0 1"1 (0 8&}.)
posint =: [: *./"1 (=<.) *. 0&<:
irules =: (; ] #~ posint@interm)&>/

\$&.> irules t
┌┬────┐
││8 25│
└┴────┘
irules t
┌──┬─────────────────────────┐
│17│    8 +  2 + 14 % 21 - 19│
│  │    8 + 21 - 19 - 14 %  2│
│  │   19 -  2 *  8 - 21 - 14│
│  │   19 -  2 %  8 - 21 - 14│
│  │   19 -  2 * 14 - 21 -  8│
│  │   19 -  2 % 14 - 21 -  8│
│  │    2 +  8 + 14 % 21 - 19│
│  │   21 - 19 -  8 + 14 %  2│
└──┴─────────────────────────┘
```

## Collected Definitions

```deck   =: (3#1+i.6),(4#7+i.4),(2#11+i.7),18+i.8

deal   =: deck {~ 6 ? (#deck)"_
allexp =: ((256*!5)\$'+-*%'{~(4\$4)#:i.256) (<a:;6+5*i.4)} 256#5":(i.!5) A. ]
solve  =: {. ([ ; (=".) ~.@# ]) allexp@}.
Krypto =: solve @ deal

interm =: _7 _12 _17 ".@{."0 1"1 (0 8&}.)
posint =: [: *./"1 (=<.) *. 0&<:
irules =: (; ] #~ posint@interm)&>/
```