[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Fwd: Please Forward: Ruby Quiz Submission (106

James Gray

12/20/2006 12:04:00 AM

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))
>