// 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]