「情報関係基礎」2017年の三角形の個数をJavaScriptで書く
問題は,次の,Python で書いた note を参照されたい。
この,Python で書いたものをJavaScript に移植した。
まず,教員が準備しておく部分
var i,j;
Onseg=[ // 頂点1から順に,その頂点を通る線分の名前を書く
["A","B"], // 1
["A","C"], // 2
["B","E"], // 3
["C","E"], // 4
["A","D"], // 5
["D","E"], // 6
["A","E","F"], // 7
["B","C","D","F"] // 8
];
var tyotensu = Onseg.length; // 点の個数
// Siten,Syuten,Senbun を用意し,Henを作成する
var Siten = new Array(tyotensu * tyotensu);
var Syuten = new Array(tyotensu * tyotensu);
var Senbun = new Array(tyotensu * tyotensu);
Hen = new Array(tyotensu);
for (i = 0; i < tyotensu; i++){
Hen[i] = new Array(tyotensu).fill("-");
}
for (i =0; i <tyotensu; i++){
for (j =0; j <tyotensu; j++){
if( i < j){
for (var p=0; p < Onseg[i].length; p++){
if (Onseg[j].indexOf(Onseg[i][p]) > -1){
Hen[i][j] = Onseg[i][p];
}
}
}
}
}
Onseg[j] の中に Onseg[i][p] があるかどうかを調べるのに,Pythonでは
if Onseg[j].count(Onseg[i][p]>0
を使った。CindyScript なら
if(contains(Onseg_j,Onseg_i_p)
Python では count メソッド,CindyScript では contains 関数を使っている。
JavaScript では,上のコードのように,IndexOf メソッドを使っている。
2次元配列 Hen を作る方法や,この,配列中にある要素が含まれる方法は,JavaScriptの入門書には書かれていないもしれない。
次の図3,図5のプログラムは Python とほとんど同じ。
配列のインデックスが0から始まるので hensosu = -1 とする。
// --- 図3 ----
hensosu = -1;
for ( i = 0; i < tyotensu-1; i++){
for (j =i+1; j < tyotensu; j++){
if (Hen[i][j] != "-"){
hensosu = hensosu + 1;
Siten[hensosu] = i;
Syuten[hensosu] = j;
Senbun[hensosu] = Hen[i][j];
}
}
}
// document.write(hensosu);
// document.write(Senbun);書式の違い以外はほとんど同じなので移植は楽だった。
三角形の図は描けないが,コードだけなら簡単,という例。
// ----- 図5 -----
kotae = 0;
var x , y;
for (x = 0; x< hensosu - 1; x++){
y = x + 1;
while (Siten[x] == Siten[y]){
if (Senbun[x] != Senbun[y] && Hen[Syuten[x]][Syuten[y]] != "-"){
kotae = kotae + 1;
}
y = y + 1;
}
}
document.write("三角形の個数は" + kotae + "個である")ただし,授業で扱ったときは,なかなか完成できなかった。授業ではCindyScriptを使い,上のJavaScript のものとほとんど同じ記法なのだが,まず,元の問題がちゃんとできるかということと,正解を渡しても,それを参照してコード化できるかということ,これが結構大きかった。センター試験なので,マーク式。ということは,正解はマークの番号だ。空欄にマークの番号を書いても動かない(あたりまえ)対応するコードをちゃんと書けるかどうか。
なお,While は終了条件を誤ると無限ループに陥るので,授業のテキストでは repeat の繰り返し(for 文と同等)に直したものを使った。とはいえ,空欄は元の問題と同じで,ほかは書いてあるので考えるところはそこだけなのだが。
図5は,問題の図を再掲しておこう。上のコードと見比べて,どこが空欄の答えかを見てもらえば,上に書いたことの意味がわかるだろう。特に,セ,ソ,タの箇所である。ここで,配列は Hen[x][y] の表記,CindyScript のリストは Hen_x_y の表記になるので,その書き換えは必要。そこで引っかかっている者もいた。

