Essays/Kakuro

From J Wiki
Jump to navigation Jump to search

Introduction

Kakuro カックロ is a numeric version of crossword puzzles and is also known as "cross sums". You can find out more about it at:

A Kakuro puzzle is here represented as a boxed matrix. Each box is either 'x' (an inactive square) or _ (a blank square) or has two numbers, which if nonzero indicates that the vertical entry below or the horizontal entry to the right must have that sum. (The first number is the vertical sum; the second number is the horizontal sum.) To solve a puzzle, fill the blank squares with numbers from 1 to 9 so that an entry contains no duplicate numbers and has the required sum.

Kakuro1.gif   Kakuro2.gif

For example, the puzzle depicted above would be represented as follows. Its solution is also shown.

x=. 'x'

k0=: ".;._2 ] 0 : 0
  x   ;  x  ;  x  ; 6 0 ; 3 0
  x   ; 4 0 ; 3 3 ;  _  ;  _
 0 10 ;  _  ;  _  ;  _  ;  _
 0  3 ;  _  ;  _  ;  x  ;  x
)

   k0
┌────┬───┬───┬───┬───┐
│x   │x  │x  │6 0│3 0│
├────┼───┼───┼───┼───┤
│x   │4 0│3 3│_  │_  │
├────┼───┼───┼───┼───┤
│0 10│_  │_  │_  │_  │
├────┼───┼───┼───┼───┤
│0 3 │_  │_  │x  │x  │
└────┴───┴───┴───┴───┘
   kakuro k0
┌────┬───┬───┬───┬───┐
│x   │x  │x  │6 0│3 0│
├────┼───┼───┼───┼───┤
│x   │4 0│3 3│2  │1  │
├────┼───┼───┼───┼───┤
│0 10│3  │1  │4  │2  │
├────┼───┼───┼───┼───┤
│0 3 │1  │2  │x  │x  │
└────┴───┴───┴───┴───┘

A Kakuro Solver

NB. cross sums for x where y is list of lists of possible numbers for each column
csl=: 4 : 0
 |: (#~ x = +/"1) (#~ *./@~:"1 *. x >: +/"1)@(,/)@:(,."0 _)&:>/ y
)

