応用情報技術者試験の過去問&キーワードを動画2443本の動画で解説!スキマ時間に動画!※2017年9月11日現在

PR広告

平成28年度春 応用情報技術者試験 午後問3 プログラミング 設問3 合格率アップ!動画付き解説

問3 ライフゲームに関する次の記述を読んで、設問1~5に答えよ。

ライフゲームとは、数学者コンウェイが考案した、生命の誕生、生存、死滅などを再現したシミュレーションゲームである。

マス目状の盤上の各マスに生命が存在でき、そのマス自身及び隣接するマスの状態によって次世代の誕生、生存、死滅が決まる。

その条件を表1に示す。

平成28年度春 応用情報技術者試験 午後問3 プログラミング 合格率アップ!動画付き解説!

なお、隣接するマスには、斜め方向のマスも含む。

また、生命が存在するマスを"生のマス"、生命が存在しないマスを"死のマス"と呼ぶ。

〔4×4マスのシミュレーション〕

4×4マスの盤上における第3世代までのシミュレーションを図1に示す。

平成28年度春 応用情報技術者試験 午後問3 プログラミング 合格率アップ!動画付き解説!

第1世代は、初期値として設定されたものである。例として、第1世代の2行目1列目のマスを考える。

現在、このマスは死のマスである。このマスに隣接するマスを網掛けで示す。これら五つのマスの中に生のマスが三つある。

これは表1の"誕生"の条件に該当するので、第2世代の2行目1列目のマスは生のマスになる。

同様に、第1世代の各マスについて、そのマス自身及び隣接するマスの状態を確認することで第2世代が決まる。

次の世代への状態の更新は、全てのマスについて同時に行われる。

〔盤上のマスのデータ構造〕

N×Nマスの盤上の状態を表現するデータ構造を考える。

多次元配列が利用できないプログラム言語を考慮し、盤上の各マスの生死状態を管理するデータ構造として1次元配列mを用いる。

配列mのデータ構造のイメージを図2に示す。

平成28年度春 応用情報技術者試験 午後問3 プログラミング 合格率アップ!動画付き解説!

 〔配列mを次世代に更新するプログラム〕

使用する定数、配列及び関数を表2に、配列mを次世代に更新する関数updateを図3に示す。

なお、関数に配列を引数として渡すときの方式は参照渡しである。

平成28年度春 応用情報技術者試験 午後問3 プログラミング 合格率アップ!動画付き解説!

function update(m)
  copy(m, temp) // 配列mを配列tempにコピーして退避する
  clear(m)      // 配列mの全ての要素の値を0にする
  for( iを1からN×Nまで1ずつ増やす )
    if( i-1がNで割り切れる )
	  a ← 0
	  b ← 1
	elseif( iがNで割り切れる )
	  a ← -1
	  b ← 0
	else
	  a ← -1
	  b ← 1
	endif
	
	e ← 0
	for( yを-1から1まで1ずつ増やす )
	  for( xをaからbまで1つずつ増やす )
	    if( (yと0が等しくない) or (xと0が等しくない) )
		  c ← i + y×N + x
		  if( (cが1以上) and (cがN×N以下) )
		    if(  )
			  e ← e + 1
			endif
	      endif
		endif
      endfor
	endfor
	
	// 生死を判断する
	if(  )
	  m[i] ← 1
	elseif( (temp[i]と1が等しい) and ( (eと2が等しい) or (eと3が等しい) ) )
	  
	endif
	
  endfor
endfunction

図3 関数updateのプログラム

〔テストプログラム〕

図3のプログラムをテストするために、配列mに第1世代が与えられたときの第p世代が、机上で作成した正しい結果である配列rと等しいことを確認するプログラムを作成した。

作成した関数shouldBeを図4に示す。ここで、pには2以上の整数が入る。

 1: function shouldBe( m, p, r )
 2:   for( iを1からpまで1ずつ増やす )
 3:     update(m)
 4:   endfor
 5:   for( iを1からN×Nまで1ずつ増やす )
 6:     if( m[i] と r[i] が等しくない )
 7:       return false // テスト失敗
 8:     endif
 9:   endfor
10:   return true      // テスト成功
11: endfunction

図4 関数shouldBeのプログラム

図3のプログラムが正しく動作する状態で図4のプログラムを実行したところ、テストが失敗した。

原因を調査した結果、図4の行目に問題があることが判明したので、①プログラムを修正してテストを成功させることができた。

設問3

図3中のに入れる適切な字句を答えよ。

解説

プログラムの下のほうをみるとeは○の数をカウントしていると読み取れます。

プログラムの「カ」の部分は、対象の周りに○があるかないかを判定します。

周りに○があるときを式であらわすと「temp[c]と1が等しい(カの答え)」となります!

キの結果をみると、「m[i] ← 1」となり、生を表現しています。

表1 誕生、生存、死滅の条件をみると「生のマス」になるのは「誕生」と「生存」です。

「誕生」は「死のマスに隣接する生のマスが三つならば、死のマスは次の世代では生のマスとなる。」です。

これをプラグラムであらわすと「キ temp[i]と0が等しい and eと3が等しい」となります!

elseif( (temp[i]と1が等しい) and ( (eと2が等しい) or (eと3が等しい) ) )は、「生存」を表しています。

従ってクには「m[i] = 1」が入ります!

平成28年度春 応用情報技術者試験 午後 目次


タグ: ,

PR広告

フェイスブックコメント

難解な応用情報技術者試験午前で80点中48点を取る優しい方法

平成28年度春 応用情報技術者試験 午後 テキスト・動画解説

平成28年度春 応用情報技術者試験 午後 動画解説再生リスト

平成28年度春 応用情報技術者試験 午前 テキスト・動画解説

平成28年度秋 応用情報技術者試験 午前 動画解説再生リスト

平成27年度秋 応用情報技術者試験 午前 テキスト・動画解説

平成27年度秋 応用情報技術者試験 午前 動画解説再生リスト

平成27年度春 応用情報技術者試験 午後 テキスト・動画解説

平成27年度春 応用情報技術者試験 午後 動画解説再生リスト

平成27年度春 応用情報技術者試験 午前 テキスト・動画解説

平成27年度春 応用情報技術者試験 午前 動画解説再生リスト

平成26年度秋 応用情報技術者試験 午前 テキスト・動画解説

平成26年度秋 応用情報技術者試験 午前 動画解説再生リスト

平成26年度春 応用情報技術者試験 午前 テキスト・動画解説

平成26年度春 応用情報技術者試験 午前 動画解説再生リスト