http://shinh.skr.jp/m/?date=20080823#p01
>RubyコードをRubyで等価に実行可能な記号だけに変換する プログラムは書けるだろうか。

eval"実行したいコード"
を記号だけで表現すればいんじゃね?
と適当に変換プログラム書いてみた。

def _(_)
	r="''<<"+_.split("").map{|_|
		_=_.ord;
		return "~-_" if _==0
		(["_"]*(_&3)+["__"]*(_>>2&3)+["___"]*(_>>4&3)+["____"]*(_>>6&3))*"+"
	}*"<<"
	"->{_=-~($$-$$);__=_<<_+_;___=_<<__;____=__<<__;%s}[]"%r
end
puts"->&_{_}[&:\"\#{#{_"method"}}\"][$$,:\"\#{#{_"eval"}}\"][#{_([*$<]*"")}]"

標準入力にRubyのコードを渡すとあら不思議。記号だけのRubyコードが。
手持ちのRuby1.9の処理系だと動いたけどなぜ動くのか自分でもいまいち理解していない。
適当に書いたらたぶんうまく動いている気分になった。
ToDo:
エンコーディングが冗長。

v2.018

配列演算びみょー
というか役にたたなすぎ。

a[] = a[] + b[]

も出来ないなんて悲しすぎる。
おいおい配列同士で演算できないなんてゴミやん?
あと

a[] = a[] * 2 + 3

もできないのが悲しい。
何が悲しくて

a[] = (a[] * 2)[] + 3 

とか書かなあかんねん。
とか文句言いながら実行するとAccess Violation。うがー。
まぁ文句書いてるけど、
たぶんこの辺はそのうちサポートされるでしょ。
というかこの辺サポートして効率よく実行してくれるなら割と素で嬉しいよ。
うぉるたー君を信じてあげよう。

国内予選

チーム名はてきとーに去年から即値だけ変えてmain=-277;で
てきとーに参加しててきとーに4問通った。
とりあえずA,B,C,Dといたー。
今年の国内予選はどれも頑張れば解けそうに思えた(E,Fはまだ深く考えてないけど)。

  • A

とりあえず2重ループで普通にゴリゴリと。

  • B

なんか変な素数に対するエラトステネスの篩を書いて通した。
実は書くのに手間取ってる内にCのほうが楽そうな気がしてCを先に解いた。

  • C

適当にパースして実行するだけ。
適当に構文木をnewしまくって(deleteはめんどいからしなかった),構文木にevalしまくって解いた。

  • D

よくある最短経路を求めるグラフ問題。
問題文を思いっきり勘違いして迷路の命令をゴールにたどり着くように書き換える問題と思ってた。
チームの一人が勘違いしてるのを教えてくれたので、さくっとただのグラフの最短経路問題に落とす。
とりあえずx,y,方向で各頂点を生成して最短経路求めるまではすぐできた。
最初適当にウォーシャル-フロイトで書いたら遅すぎて涙目に。
やっぱり9重ループ(x,y,方向のループが3つ)って駄目か。
ダイクストラに置き換えするのに時間を無駄に食う。
*1

*1:今気づいたけど最適化オプション付けずに書いてた。最適化するとウォーシャル-フロイトつかっても通るのかな?

template thisはどうやるんだろう

D言語で急にコンストラクタをテンプレート関数にしたくなったんだけど、
どうすりゃいいんだろう?

class Test{this(T)(T value){...}}

上のような書き方だとコンパイル通らないし。
とりあえずstd.boxer.Boxのclassを使ったような感じの実装しようとして悩み中。
別にコンストラクタで初期化できなくても、
static opCallを使えば十分見た目は良いんだけどすっきりとしない...
だれか偉い人、いい案あったら教えて!

わーいD2.013
D言語君の__FILE__と__LINE__は大分話が分かるやつになったらしい。

void check(T)(lazy T v,string file=__FILE__,int line = __LINE__){
    if(!v)printf("Error: AssertError Failure %.*s(%d)\n",file,line);
}
void main(){
    check(0);
    check(0.0);
    check(null);
    assert(0);
}

これが気持ち的には正しい動作するようになるのはうれしいなぁっと。
opDotと__threadは面白いような気がしつつ使い道がまだ思いつかないや...