NB. joint possibilities for list of indices x and sums y
jposs=: 4 : 0
 b=. (1+>./;x)#,:0 1 1 1 1 1 1 1 1 1      NB. possible numbers for each square
 v=. i.#x
 p=. (#x)$a:
 for. i.#x do.
  j=. v {~ (i.<./) */@({&(+/"1 b))&> v{x  NB. index of entry with fewest est. possibilities
  v=. v -. j                              NB. remove from future consideration
  k=. j{::x                               NB. indices of squares of j-th entry
  t=. (j{y) csl <@I."1 k{b                NB. joint possibilities for j-th entry
  b=. b k}~ (i.10) e."1 t                 NB. update lists of possible numbers
  p=. p j}~ <t
 end.
)

NB. x - indices of the squares in entries
NB. y - corresp. joint possibilities
NB. reduce joint possibilities by finding forced moves
force=: 4 : 0
 j=. ; x
 r=. (j *.//. ; (i.10)&e."1&.> y) (~.j)} ((1+>./j),10)$0
 y (*./@({"_1) #"1 [)&.> {&r&.> x
)

NB. same arguments as "force"; find any and all solutions
solve=: 4 : 0 " 1
 p=. x force^:_ y                         NB. reduce joint possibilities by forced moves
 n=. {:@$&> p                             NB. # joint possibilities
 if. 0 e. n do. (0,#y)$y return. end.     NB. done if some square has no possibilities
 if. *./1=n do. ,:p return. end.          NB. done if found unique solution
 j=. (i.<./) n+(1=n)*>./n                 NB. index of entry with smallest # possibilities > 1
 ; x <@solve p j}"0 1~ ('';1) <;.1 >j{p   NB. fan out the joint possibilities of that entry
)

NB. indices of the squares in each entry and the required sums
entries=: 3 : 0
 t=. (|.&.>,y),,|:y                       NB. make all entries horizontal
 b=. t e. <_                              NB. blank squares
 p=. b<}.b,0                              NB. starts of entries
 i=. b #&.>&(p&(<;.1)) (i.*/$y),,|:i.$y   NB. indices of squares of entries
 s=. {.&> p#t                             NB. corresponding sums
 i;s
)

NB. find all solutions of Kakuro puzzle y
kakuro=: 3 : 0
 'i s'=. entries y
 y (;i)"_}"1 2~ <"0@;"1 ,&.> i solve i jposs s
)

Sample Puzzles

x=. 'x'

k1=: ".;._2 ] 0 : 0  NB. http://en.wikipedia.com/wiki/Kakuro
  x   ; 23 0 ; 30  0 ;   x   ;   x   ; 27 0 ; 12 0 ; 16 0
 0 16 ;   _  ;   _   ;   x   ; 17 24 ;   _  ;   _  ;   _
 0 17 ;   _  ;   _   ; 15 29 ;   _   ;   _  ;   _  ;   _
 0 35 ;   _  ;   _   ;   _   ;   _   ;   _  ; 12 0 ;   x
  x   ;  0 7 ;   _   ;   _   ;  7  8 ;   _  ;   _  ;  7 0
  x   ; 11 0 ; 10 16 ;   _   ;   _   ;   _  ;   _  ;   _
 0 21 ;   _  ;   _   ;   _   ;   _   ;  0 5 ;   _  ;   _
 0 6  ;   _  ;   _   ;   _   ;   x   ;  0 3 ;   _  ;   _
)

k2=: ".;._2 ] 0 : 0  NB. http://www.kakuro.com
  x   ; 13 0 ; 34  0 ;   x  ;   x   ;   x   ; 34 0 ; 10 0
 0 16 ;   _  ;   _   ; 29 0 ;   x   ; 28  8 ;   _  ;   _
 0  7 ;   _  ;   _   ;   _  ; 10 9  ;   _   ;   _  ;   _
 0 41 ;   _  ;   _   ;   _  ;   _   ;   _   ;   _  ;   _
 0 29 ;   _  ;   _   ;   _  ;   _   ;   _   ;   _  ;   _
  x   ;  0 7 ;   _   ;   _  ; 16 16 ;   _   ;   _  ;   x
  x   ; 11 0 ;  7 23 ;   _  ;   _   ;   _   ; 21 0 ; 23 0
 0 28 ;   _  ;   _   ;   _  ;   _   ;   _   ;   _  ;   _
 0 12 ;   _  ;   _   ;   _  ;  0 20 ;   _   ;   _  ;   _
 0  4 ;   _  ;   _   ;   x  ;   x   ;  0 16 ;   _  ;   _
)

k3=: ".;._2 ] 0 : 0  NB. http://www.kakuropuzzle.com/challenge/12453-24281.gif
  x   ;  6 0 ;  3 0 ;  9  0 ; 12 0  ; 12 0 ;  x   ;   x   ;   x  ; 21 0 ; 15 0
 0 15 ;   _  ;   _  ;   _   ;   _   ;   _  ; 7 0  ;   x   ;  0 5 ;   _  ;   _
 0 21 ;   _  ;   _  ;   _   ;   _   ;   _  ;  _   ;  3  0 ;  0 7 ;   _  ;   _
  x   ;   x  ;   x  ; 10 12 ;   _   ;   _  ;  _   ;   _   ; 11 3 ;   _  ;   _
  x   ;   x  ; 21 4 ;   _   ;   _   ;   x  ; 0 11 ;   _   ;   _  ;   _  ;   _
  x   ; 15 3 ;   _  ;   _   ;   x   ;   x  ;  x   ;  0 12 ;   _  ;   _  ;   _
 0 10 ;   _  ;   _  ;   _   ;  3 0  ;   x  ;  x   ; 10  7 ;   _  ;   _  ;   x
 0 10 ;   _  ;   _  ;   _   ;   _   ; 10 0 ; 9  5 ;   _   ;   _  ;   x  ;   x
 0  4 ;   _  ;   _  ;  0 10 ;   _   ;   _  ;  _   ;   _   ;  8 0 ;  3 0 ;  6 0
 0  9 ;   _  ;   _  ;   x   ;  0 21 ;   _  ;  _   ;   _   ;   _  ;   _  ;   _
 0 10 ;   _  ;   _  ;   x   ;   x   ; 0 15 ;  _   ;   _   ;   _  ;   _  ;   _
)

k4=: ".;._2 ] 0 : 0  NB. http://www.kakuro.com
  x   ;   x   ; 38 0 ;  3  0 ;   x   ; 23  0 ;  4  0 ; 16 0
  x   ; 13 11 ;   _  ;   _   ; 29 18 ;   _   ;   _   ;   _
 0 28 ;   _   ;   _  ;   _   ;   _   ;   _   ;   _   ;   _
 0 16 ;   _   ;   _  ; 11 12 ;   _   ;   _   ; 22  0 ; 14 0
  x   ; 11 13 ;   _  ;   _   ;   _   ;  4 14 ;   _   ;   _
 0 29 ;   _   ;   _  ;   _   ;   _   ;   _   ;   _   ;   _
 0 15 ;   _   ;   _  ;  6  7 ;   _   ;   _   ;   _   ;  5 0
  x   ;  6  0 ; 17 6 ;   _   ;   _   ; 12  4 ;   _   ;   _
 0 41 ;   _   ;   _  ;   _   ;   _   ;   _   ;   _   ;   _
 0 13 ;   _   ;   _  ;   _   ;  0  7 ;   _   ;   _   ;   x
)

k5=: ".;._2 ] 0 : 0
 x ; x ; x ; 10 0 ; 13 0 ; 13 0 ; x ; x ; 10 0 ; 34 0 ; x ; 16 0 ; 11 0 ; x ; x ; 13 0 ; 10 0; 13 0 ; x ; x
 x ; 10 0 ; 8 21 ; _ ; _ ; _ ; x ; 14 6 ; _ ; _ ; 0 15 ; _ ; _ ; 9 0 ; 0 20 ; _ ; _ ; _ ; 5 0 ; 14 0
 0 15 ; _ ; _ ; _ ; _ ; _ ; 13 23 ; _ ; _ ; _ ; 18 7 ; _ ; _ ; _ ; 12 16 ; _ ; _ ; _ ; _ ; _
 0 10 ; _ ; _ ; 9 0 ; 15 23 ; _ ; _ ; _ ; 0 19 ; _ ; _ ; _ ; 0 23 ; _ ; _ ; _ ; 16 0 ; 12 11 ; _ ; _
 x ; 3 0 ; 41 23 ; _ ; _ ; _ ; _ ; 13 0 ; 6 13 ; _ ; _ ; _ ; 12 0 ; 4 22 ; _ ; _ ; _ ; _ ; 41 0 ; 6 0
 0 13 ; _ ; _ ; _ ; _ ; 8 0 ; 38 30 ; _ ; _ ; _ ; _ ; _ ; _ ; _ ; 34 0 ; 17 24 ; _ ; _ ; _ ; _
 0 3 ; _ ; _ ; 11 0 ; 0 29 ; _ ; _ ; _ ; _ ; 23 0 ; 5 0 ; 34 14 ; _ ; _ ; _ ; _ ; x ; 9 3 ; _ ; _
 x ; 0 7 ; _ ; _ ; 6 4 ; _ ; _ ; 4 0 ; 0 7 ; _ ; _ ; _ ; x ; 7 15 ; _ ; _ ; 5 15 ; _ ; _ ; x
 x ; 9 17 ; _ ; _ ; _ ; 14 6 ; _ ; _ ; 13 13 ; _ ; _ ; _ ; 7 5 ; _ ; _ ; 11 8 ; _ ; _ ; _ ; 15 0
 0 7 ; _ ; _ ; 9 38 ; _ ; _ ; _ ; _ ; _ ; _ ; 7 38 ; _ ; _ ; _ ; _ ; _ ; _ ; 14 15 ; _ ; _
 0 23 ; _ ; _ ; _ ; 0 7 ; _ ; _ ; 0 17 ; _ ; _ ; _ ; _ ; _ ; 0 8 ; _ ; _ ; 0 10 ; _ ; _ ; _
 0 11 ; _ ; _ ; _ ; 0 14 ; _ ; _ ; x ; 0 23 ; _ ; _ ; _ ; x ; 0 10 ; _ ; _ ; 0 23 ; _ ; _ ; _
)

k6=: ".;._2 ] 0 : 0
 x ; 24 0 ; 28 0 ; x ; 41 0 ; 7 0
 0 8 ; _ ; _ ; 16 9 ; _ ; _
 0 34 ; _ ; _ ; _ ; _ ; _
 0 24 ; _ ; _ ; _ ; _ ; _
 x ; 23 7 ; _ ; _ ; _ ; 14 0
  0 34 ; _ ; _ ; _ ; _ ; _
 0 20 ; _ ; _ ; _ ; _ ; _
 0 14 ; _ ; _ ; 0 3 ; _ ; _
)

