K.Sasada's Home Page

こめんとのついか

こめんとこめんと!

message

please add long comment :).

_14(Wed)

んー、どうやったら mod 6 な条件を試せるのかな。ちっちゃい順にするには、結局三乗和を求めなければならないし。

まずいー、ゼミの準備が全然できてないー。Ramanujan を解いてましたー(というか、解法をRubyとschemeに落としてました)って書くのもアレだしな。一応OS研究室だし。

SPECInt のアプリケーションの名前の 164.gzip とかの、164 っていう数字はいったい何を表しているんだろう。うーむ。

なんというか、さぼっていた分のいろいろな用事が襲ってくるー。

[ruby-talk:71386]、おお、まつもとさんの説明綺麗だ・・・。

しかし、ruby-talk って、なんでSubjectに通し番号とかのヘッダが付かないんだろう。


あのHaskellのコード を大体そのまま ruby におとしました。

def f x
  x[0]**3+x[1]**3
end

def fsort k
  r = [[k,k]]
  j = k
  prc = lambda{
    j+=1
    [[k,j],prc]
  }
  
  r.push lambda{
    fmerge(prc,fsort(k+1))
  }
end

def fmerge xs,ys
  if xs.kind_of? Proc
    x,xs = xs.call
  else
    x,xs = xs
  end

  if ys.kind_of? Proc
    y,ys = ys.call
  else
    y,ys = ys
  end
  if f(x) <= f(y)
    [x,lambda{fmerge xs,[y,ys]}]
  else
    [y,lambda{fmerge [x,xs],ys}]
  end
end


def ramanujan r
  b,r = r
  r = r.call
  found = 0
  while found < 100
    a,r = r
    #p a
    r = r.call
    if f(a) == f(b)
      p "#{a.inspect},#{b.inspect}"
      found += 1
    end
    b = a
  end
end

ramanujan fsort 1

さすがに長くなるなぁ・・・。というか、何やってんだ、俺。

def f x; x[0]**3+x[1]**3 ; end
def inc1(k)
  j = k
  prc = lambda{k+=1;[[k,j],prc]}
end
def fsort k
  [[k,k],lambda{fmerge(inc1(k),fsort(k+1))}]
end

def fmerge xs,ys
  x,xs = (Proc === xs) ? xs.call : xs
  y,ys = (Proc === ys) ? ys.call : ys
  f(x) <= f(y) ? 
    [x,lambda{fmerge xs,[y,ys]}] :
    [y,lambda{fmerge [x,xs],ys}]
end

def ramanujan r
  b,r = r
  r = r.call
  found = 0
  while found < 100
    a,r = r
    r = r.call
    if f(a) == f(b)
      p "#{a.inspect},#{b.inspect}"
      found += 1
    end
    b = a
  end
end

ramanujan fsort 1

なんというか、無理やり短くしてみる。

ramanujan 自体の短縮はめんどうになったんでヤメ。zip 書くとしたらどうなるかな・・・。


調子に乗ってみる。Ruby で Haskell っぽく。

def inflist x,&b ; lambda{[x,inflist(b.call(x),&b)]}   ;end
def car(lst)     ; car,cdr = (Proc === lst) ? lst.call : lst ; car ; end
def cdr(lst)     ; car,cdr = (Proc === lst) ? lst.call : lst ; cdr ; end
def zip(xs,ys)   ;[[car(xs),car(ys)],lambda{zip cdr(xs),cdr(ys)}]  ; end

def take n,lst
  r = []
  n.times{
    r  << car(lst);lst = cdr(lst)
  } ; r
end

def filter lst
  cond = yield(car lst)
  while !cond
    lst = cdr lst
    cond = yield(car lst)
  end
  [car(lst),lambda{filter cdr(lst),&proc}]
end

# take 10 zip([2..],[3,2..])
p take(10,zip inflist(2){|x|x+1},inflist(3){|x|x-1})
# take 10 [x| x<-[0..], x % 2 == 0]
p take(10,filter(inflist(0){|x| x+1}){|x| x % 2 == 0})

ramanujan のアレを、こいつで解いてみる。


