My solution:
=begin
import Data.List
import Data.Maybe
pieces = "RNBKQBNR"
permutation = []
permutation xs = [x:y | x <- nub xs, y <- permutation $ delete x xs]
restriction position =
r1 < k && k < r2 &&
sum (elemIndices 'B' position) `mod` 2 /= 0
where
r1:r2:_ = elemIndices 'R' position
k = fromJust $ elemIndex 'K' position
results = filter restriction (permutation pieces)
=end
def permutation(pieces)
return [pieces] if pieces.length <= 1
result =
pieces.uniq.each do |p|
_pieces = pieces.dup
_pieces.delete_at(pieces.index(p))
permutation(_pieces).each do |perm|
result << (perm << p)
end
end
result
end
results = permutation("RNBKQBNR".split(//)).select do |position|
r1 = position.index('R')
r2 = position.rindex('R')
b1 = position.index('B')
b2 = position.rindex('B')
k = position.index('K')
r1 < k && k < r2 && ((b1+b2) % 2 != 0)
end
puts "Total positions = #{results.length}"
puts results[rand(results.length)].join(' ')
Very nice, compact solution. But what programing language is that in the block comment? I don't recognize it.
Regards, Morton
···
On Dec 19, 2006, at 11:43 PM, David Tran wrote:
My solution:
=begin
import Data.List
import Data.Maybe
pieces = "RNBKQBNR"
permutation = []
permutation xs = [x:y | x <- nub xs, y <- permutation $ delete x xs]
restriction position =
r1 < k && k < r2 &&
sum (elemIndices 'B' position) `mod` 2 /= 0
where
r1:r2:_ = elemIndices 'R' position
k = fromJust $ elemIndex 'K' position
results = filter restriction (permutation pieces)
=end
def permutation(pieces)
return [pieces] if pieces.length <= 1
result =
pieces.uniq.each do |p|
_pieces = pieces.dup
_pieces.delete_at(pieces.index(p))
permutation(_pieces).each do |perm|
result << (perm << p)
end
end
result
end
results = permutation("RNBKQBNR".split(//)).select do |position|
r1 = position.index('R')
r2 = position.rindex('R')
b1 = position.index('B')
b2 = position.rindex('B')
k = position.index('K')
r1 < k && k < r2 && ((b1+b2) % 2 != 0)
end
puts "Total positions = #{results.length}"
puts results[rand(results.length)].join(' ')