k7=: ".;._2 ] 0 : 0  NB. http://www.kakuroconquest.com puzzle 15375
 x; 8 0 ; 11 0 ; 22 0 ; 6 0 ; x ; x ; 25 0 ; 13 0 ; 10 0
 0 24 ; _ ; _ ; _ ; _ ; x ; 0 11 ; _ ; _ ; _
 0 14 ; _ ; _ ; _ ; _ ; 40 0 ; 11 24 ; _ ; _ ; _
 x ; 27 0 ; 18 38 ; _ ; _ ; _ ; _ ; _ ; _ ; x
 0 13 ; _ ; _ ; 16 0 ; 12 8 ; _ ; _ ; _ ; 21 0 ; 10 0
 0 17 ; _ ; _ ; _ ; _ ; _ ; 13 0 ; 10 11 ; _ ; _
 0 45 ; _ ; _ ; _ ; _ ; _ ; _ ; _ ; _ ; _
 0 16 ; _ ; _ ; 24 0 ; 11 28 ; _ ; _ ; _ ; _ ; _
 x ; x ; 13 7 ; _ ; _ ; _ ; 20 0 ;6 13 ; _ ; _
 x ; 10 35 ; _ ; _ ; _ ; _ ; _ ; _ ; 6 0 ; 12 0
 0 9 ; _ ; _ ; _ ; x ; 0 14 ; _ ; _ ; _ ; _
 0 24 ; _ ; _ ; _ ; x ; 0 24 ; _ ; _ ; _ ; _
)

