レイトレ at 2D
そもそも書けません。どういうプログラムにすればいいのかが一切分かりません。
ということで、id:letter氏は手続き型でも関数型でもいいので、1次元のプログラム言語で書いて教えてくれるべきだと思う。足し算とか掛け算のようなBasicな回路についてはこっちで補完するので(っていうか足し算掛け算はすでに実装済み)、メインのアルゴリズムを書いてください。
ところで、足し算と掛け算の実装ですが、こんな風に完全テスト済みです。時代はテストファーストです。
my @rtexp; push @rtexp,Acme::ICFP2006::2D::Exp->toRTExp("None"); push @rtexp,Acme::ICFP2006::2D::Exp->toRTExp("Medium"); push @rtexp,Acme::ICFP2006::2D::Exp->toRTExp("All"); #mult checking for my $a(@rtexp){ for my $b(@rtexp){ my $ans = $f->{modules}->{mult}->call($a, $b, {TRACE_DEPTH => 0}); printf("%s * %s = %s\n", $a->toRTValue, $b->toRTValue, $ans->toRTValue); } } #plus checking for my $a(@rtexp){ for my $b(@rtexp){ my $ans = $f->{modules}->{plus}->call($a, $b, {TRACE_DEPTH => 0}); printf("%s + %s = %s\n", $a->toRTValue, $b->toRTValue, $ans->toRTValue); } }
で、出力は以下の通り。
None * None = None None * Medium = None None * All = None Medium * None = None Medium * Medium = Medium Medium * All = Medium All * None = None All * Medium = Medium All * All = All None + None = None None + Medium = Medium None + All = All Medium + None = Medium Medium + Medium = All Medium + All = All All + None = All All + Medium = All All + All = All
無駄にtoRTExpとtoRTValueという汎用的ではないメソッドを作ってしまったわけだが、まあこれくらいはいいでしょう。