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