Begin forwarded message:

> From: James Cunningham <james / notbadafterall.com>
> Date: December 19, 2006 5:58:49 PM CST
> To: submission / rubyquiz.com
> Subject: Please Forward: Ruby Quiz Submission (106)
>
> My solution to quiz 106 follows. It's quite a lot longer than I  
> anticipated, but I hope it's reasonably clear as a result.
>
> best,
> James Cunningham
>
>
> #!/usr/bin/env ruby
>
> require 'set'
>
> def combinations sequence, n, unique=false
>   return [] if n == 0
>   return sequence if n == 1
>   result = []
>
>   (0...sequence.length).collect.each do |i|
>     sub_sequence = sequence[(i + 1)..-1]
>     sub_sequence += sequence[0..i] if unique
>
>     combinations(sequence[(i + 1)..-1], n - 1).each do |smaller|
>       result << ([sequence[i]] + [smaller]).flatten
>     end
>   end
>
>   result
> end
>
> def chess_positions i=961
>   def remaining subset
>     (Set.new(0..7) - Set.new(subset)).collect
>   end
>
>   positions, n = [], 1
>
>   combinations((0..7).collect, 3).each do |rooks_king|
>     combinations(remaining(rooks_king), 2).each do |bishops|
>       next if (bishops[0] + bishops[1]) % 2 == 0
>
>       position = rooks_king + bishops
>       remaining(position).each do |queen|
>         non_knights = position + [queen]
>         positions << non_knights + remaining(non_knights)
>
>         return positions[-1] if n == i
>         n += 1
>       end
>     end
>   end
>   return positions
> end
>
> def pretty_position position
>   pieces, pos_hash = ['R', 'K', 'R', 'B', 'B', 'Q', 'N', 'N'], {}
>   0.upto(7) {|i| pos_hash[(position[i] + 97).chr] = pieces[i]}
>
>   sorted_keys = pos_hash.keys.sort
>   sorted_vals = (0..7).collect.map {|i| pos_hash[sorted_keys[i]]}
>
>   pretty_pos = "White:\n"
>   sorted_keys.each {|key| pretty_pos += "#{key} "}
>   pretty_pos += "\n"
>   sorted_vals.each {|val| pretty_pos += "#{val} "}
>
>   pretty_pos
> end
>
> puts pretty_position(chess_positions(48))
>