Essays/Krypto

From J Wiki
Jump to navigation Jump to search

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)&>/



See also



Contributed by Roger Hui.