#!/usr/bin/ruby

#
## http://rosettacode.org/wiki/Sum_and_Product_Puzzle
#

func grep_unique(a, by) { a.group_by{ .(by) }.values.grep{.len == 1}.map{_[0]} }
func sums       (n)     { 2 .. n//2 -> map {|i| [i, n-i] } }

var all_pairs = (2..97 -> map {|i| ([i] ~X (i+1 .. 98))... })

var p_unique = Hash()
p_unique{grep_unique(all_pairs, :prod).map { .join(' ') }...} = ()

var s_pairs     = all_pairs.grep {|p| sums(p.sum).all { !p_unique.contains(.join(' ')) } }
var p_pairs     = grep_unique(s_pairs, :prod)
var final_pairs = grep_unique(p_pairs, :sum)

final_pairs.each { |p| printf("X = %d, Y = %d\n", p...) }

assert_eq(final_pairs, [[4, 13]])