The following examples shows k2 and its solution. Intermediate values are included to demonstrate that k2 can be solved using forced moves alone.

   k2
┌────┬────┬────┬────┬─────┬────┬────┬────┐
│x   │13 0│34 0│x   │x    │x   │34 0│10 0│
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 16│_   │_   │29 0│x    │28 8│_   │_   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 7 │_   │_   │_   │10 9 │_   │_   │_   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 41│_   │_   │_   │_    │_   │_   │_   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 29│_   │_   │_   │_    │_   │_   │_   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│x   │0 7 │_   │_   │16 16│_   │_   │x   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│x   │11 0│7 23│_   │_    │_   │21 0│23 0│
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 28│_   │_   │_   │_    │_   │_   │_   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 12│_   │_   │_   │0 20 │_   │_   │_   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 4 │_   │_   │x   │x    │0 16│_   │_   │
└────┴────┴────┴────┴─────┴────┴────┴────┘
   kakuro k2
┌────┬────┬────┬────┬─────┬────┬────┬────┐
│x   │13 0│34 0│x   │x    │x   │34 0│10 0│
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 16│7   │9   │29 0│x    │28 8│7   │1   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 7 │1   │4   │2   │10 9 │2   │4   │3   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 41│2   │7   │6   │9    │5   │8   │4   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 29│3   │8   │5   │1    │4   │6   │2   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│x   │0 7 │6   │1   │16 16│7   │9   │x   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│x   │11 0│7 23│8   │9    │6   │21 0│23 0│
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 28│2   │4   │3   │7    │1   │5   │6   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 12│6   │2   │4   │0 20 │3   │9   │8   │
├────┼────┼────┼────┼─────┼────┼────┼────┤
│0 4 │3   │1   │x   │x    │0 16│7   │9   │
└────┴────┴────┴────┴─────┴────┴────┴────┘

   'i s'=: entries k2
   $ i
