# pegGame.frink

``` // This Frink program analyzes the peg-jumping board game like the ones found // at Cracker Barrel. class PegGame { // This encodes the locations we can [jumpTo, over] from a given peg. class var jumpTable = [[[3,1],[5,2]],  // 0              [[6,3],[8,4]],  // 1              [[7,4],[9,5]],  // 2              [[0,1],[5,4],[10,6],[12,7]], // 3              [[11,7],[13,8]], // 4              [[0,2],[3,4],[12,8],[14,9]],  // 5              [[1,3],[8,7]],   // 6              [[2,4],[9,8]],   // 7              [[1,4],[6,7]],   // 8              [[2,5],[7,8]],   // 9              [[3,6],[12,11]], // 10              [[4,7],[13,12]], // 11              [[3,7],[5,8],[10,11],[14,13]], // 12              [[4,8],[11,12]], // 13              [[5,9],[12,13]]] // 14    // Sets up a board for analysis    class analyzeBoard[pegs, trackMoves = false] :=    {       results = makeArray[[11],0]       if trackMoves == true          moves = new array       else          moves = undef       analyzeBoardRecursive[pegs, results, moves]       sum = sum[results]       for i = 1 to 10       {          r = results@i          if (r != 0)             println["\$i\t\$r\t" + padLeft[format[r/sum*100,1,4],7," "]]       }    }    class analyzeBoardRecursive[pegs, results, currentMove] :=    {       //println[pegs]       movesFound = 0       pegsLeft = 0       for from = 0 to 14       {          if (pegs@from == true)          {             pegsLeft = pegsLeft + 1             jumps = jumpTable@from             for [jumpTo, jumpOver] = jumps                if pegs@jumpTo == false and pegs@jumpOver == true                {                   newBoard = pegs.shallowCopy[]                   newBoard@from = false                   newBoard@jumpTo = true                   newBoard@jumpOver = false                   movesFound = movesFound + 1                   if currentMove != undef                   {                      newMoves = currentMove.shallowCopy[]                      newMoves.push["\$from-\$jumpTo"]                   }                   analyzeBoardRecursive[newBoard, results, newMoves]                }          }       }       if (movesFound == 0)       {          //println[pegsLeft]          if pegsLeft == 1          {             print["remain:\$pegsLeft\t"]             if (currentMove != undef)                print[join[" ",currentMove]]             println["\t\$pegs"]          }          results@pegsLeft = results@pegsLeft + 1       }    } }   pegs = makeArray[[15],true] // Remove one peg pegs@0 = false println["\n(0 initially empty):"] PegGame.analyzeBoard[pegs, true] pegs = makeArray[[15],true] // Remove one peg pegs@1 = false println["\n(1 initially empty):"] PegGame.analyzeBoard[pegs, true] pegs = makeArray[[15],true] // Remove one peg pegs@4 = false println["\n(3 initially empty):"] PegGame.analyzeBoard[pegs, true] pegs = makeArray[[15],true] // Remove one peg pegs@3 = false println["\n(4 initially empty):"] PegGame.analyzeBoard[pegs, true]              ```