moochan です.

On Fri, 12 Mar 1999 10:53:33 +0900
Takashi Nakai <nakai / m1.sys.to.casio.co.jp> wrote:

>あと、こちらも個人的な好みなんですが、添付ファイルよりも
>本文中にあったほうが読みやすいので好きです。

あ.すみません.メーラ種別への配慮が足らなかったですね(^^;;;

と言うわけで,新たにメソッドを2点追加し,Intervalクラスの最新版
を本文へ流し込みます.

# あと若干,細かい調整も行いました.
# うわ〜.段々でかくなるなあ(^^;
-------------------------------------------------------------
・Intervalクラスの生成: Interval.new(s,e,step)
    s   : 始項
    e   : 終項(適当な値)
    step: ステップ(step>1,default:1)
・始値,終値,ステップの再設定: reset(s,e,step)
    引数はnewと同じ
・始項を得る: beginning()
・真の終項を得る: ending()
    一般に,ending() != e
・ステップを得る: step()
・ステップの再設定: step=(step)
    step: ステップ(step>1,default:1)
・任意項を得る: clause(n) or [](n)
    n: 添え字(n>0)
・次の項を得る: next()
・前の項を得る: prev()
・濃度を得る: size()
・距離を得る: length()
・最小項を得る: min()
・最大項を得る: max()
・全項を配列で得る: set()
・全項の総和を得る: sum()
・全項の平均値を得る: average()
・全項のイテレタを得る: each()
・全項の逆順配列を得る: reverse()
・素数だけの配列を得る: prime
(追加分)
・与えられたオブジェクトが包含されているか調べる: include?(c)
    c: 単項,または,Intervalのサブセット(Array)
    result: true:包含,false:非包含
・サブセットを得る: subset(s,n)
    s: 始項
    n: 個数
    result: Array のサブセット or nil
-------------------------------------------------------------
#!/usr/local/bin/ruby

class Interval
  def initialize(s,e,step=1)
    reset(s,e,step)
  end
  def reset(s,e,step=1)
    @begin, @end, @step = s, e, step
    @index = 0
    @direction =  1
    @direction = -1 if @begin > @end
    check_of_step
  end
  def check_of_step
    raise "Interval step value isn't positive." if @step <= 0
    raise "Interval step is too big." if (@end - @begin).abs < @step
  end
  private :check_of_step
  def beginning() return @begin end
  def ending() return @end end
  def step() return @step end
  def step=(step) @step = step; check_of_step end
  def clause(n)
    if n > 0
      @index = n
      ans = @begin + @direction * @step * (n - 1)
      return ans if @direction ==  1 and @begin <= ans and ans <= @end
      return ans if @direction == -1 and @begin >= ans and ans >= @end
    end
    raise "Error in bounds."
  end
  def [](n) clause(n) end
  def next() return clause(index + 1) end
  def prev() return clause(index - 1) end
  def index() return @index end
  private :index
  def size() return (@end - @begin).abs / @step + 1 end
  def length() return max - min end
  def min() return @begin if @direction ==  1; return clause(size) end
  def max() return @begin if @direction == -1; return clause(size) end
  def set
    ary = []
    for n in 1..size
      ary.push(clause(n))
    end
    return ary
  end
  def sum() return (min + max) * size / 2 end
  def average() return sum / size end
  def each
    for n in 1..size
      yield clause(n)
    end
  end
  def reverse() return set.reverse!  end
  def maximum(a,b) return a if a > b; return b end
  private :maximum
  def prime
    ary = [2]
    for i in 3..Math.sqrt(maximum(max.abs,min.abs))
      for j in ary
        if j > Math.sqrt(i)
          ary.push(i)
          break
        else
          break if i % j == 0
        end
      end
    end
    new = []
    for n in set
      m = n.abs
      next if m == 0 or m == 1
      flag = 0
      for j in ary
        if m == j
          flag = 0
          break
        end
        if m % j == 0
          flag = 1
          break
        end
      end
      new.push(n) if flag == 0
    end
    return new
  end
  def include?(c)
    case c
    when Numeric
      for i in 1..size
        return true if c == clause(i)
      end
      return false
    when Array
      return true if c == subset(c[0],c.size)
      return false
    end
    raise "Bad class type was described."
  end
  def subset(s,n)
    return nil if include?(s) == false
    return nil if include?(clause(index + n - 1)) == false
    return Interval.new(s,clause(index),step).set
  end
end
-------------------------------------------------------------
---
moochan