Euler Project, problem 59
I simply tried each key, looking for one that produced
a plaintext in which 90% of the characters were letters
or spaces.
bytes = IO.read('cipher1.txt').scan(/\d+/).map{|s| s.to_i }
('aaa'..'zzz').each do |key|
key_bytes = key.split('').map{|s| s[0]}
key_bytes *= (bytes.size + 2) / key_bytes.size
plain_bytes = bytes.zip( key_bytes ).map{|a,b| a ^ b }
if plain_bytes.min >= 32 and plain_bytes.max < 127
text = plain_bytes.map{|n| n.chr}.join
if text.gsub(/[^a-z ]/i, "").size > bytes.size * 0.9
puts text
puts key
puts plain_bytes.inject{|sum,n| sum + n }
end
end
end