26
   $ s
26
   i               NB. indices of the squares of each entry
┌────┬─────┬────────┬────────┬────────────────────┬────────────────────┬─────┬
│9 10│14 15│17 18 19│21 22 23│25 26 27 28 29 30 31│33 34 35 36 37 38 39│42 43│ ...
└────┴─────┴────────┴────────┴────────────────────┴────────────────────┴─────┴
   s               NB. corresponding sums
16 8 7 9 41 29 7 16 23 28 12 20 4 16 13 11 34 7 29 10 16 28 34 21 10 23

   p=: i jposs s
   $&.> p
┌───┬───┬───┬────┬────┬────┬───┬───┬───┬────┬────┬───┬───┬───┬───┬────┬───┬───┬
│2 2│2 6│3 6│3 18│7 18│7 48│2 6│2 2│3 2│7 16│3 10│3 5│2 2│2 2│4 4│3 10│5 4│3 2│ ...
└───┴───┴───┴────┴────┴────┴───┴───┴───┴────┴────┴───┴───┴───┴───┴────┴───┴───┴
   p               NB. initial joint possibilities
┌───┬───────────┬───────────┬───────────────────────────────────┬───────────────
│7 9│1 2 3 5 6 7│1 1 2 2 4 4│1 1 1 1 2 2 2 2 3 3 3 3 4 4 5 5 6 6│2 2 2 2 2 2 2 2
│9 7│7 6 5 3 2 1│2 4 1 4 1 2│2 3 5 6 1 3 4 6 1 2 4 5 2 3 1 3 1 2│7 7 7 7 7 7 8 8
│   │           │4 2 4 1 2 1│6 5 3 2 6 4 3 1 5 4 2 1 3 2 3 1 2 1│6 6 8 8 9 9 6 6 ...
│   │           │           │                                   │8 9 6 9 6 8 7 9
│   │           │           │                                   │5 5 5 5 5 5 5 5
│   │           │           │                                   │9 8 9 6 8 6 9 7
│   │           │           │                                   │4 4 4 4 4 4 4 4
└───┴───────────┴───────────┴───────────────────────────────────┴───────────────

   NB. # of joint possibilities after each iteration
   {:@$&> i force^:a: p
2 6 6 18 18 48 6 2 2 16 10 5 2 2 4 10 4 2 144 8 2 48 8 8 18 2
1 2 2  4 10 48 1 1 1 16  5 3 1 1 1  4 2 2 144 4 1  6 2 2  6 1
1 1 1  3  2  4 1 1 1  8  4 1 1 1 1  2 1 2   6 4 1  4 2 1  4 1
1 1 1  3  1  4 1 1 1  3  2 1 1 1 1  2 1 2   2 1 1  4 1 1  1 1
1 1 1  1  1  1 1 1 1  3  2 1 1 1 1  2 1 1   1 1 1  4 1 1  1 1
1 1 1  1  1  1 1 1 1  2  1 1 1 1 1  2 1 1   1 1 1  1 1 1  1 1
1 1 1  1  1  1 1 1 1  1  1 1 1 1 1  1 1 1   1 1 1  1 1 1  1 1

A Kakuro puzzle may have more than one solution. For example:

   k3
┌────┬────┬────┬─────┬────┬────┬────┬────┬────┬────┬────┐
│x   │6 0 │3 0 │9 0  │12 0│12 0│x   │x   │x   │21 0│15 0│
├────┼────┼────┼─────┼────┼────┼────┼────┼────┼────┼────┤
│0 15│_   │_   │_    │_   │_   │7 0 │x   │0 5 │_   │_   │
├────┼────┼────┼─────┼────┼────┼────┼────┼────┼────┼────┤
│0 21│_   │_   │_    │_   │_   │_   │3 0 │0 7 │_   │_   │
├────┼────┼────┼─────┼────┼────┼────┼────┼────┼────┼────┤
│x   │x   │x   │10 12│_   │_   │_   │_   │11 3│_   │_   │
├────┼────┼────┼─────┼────┼────┼────┼────┼────┼────┼────┤
│x   │x   │21 4│_    │_   │x   │0 11│_   │_   │_   │_   │
├────┼────┼────┼─────┼────┼────┼────┼────┼────┼────┼────┤
│x   │15 3│_   │_    │x   │x   │x   │0 12│_   │_   │_   │
├────┼────┼────┼─────┼────┼────┼────┼────┼────┼────┼────┤
│0 10│_   │_   │_    │3 0 │x   │x   │10 7│_   │_   │x   │
├────┼────┼────┼─────┼────┼────┼────┼────┼────┼────┼────┤
│0 10│_   │_   │_    │_   │10 0│9 5 │_   │_   │x   │x   │
├────┼────┼────┼─────┼────┼────┼────┼────┼────┼────┼────┤
│0 4 │_   │_   │0 10 │_   │_   │_   │_   │8 0 │3 0 │6 0 │
├────┼────┼────┼─────┼────┼────┼────┼────┼────┼────┼────┤
│0 9 │_   │_   │x    │0 21│_   │_   │_   │_   │_   │_   │
├────┼────┼────┼─────┼────┼────┼────┼────┼────┼────┼────┤
│0 10│_   │_   │x    │x   │0 15│_   │_   │_   │_   │_   │
└────┴────┴────┴─────┴────┴────┴────┴────┴────┴────┴────┘
   t=: kakuro k3
   $ t
40 11 11
   NB. that is, there are 40 solutions

   (0{t) = 1{t
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 0 1 0 0
1 1 1 1 1 1 1 0 1 0 0
   _2 _4 {. 0{t
┌─┬─┬─┬─┐
│1│5│2│4│
├─┼─┼─┼─┤
│4│3│1│2│
└─┴─┴─┴─┘
   _2 _4 {. 1{t
┌─┬─┬─┬─┐
│4│5│1│2│
├─┼─┼─┼─┤
│1│3│2│4│
└─┴─┴─┴─┘

Kakuro Combinations

Kakuro combinations can be generated by selecting combinations of 1+i.9 that have the required sum.

comb=: 4 : 0        NB. All size x combinations of i.y
 k=. i.>:d=.y-x
 z=. (d$<i.0 0),<i.1 0
 for. i.x do. z=. k ,.&.> ,&.>/\. >:&.> z end.
 ; z
)

kc=: ((= +/"1) # ]) >:@comb&9

comb is from the for. page of the dictionary;  x kc y generates all combinations of size y that sum to x .

   18 kc 4
1 2 6 9
1 2 7 8
1 3 5 9
1 3 6 8
1 4 5 8
1 4 6 7
2 3 4 9
2 3 5 8
2 3 6 7
2 4 5 7
3 4 5 6



See also


Contributed by Roger Hui.