Knight's tour: Difference between revisions
Content added Content deleted
(→{{header|Elm}}: More archetypal Elm) |
(Added Wren) |
||
Line 7,160: | Line 7,160: | ||
-> c3 |
-> c3 |
||
This is an open tour |
This is an open tour |
||
</pre> |
|||
=={{header|Wren}}== |
|||
{{trans|Kotlin}} |
|||
<lang ecmascript>class Square { |
|||
construct new(x, y) { |
|||
_x = x |
|||
_y = y |
|||
} |
|||
x { _x } |
|||
y { _y } |
|||
==(other) { _x == other.x && _y == other.y } |
|||
} |
|||
var board = List.filled(8 * 8, null) |
|||
for (i in 0...board.count) board[i] = Square.new((i/8).floor + 1, i%8 + 1) |
|||
var axisMoves = [1, 2, -1, -2] |
|||
var allPairs = Fn.new { |a| |
|||
var pairs = [] |
|||
for (i in a) { |
|||
for (j in a) pairs.add([i, j]) |
|||
} |
|||
return pairs |
|||
} |
|||
var knightMoves = Fn.new { |s| |
|||
var moves = allPairs.call(axisMoves).where { |p| p[0].abs != p[1].abs } |
|||
var onBoard = Fn.new { |s| board.any { |i| i == s } } |
|||
return moves.map { |p| Square.new(s.x + p[0], s.y + p[1]) }.where(onBoard) |
|||
} |
|||
var knightTour // recursive |
|||
knightTour = Fn.new { |moves| |
|||
var findMoves = Fn.new { |s| |
|||
return knightMoves.call(s).where { |m| !moves.any { |m2| m2 == m } }.toList |
|||
} |
|||
var fm = findMoves.call(moves[-1]) |
|||
if (fm.isEmpty) return moves |
|||
var lowest = findMoves.call(fm[0]).count |
|||
var lowestIndex = 0 |
|||
for (i in 1...fm.count) { |
|||
var count = findMoves.call(fm[i]).count |
|||
if (count < lowest) { |
|||
lowest = count |
|||
lowestIndex = i |
|||
} |
|||
} |
|||
var newSquare = fm[lowestIndex] |
|||
return knightTour.call(moves + [newSquare]) |
|||
} |
|||
var knightTourFrom = Fn.new { |start| knightTour.call([start]) } |
|||
var col = 0 |
|||
for (p in knightTourFrom.call(Square.new(1, 1))) { |
|||
System.write("%(p.x),%(p.y)") |
|||
System.write((col == 7) ? "\n" : " ") |
|||
col = (col + 1) % 8 |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
1,1 2,3 3,1 1,2 2,4 1,6 2,8 4,7 |
|||
6,8 8,7 7,5 8,3 7,1 5,2 7,3 8,1 |
|||
6,2 4,1 2,2 1,4 2,6 1,8 3,7 5,8 |
|||
7,7 8,5 6,6 7,8 8,6 7,4 8,2 6,1 |
|||
4,2 2,1 3,3 5,4 3,5 4,3 5,1 6,3 |
|||
8,4 7,2 6,4 5,6 4,8 2,7 1,5 3,6 |
|||
1,7 3,8 5,7 4,5 5,3 6,5 4,4 3,2 |
|||
1,3 2,5 4,6 3,4 5,5 6,7 8,8 7,6 |
|||
</pre> |
</pre> |
||