# -*- coding: utf-8 -*- # http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2039 # # a, b, cは直角三角形の辺長さであるため a < b < c とする. # p = a + b + c # が1000以内になる直角三角形の辺の組み合わせを求めて # p をキーにカウントし,最大数のpを表示する. N = 1000 # a < b < c より aは 1 .. N / 3 puts (1 ... N / 3).map {|a| # a < b < c より bは a + 1 ... (N - a) / 2 (a + 1 ... (N - a) / 2).map {|b| # a ** 2 + b ** 2 == c ** 2 より c = Math.sqrt(a ** 2 + b ** 2) p = a + b + c.to_i (c == c.to_i && p <= N) ? p : nil } }.flatten.reject{|v| v.nil? }.reduce({}){|h, p| h[p] = h[p] ? h[p] + 1 : 1 h }.map{|v| [v[1], v[0]]}.max.pop