Solve triangle solitaire puzzle: Difference between revisions
Content added Content deleted
(Solve one solution for IQ 15 triangle puzzle) |
No edit summary |
||
Line 7:
# Not implemented variations Start with empty peg in X and solve with one peg in position Y
# Python version 2.7.2
# {{task}}
# IQ Puzzle a triangle of 15 golf tee's typically seen at Cracker Barrel where one tee is missing
# and the remaining tees jump each other until ne tee is left. The few tees left the higher the IQ
# score. peg #1 is the top center and bottom row pegs 11 thru 15
# reference picture http://www.joenord.com/puzzles/peggame/
# Task Print a solution to solve the puzzle leaving one peg
# Not implemented variations Start with empty peg in X and solve with one peg in position Y
# Python version 2.7.2
#
# Draw board triangle in ascii
#
def DrawBoard(board):
peg = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
for n in xrange(1,16):
peg[n] = '.'
if(n in board):
peg[n] = "%X" % n
print " %s" % peg[1]
print " %s %s" % (peg[2],peg[3])
print " %s %s %s" % (peg[4],peg[5],peg[6])
print " %s %s %s %s" % (peg[7],peg[8],peg[9],peg[10])
print " %s %s %s %s %s" % (peg[11],peg[12],peg[13],peg[14],peg[15])
#
# remove peg n from board and return board
def RemovePeg(board,n):
i = board.index(n)
del(board[i])
return board
# Add peg n on board and return board
def AddPeg(board,n):
board.append(n)
return board
# return true if peg N is on board else false is empty position
def IsPeg(board,n):
return n in board
# A dictionary of valid jump moves index by jumping peg
# then a list of moves where move has jumpOver and LandAt positions
JumpMoves = { 1: [ [2,4],[3,6] ], # 1 can jump over 2 to land on 4, or jumper over 3 to land on 6
2: [ [4,7],[5,9] ],
3: [ [5,8],[6,10] ],
4: [ [2,1],[5,6],[7,11],[8,13] ],
5: [ [8,12],[9,14] ],
6: [ [3,1],[5,4],[9,13],[10,15] ],
7: [ [4,2],[8,9] ],
8: [ [5,3],[9,10] ],
9: [ [5,2],[8,7] ],
10: [ [9,8] ],
11: [ [12,13] ],
12: [ [8,5],[13,14] ],
13: [ [8,4],[9,6],[12,11],[14,15] ],
14: [ [9,5],[13,12] ],
15: [ [10,6],[14,13] ]
}
Solution = []
#
# Recursively solve the problem
#
def Solve(board):
#DrawBoard(board)
if(len(board) == 1):
return board # Solved one peg left
# try a move for each peg on the board
for peg in xrange(1,16): # try in numeric order not board order
if(IsPeg(board,peg)):
movelist = JumpMoves[peg]
for move in movelist:
over = move[0]
land = move[1]
if(IsPeg(board,over) and not IsPeg(board,land)):
saveboard = board[:] # for back tracking
RemovePeg(board,peg)
RemovePeg(board,over)
AddPeg(board,land) # board order changes!
Solution.append([peg,over,land])
board = Solve(board)
if(len(board) == 1):
return board
## undo move and back track when stuck!
board = saveboard[:] # back track
del(Solution[-1]) # remove last move
return board
#
# Remove one peg and start solving
#
def InitSolve(empty):
board = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
board= RemovePeg(board,empty_start)
Solve(board)
#
empty_start = 1
InitSolve(empty_start)
board = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
board= RemovePeg(board,empty_start)
for move in Solution:
peg = move[0]
over = move[1]
land = move[2]
RemovePeg(board,peg)
RemovePeg(board,over)
AddPeg(board,land) # board order changes!
DrawBoard(board)
print "Peg %X jumped over %X to land on %X\n" % (peg,over,land)
|
Revision as of 04:45, 17 October 2014
- Solve triangle solitaire puzzle
You are encouraged to solve this task according to the task description, using any language you may know.
- IQ Puzzle a triangle of 15 golf tee's typically seen at Cracker Barrel where one tee is missing
- and the remaining tees jump each other until ne tee is left. The few tees left the higher the IQ
- score. peg #1 is the top center and bottom row pegs 11 thru 15
- reference picture http://www.joenord.com/puzzles/peggame/
- Task Print a solution to solve the puzzle leaving one peg
- Not implemented variations Start with empty peg in X and solve with one peg in position Y
- Python version 2.7.2
- Solve triangle solitaire puzzle
You are encouraged to solve this task according to the task description, using any language you may know.
- IQ Puzzle a triangle of 15 golf tee's typically seen at Cracker Barrel where one tee is missing
- and the remaining tees jump each other until ne tee is left. The few tees left the higher the IQ
- score. peg #1 is the top center and bottom row pegs 11 thru 15
- reference picture http://www.joenord.com/puzzles/peggame/
- Task Print a solution to solve the puzzle leaving one peg
- Not implemented variations Start with empty peg in X and solve with one peg in position Y
- Python version 2.7.2
- Draw board triangle in ascii
def DrawBoard(board):
peg = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] for n in xrange(1,16): peg[n] = '.' if(n in board): peg[n] = "%X" % n print " %s" % peg[1] print " %s %s" % (peg[2],peg[3]) print " %s %s %s" % (peg[4],peg[5],peg[6]) print " %s %s %s %s" % (peg[7],peg[8],peg[9],peg[10]) print " %s %s %s %s %s" % (peg[11],peg[12],peg[13],peg[14],peg[15])
- remove peg n from board and return board
def RemovePeg(board,n):
i = board.index(n) del(board[i]) return board
- Add peg n on board and return board
def AddPeg(board,n):
board.append(n) return board
- return true if peg N is on board else false is empty position
def IsPeg(board,n):
return n in board
- A dictionary of valid jump moves index by jumping peg
- then a list of moves where move has jumpOver and LandAt positions
JumpMoves = { 1: [ [2,4],[3,6] ], # 1 can jump over 2 to land on 4, or jumper over 3 to land on 6
2: [ [4,7],[5,9] ], 3: [ [5,8],[6,10] ], 4: [ [2,1],[5,6],[7,11],[8,13] ], 5: [ [8,12],[9,14] ], 6: [ [3,1],[5,4],[9,13],[10,15] ], 7: [ [4,2],[8,9] ], 8: [ [5,3],[9,10] ], 9: [ [5,2],[8,7] ], 10: [ [9,8] ], 11: [ [12,13] ], 12: [ [8,5],[13,14] ], 13: [ [8,4],[9,6],[12,11],[14,15] ], 14: [ [9,5],[13,12] ], 15: [ [10,6],[14,13] ] }
Solution = []
- Recursively solve the problem
def Solve(board):
#DrawBoard(board) if(len(board) == 1): return board # Solved one peg left # try a move for each peg on the board for peg in xrange(1,16): # try in numeric order not board order if(IsPeg(board,peg)): movelist = JumpMoves[peg] for move in movelist: over = move[0] land = move[1] if(IsPeg(board,over) and not IsPeg(board,land)): saveboard = board[:] # for back tracking RemovePeg(board,peg) RemovePeg(board,over) AddPeg(board,land) # board order changes!
Solution.append([peg,over,land])
board = Solve(board) if(len(board) == 1): return board ## undo move and back track when stuck! board = saveboard[:] # back track del(Solution[-1]) # remove last move return board
- Remove one peg and start solving
def InitSolve(empty):
board = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] board= RemovePeg(board,empty_start) Solve(board)
empty_start = 1 InitSolve(empty_start)
board = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] board= RemovePeg(board,empty_start) for move in Solution:
peg = move[0] over = move[1] land = move[2] RemovePeg(board,peg) RemovePeg(board,over) AddPeg(board,land) # board order changes! DrawBoard(board) print "Peg %X jumped over %X to land on %X\n" % (peg,over,land)