def inflist x,&b ; lambda{[x,inflist(b.call(x),&b)]}   ;end
def car(lst)     ; car,cdr = (Proc === lst) ? lst.call : lst ; car ; end
def cdr(lst)     ; car,cdr = (Proc === lst) ? lst.call : lst ; cdr ; end
def zip(xs,ys)   ;[[car(xs),car(ys)],lambda{zip cdr(xs),cdr(ys)}]  ; end

def take n,lst
  r = []
  n.times{
    r  << car(lst);lst = cdr(lst)
  } ; r
end

def filter lst
  cond = yield(car lst)
  while !cond
    lst = cdr lst
    cond = yield(car lst)
  end
  [car(lst),lambda{filter cdr(lst),&proc}]
end

# take 10 zip([2..],[3,2..])
#p take(10,zip inflist(2){|x|x+1},inflist(3){|x|x-1})
# take 10 [x| x<-[0..], x % 2 == 0]
#p take(10,filter(inflist(0){|x| x+1}){|x| x % 2 == 0})

def f x; x[0]**3+x[1]**3 ; end
def fsort k
  [[k,k],lambda{fmerge(inflist([k,k+1]){|x| [k,x[1]+1]},fsort(k+1))}]
end

def fmerge xs,ys
  x = car(xs); xs = cdr(xs)
  y = car(ys); ys = cdr(ys)
  f(x) <= f(y) ? 
    [x,lambda{fmerge xs,[y,ys]}] :
    [y,lambda{fmerge [x,xs],ys}]
end

#p take 20,zip(fsort(1),cdr(fsort(1)))
p take 10,filter(zip(fsort(1),cdr(fsort(1)))){|x|  f(x[0]) == f(x[1]) }

おわりませーん。誰か、いいマシンを持っている人試してください(笑)。


単純な勘違いかと思っていたら、なんか根がふかそう?

def f x
end
def m x
  b = proc
  f yield,&b
end

prc = m(3){|x|
  p 'test1'
}

これは通らない。1.6.8 だと segv する。上でも、エラーが出る?

確認しようとしても、コンパイルにはautoconf のバージョンアップが必要らしい。めんどいなぁ。コンパイル済みのをもってくるか。

def f x
  yield
end
def m x,&b
  f(b.call,&b)
end

prc = m(3){|x|
  p 'test1'
}

これで回避。しかし、なんで?

追試。

def f x
  yield
end
def m x
  f(proc.call,
    &proc)     # 7行目
end

prc = m(3){|x|
  p 'test1'
}

#=> Exception `ArgumentError' at c:/ko1/src/rb/t.rb:7 
      - tried to create Proc object without a block

うーん、なんか知らない概念があるんだろうか。

[ruby-dev:12311] までの議論ってことなんだろうか? 最新版入れて試そうっと。

_kjana(Wed May 14 14:40:20 JST 2003)

 付けないでという要望が多かったから。海外ではそれがふつうらしい。

_kjana(Wed May 14 14:41:36 JST 2003)

 さらに comp.lang.ruby とのゲートウエイもあるってことで。

_maya(Wed May 14 16:35:28 JST 2003)

 背景は分かりませんが、fmlでは付けないのが推奨されてますね。自分は付ける設定してますけど:-p

_ささだ(Wed May 14 18:38:49 JST 2003)

 なるほど、価値観の違い、なのかなぁ。NetNews は使ったことがないのでよくわかりませんが。

_はら(Wed May 14 21:59:28 JST 2003)

 おお、ruby-math へどうぞ。

_ささだ(Wed May 14 23:24:32 JST 2003)

 明日、学校に行ったら投稿してみます。


好きなだけ長いコメントをどうぞ。

お名前


back

tton 記述が使えます。YukiWikiな記述してりゃ問題ありません。

「行頭に#code」 と、「行頭に#end」 で挟むと、その間の行は pre で囲まれます。プログラムのソースを書くときに使ってください。

例:

#code

(なんかプログラム書く)

#end

リンクは

[[なまえ|http://www.example.org]]

とか

[[http://www.example.org]]

で貼れます。

$Date: 2003/04/28 10:27:51 $