昨年夏のプログラミング・シンポジウムは諏訪のかんぽの宿で開催された. その客室にはお茶などと一緒にTパズルが置いてあり, それをいじった泊り客が気に入って宿の売店で購入するのを期待している.
Tパズルは上の図の左の家型の五角形を4分割したなんの変哲もないピースを組み合わせ, 指示されたいろいろな形を構成するパズルである. 最初の指示が図の右のT型を作るので, Tパズルというらしい. 元の家型の時のピースの縦横の辺が, T型では斜めになっているので, この問題は最初からいささか意地が悪い.
インターネットで探すと, 下の図のように様々な問題があるので, ちょっとやってみたくなり, 百円ショップで小学生の使う工作用紙を購入し, 自作した.
自作するには下のような図を描き, 同じ形の表と裏を貼り合せた. この升目が工作用紙の1cmである. 各辺の内側の数値は, T型の足の幅を基本単位とするその辺の長さで, 出来上がったピースにも同様に記入してある. この図では各ピースが繋って描いてあるが, 作業に便利なように, 本当はピースの間に隙間があった.
実際に出来たものは下の写真の通りで, 旅館で販売しているものより遥かに大きい. 市販のものは辺に寸法が書いてなく, いわばアナログ仕様だが, それでは√2と1.5の区別もつき難そうだ. 私のは寸法が記入してあるので間違うことはない.
さて, 私のやり方をちょっと種明かししよう. 上にあった問題の1番のT型と12番の家型を例にする.
型の図をPCに読み込み, 適当に拡大する. 角に順に番号をつける. マウスを動かし, それぞれの角の座標を読み取る. 座標はそれほどの精度を要求しない. それが下の2枚の図だ.
次にこの形を角を頂点とする三角形に分割する. T型では((0 6 7) (0 1 6) (4 5 6) (4 6 1) (4 1 2) (4 2 3)), 家型では((1 2 3) (1 3 4) (1 4 0))とした. そして夫々の型で, 座標と三角形の頂点の組をSchemeのプログラムで読み込む. その値を確認するため, プログラムはSchemeのgraphics機能を利用して出力する. それが次の図である. T型の足など多少怪しいがまぁよしとしよう.
続いてこの座標系において相隣る2点間の距離を計算する. それぞれの点のx, y座標が既知だから, Pythagorasの定理で距離は分る. 更にこの座標系での各々の三角形の面積を求め, 形全体の面積を算出する.
x0,
y0;
x1,
y1;
x2,
y2を頂点とする三角形の面積は, 行列式
|
x0 y0 1|
|
x1 y1 1|
|
x2 y2 1|
の半分であることは高校生のころ, 解析幾何の授業で学んだのでそれを使う. ただ三角形の頂点を時計廻りか反時計廻りかで辿ると面積が正負になり, いつも怪しくなる. そういう時は(0,0) (1,0) (0,1)の三角形で試みると反時計廻りで正になると分るが, プログラムでは絶対値をとってから合計している.
一方, 4個のピースの面積の和は6平方基本単位であるから, 今得られた面積を6で除して平方根をとると, それが座標系の長さと基本単位の比で, それぞれの辺が基本単位に変換できる.
これでT型を計算すると
(2.8999986101772106 .8652158634699881 .9960165420683874 2.935646424994157 1.0222409451321806 .9698622511287074 2.8779826845214163 1.0169988220903106)
が出てきて, 番号0の角からの順の辺の長さが, 3,1,1,3,1,1,3,1であることが分る. (0.865を1にするには勇気がいるが.)
また家型の方は
(1.418992855950106 2.022013340831029 1.993599932770006 1.4095980475184093 2.7873862791620128)
だから, √2, 2,2,√2, 2√2らしいとなる.
ここまで来たら大体の問題はわけもなく解けるが, 実際にやってみると案外微妙な値になる型もあり(1.5か√2かなど), ここに述べた方法が特効薬であるわけでもない. 元々の問題の図もさほど精密ではなく, また中にはこれはどうかと思う問題もあったが, 目くじらを立てることもあるまい.