レイトレ 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という汎用的ではないメソッドを作ってしまったわけだが、まあこれくらいはいいでしょう。