トップ «前の日記(2010-12-31) 最新 次の日記(2011-01-03)» 編集

はじめてのにき

ここの位置付け

2004|11|
2005|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|

ToDo:


2011-01-01

_ 末尾再帰とか

http://blog.goo.ne.jp/no_orz_no_life/e/e7110098e80d89e28082065d32e9dd6b

の fact とか sum を見てて、 あらなんで3つ式あるのかなーと一瞬思ったんだけど、 まあたぶん末尾再帰の最適化かけたいという話だと思う。

で、そういえば GCC はどのくらい無茶なものを 末尾再帰にしてくれるのかなーとか思って色々やってみたら、 どうもすごく単純な足し算掛け算くらいしかできないぽかった。

まぁそんなもんかーと GCC を見ると、

     if (act->add && !a_acc)
       a_acc = create_tailcall_accumulator ("add_acc", first,
                                            integer_zero_node);
     if (act->mult && !m_acc)
       m_acc = create_tailcall_accumulator ("mult_acc", first,
                                            integer_one_node);

とかあって、やはり足し算と掛け算だけ特殊処理されてるのかな、 って感じだった。

関数型言語系だと、末尾が cons だった場合なんかにも、 似たような処理をしてやれば ずいぶんと色々とラクになるんじゃないかなぁとか思った。

あと、足し算掛け算以外を色々考えてる間に書いた、

def factdiv(n)
  if n==1
    1.0
  else
    n/factdiv(n-1)
  end
end

というような関数は、 つまり (2*4*8*...)/(1*3*5*...) という感じの値を返すわけだけど、 この値は 1.25 sqrt(N) くらいの数字になるみたいだった。 正確には (1*3*5*7*...)/(2*4*6*...) になってる時は 0.8 sqrt(N) くらいになってるので、この二つを繰り返すというか。

さてこれってなんか今まで見たことあるっけ… どうも見たことない気がするんだけど、 なんか有名な法則とかがありそうではある。

(23:39)

_ 年越し

年越す時に書いてたコードは spoj のゴルフだと思う。 たぶん kamil 。 spoj のゴルフはなんかよくわからんくらい短いものが結構あって、 なんか答え埋め込みとかになってるやつもあるのかなぁ。

年明けてからは BF_PRIME で、正月早々 Brainfuck ってのもどうなんですかね… しかもどうも勝てる気配があまりなくてですね…

kinaba さんの書いておられた、 なんかに特化した言語作るってのはいいかもなぁと思ったので、 Brainfuck の短いコードを出力するプログラムに特化した言語というのはどうか…

去年は今一つ、色んなことに慣れすぎてて特に何も無かったなぁ…という感じがした。 そいうことを思いながらはてなとか見てみた。

  • 年始の WebKit についての紹介は妙に頑張ってるなあ
  • コードを愛でる話はまぁそれなりに色々まとめたなぁ
  • 一方 TCC の話はひどいなぁ
  • TLE/ICFPC は残念な感じだったなぁ

とかあったんですが、このへんは知ってることまとめたりとかそういうのばっかで、 今一つ新鮮なことではなくて。

というわけで自分的に一番重要だったことは wake は今年作ったんだなぁということな気がする。

あとまぁ後半は Starcraft2 やってたなぁとしか言えないんじゃないかね。

(23:57)

本日のツッコミ(全3件) [ツッコミを入れる]
_ nineties (2014-05-24 03:41)

factdiv(N)/sqrt(N)はNが偶数だとsqrt(PI/2) = 1.253..にNが奇数だとsqrt(2/PI) = 0.797..に収束します。ウォリスの公式と言います。

_ kinaba (2014-05-24 03:41)

足し算掛け算は a+(b+c) (普通の再帰)を (a+b)+c (末尾再帰)に変えて問題ないけど、cons は cons(a,cons(b,c)) は cons(cons(a,b),c) にすると意味というか型が違ってしまうのでしんどい面も。破壊的なappendができる言語ならそれに変えればなんとかなるかもですが

_ shinh (2014-05-24 03:41)

> ウォリスの公式

おおおありがとうございます。こいうのがあるんですね。例のごとく三角関数やら円周率が登場するわけですね…

> cons

あーはい、なんとなく append に変えちゃうイメージで考えてました。たぶん f に対して f(a,f(b,c))==g(g(a,b),c) を満たす g があればいいって話ですよね。引き算とかなら(需要はないだろうけど) f(a,b)=a-b に対して g(a,b)=-a+b みたいな。

除算とか考えたのも非対称なヤツについて考えてみないとなーという感じで考えたのでした。

お名前:
E-mail:
コメント:
人生、宇宙、すべての答え
本日のリンク元

2011年
1月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
1.kosaki(2014-05-24 03:41) 2.shinh(2014-05-24 03:41) 3.ukzk(2014-05-24 03:41)
search / home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h