見出し画像

「情報関係基礎」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 の表記になるので,その書き換えは必要。そこで引っかかっている者もいた。 

画像1