Solve triangle solitaire puzzle: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (Thundergnat moved page I.Q. Puzzle to Solve triangle solitare puzzle: More tightly focused descriptive name) |
(Added Wren) |
||
Line 2,739: | Line 2,739: | ||
Unable to find a solution with last peg left at 13. |
Unable to find a solution with last peg left at 13. |
||
Computation time: 1656.2754 ms. |
Computation time: 1656.2754 ms. |
||
</pre> |
|||
=={{header|Wren}}== |
|||
{{trans|Kotlin}} |
|||
{{libheader|Wren-fmt}} |
|||
<lang ecmascript>import "/fmt" for Conv, Fmt |
|||
var board = List.filled(16, true) |
|||
board[0] = false |
|||
var jumpMoves = [ |
|||
[ ], |
|||
[ [ 2, 4], [ 3, 6] ], |
|||
[ [ 4, 7], [ 5, 9] ], |
|||
[ [ 5, 8], [ 6, 10] ], |
|||
[ [ 2, 1], [ 5, 6], [ 7, 11], [ 8, 13] ], |
|||
[ [ 8, 12], [ 9, 14] ], |
|||
[ [ 3, 1], [ 5, 4], [ 9, 13], [10, 15] ], |
|||
[ [ 4, 2], [ 8, 9] ], |
|||
[ [ 5, 3], [ 9, 10] ], |
|||
[ [ 5, 2], [ 8, 7] ], |
|||
[ [ 9, 8] ], |
|||
[ [12, 13] ], |
|||
[ [ 8, 5], [13, 14] ], |
|||
[ [ 8, 4], [ 9, 6], [12, 11], [14, 15] ], |
|||
[ [ 9, 5], [13, 12] ], |
|||
[ [10, 6], [14, 13] ] |
|||
] |
|||
var solutions = [] |
|||
var drawBoard = Fn.new { |
|||
var pegs = List.filled(16, "-") |
|||
for (i in 1..15) if (board[i]) pegs[i] = Conv.Itoa(i, 16) |
|||
Fmt.print(" $s", pegs[1]) |
|||
Fmt.print(" $s $s", pegs[2], pegs[3]) |
|||
Fmt.print(" $s $s $s", pegs[4], pegs[5], pegs[6]) |
|||
Fmt.print(" $s $s $s $s", pegs[7], pegs[8], pegs[9], pegs[10]) |
|||
Fmt.print(" $s $s $s $s $s", pegs[11], pegs[12], pegs[13], pegs[14], pegs[15]) |
|||
} |
|||
var solved = Fn.new { board.count { |peg| peg } == 1 } // just one peg left |
|||
var solve // recursive so need to pre-declare |
|||
solve = Fn.new { |
|||
if (solved.call()) return |
|||
for (peg in 1..15) { |
|||
if (board[peg]) { |
|||
for (ol in jumpMoves[peg]) { |
|||
var over = ol[0] |
|||
var land = ol[1] |
|||
if (board[over] && !board[land]) { |
|||
var saveBoard = board.toList |
|||
board[peg] = false |
|||
board[over] = false |
|||
board[land] = true |
|||
solutions.add([peg, over, land]) |
|||
solve.call() |
|||
if (solved.call()) return // otherwise back-track |
|||
board = saveBoard |
|||
solutions.removeAt(-1) |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
var emptyStart = 1 |
|||
board[emptyStart] = false |
|||
solve.call() |
|||
board = List.filled(16, true) |
|||
board[0] = false |
|||
board[emptyStart] = false |
|||
drawBoard.call() |
|||
Fmt.print("Starting with peg $X removed\n", emptyStart) |
|||
for (sol in solutions) { |
|||
var peg = sol[0] |
|||
var over = sol[1] |
|||
var land = sol[2] |
|||
board[peg] = false |
|||
board[over] = false |
|||
board[land] = true |
|||
drawBoard.call() |
|||
Fmt.print("Peg $X jumped over $X to land on $X\n", peg, over, land) |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
Same as Kotlin entry. |
|||
</pre> |
</pre> |
||