Раздел «Язык Ruby».PythagorTriples:

Задача "Генератор пифагоровых троек"

Вариант 1

Генерирует пифагоровы тройки в лексикографическом порядке (a,b,c).
Тройки удовлетворяют условию a <= b < c.

# Copyright Shevchenko A 674 ))
module Pythagor
   def Pythagor.sequence(count, &block)
        generate do |val1, val2, val3|
          break if count <= 0
          block[val1, val2, val3]
          count-=1
        end
    end
    def Archimed.upto(max, &block)
        generate do |val1, val2, val3|
          break if val1 > max 
          block[val1, val2, val3]
        end
    end
private 
    def Pythagor.generate
       a, b = 1, 1
       loop do
         b = a
         loop do
           if Math.sqrt(a*a+b*b).floor == Math.sqrt(a*a+b*b)
             yield(a, b, Math.sqrt(a*a+b*b).floor)
           end
           b +=1
           break if b>a*a/2
         end
         a+=1
       end
    end
end

Вариант использования

require 'pythagor'
Pythagor.sequence(10) do |a,b,c|  
  printf("%5d %5d %5d\n", a, b, c);
end

Вариант 2

Генерирует пифагоровы тройки в лексикографическом порядке (a,b,c).
Тройки удовлетворяют условию b <= a < c.

module Pythagor
  def Pythagor.sequence(count)
    generate do |a,b,c|
      break if count <= 0
      count -= 1
      yield(a,b,c)
    end
  end

  def Pythagor.generate
    a,b=1,1
    loop do
      c2 = a*a + b*b
      c = Math.sqrt(c2).floor
      if c*c == c2
        yield(a,b,c)
      end
      if b<a 
        b+=1
      else
        a+=1;
        b=1
      end
    end
  end
end

Вариант использования

require 'pythagor'
Pythagor.sequence(30) do |a,b,c|
  printf("%5d %5d %5d\n",a,b,c)
end