Knight's tour: Difference between revisions

Added Wren
(→‎{{header|Elm}}: More archetypal Elm)
(Added Wren)
Line 7,160:
-> c3
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>
 
9,476

edits