ぱそきいろのIT日記

ぱそきいろがITに関する記事を書いていきます。

基本情報技術者試験 Pythonサンプル問題の解説

今年の初めに,基本情報技術者試験の午後問題で使われる問題でCOBOLに変わってPythonが追加されると発表がありました.
www.ipa.go.jp
実際に選択できるのは,次の令和2年の春期試験からみたいです.
それに伴ってPythonのサンプル問題が出題されました.
この問題の解説をしていきたいと思います.
問題は↓から
www.jitec.ipa.go.jp
「出典:基本情報技術者試験 Pythonサンプル問題」

ちなみに,基本情報技術者試験の勉強法はこちらをご覧ください.
www.takacpu55.xyz

設問1

(a)
f:id:takabsk55:20191028162453p:plain
これはプログラムに沿って線を書いていけば分かります.
繰り返し終わりの命令5を忘れない様にしてください.
(b)
f:id:takabsk55:20191028162531p:plain
こちらもプログラムに沿って考えればいいのですが,回転方向が五角形の内角である108°ではなく,進行方向の72°であることに注意してください.
あとは,「反時計回りが正」に気をつければ分かります.
設問1はPythonはあまり関係なく,普通の基本情報午後問題という感じですね.

設問2

ここからがPythonの問題です.
f:id:takabsk55:20191028162835p:plainf:id:takabsk55:20191028162850p:plain
(c)これは,引数の数字を持ってくるので,x[1]を答えたくなるのですが,drawの引数sは文字列型のため,2桁を超えた場合のことを考えて,x[1:]を選ぶ必要があります.(最初間違えたw)
(d)高校の三角関数が分かれば解けるはず.
正負の向きだけ気をつけてください.
(e)これから引く線の始点となる点なので,selfのx,yが正解です.
(f)繰り返し回数をスタックにためていくので,引数であるvalが正解です.
(g)スタックにデータが残っており,この先またループを回す必要があるかなので,[>1]が正解です.
(h)スタックにデータが残っており,ループを回す必要があるので,ループの先頭に飛ぶ必要があります.そのため,opno=stack[-1]["opno"]が正解です.
(i)ループが終わるので,スタックの末尾を消すのが正解です.

考察

基本情報のアルゴリズムの問題かなといった感じでした.
出題趣旨としては

命令列の解釈実行を行うインタプリタを作成することは,プログラミング技法の習得 の点でも,プログラムの動作原理を理解する点でも,意義深い取組である。 本問は,簡易な描画処理の命令列を解釈実行することを主題としている。
本問では,繰返しの入れ子構造をもつ命令列の解釈実行について問うことによって, スタックを用いて実装する能力を評価する。また,マーカの移動及び回転を指示する命 令の実行について問うことによって,プログラム言語 Python の外部ライブラリや,三角 関数などの数値計算を行う標準ライブラリを活用する能力を評価する。
出典:基本情報技術者試験 Pythonサンプル問題

という感じです.
Python独自の要素としては,設問2の(c)リスト内包標記やスライス表現くらいかなといったところです.
設問2(d)はきちんとmathのライブラリの説明されてますしね...
とはいっても,今まではCOBOLだったわけで,よっぽど現代的な,有意義な変更だったのではないかと思います.
久しぶりに基本情報技術者試験の問題を解いたのですが,ひねりがあって楽しかったです.
最後に僕が基本情報技術者試験を受けた時に使ってたテキストのリンクを貼っておきます.
イラストが多く,高校生でも理解できたのでオススメです!