Pythonサンプル問題 設問2
YGさん
(No.1)
[空欄c]
parse()では、命令列をタプルのリストに変換している。その際に
・ 内包表記
を使っているのがポイントである。この内包表記の意味は、
・ 文字列s を ; で分割して作成したリストの要素数(分割数がそのまま要素数になる)
?の分だけ、タプルの要素を作ってくれ
となる。上記の要素数は、そのまま命令列の命令数になる。
例えば文字列s がαの命令列の場合、s.split(';')の結果は
['R3','R4','F100','T90','E0','F100','E0']
となる。'R3'、'R4'、...と、分割後の文字列が順次処理されるという仕組み。
上記の各々の文字列が、各々のタプルに変換される。例えば、
'R3' => ('R',3)
'F100' => ('F',100)
といった感じ。空欄cはこのタプルの後者に入れるべきもので、そこには、
・ 数字列を数値に変換したもの
が入ることがわかる。数字列を数値に変換する場合は
int()
という関数を使えばよい。数字列は、
・ x[1]から最後の要素までのすべての数字
が該当し、これを処理できる表現を書かねばならない。これはスライシングを使って
x[1:]
と表現できる。よって、空欄cにはイの
int(x[1:])
が入る。
[空欄d]
これは、三角関数の基本問題。
図のような座標軸の場合、斜辺に対するx成分とy成分はそれぞれ単純に
cos(角度)
sin(角度)
でよい。したがって、イが正解。
[空欄e]
x1, y1は、出発元の座標が入る。これは、self.xとself.yが情報を保持し続けているので
ウが正解。
本題とは関係ないが、Pythonはこのような複数の変数への一括代入ができるので、読めるようにしておくこと。
parse()では、命令列をタプルのリストに変換している。その際に
・ 内包表記
を使っているのがポイントである。この内包表記の意味は、
・ 文字列s を ; で分割して作成したリストの要素数(分割数がそのまま要素数になる)
?の分だけ、タプルの要素を作ってくれ
となる。上記の要素数は、そのまま命令列の命令数になる。
例えば文字列s がαの命令列の場合、s.split(';')の結果は
['R3','R4','F100','T90','E0','F100','E0']
となる。'R3'、'R4'、...と、分割後の文字列が順次処理されるという仕組み。
上記の各々の文字列が、各々のタプルに変換される。例えば、
'R3' => ('R',3)
'F100' => ('F',100)
といった感じ。空欄cはこのタプルの後者に入れるべきもので、そこには、
・ 数字列を数値に変換したもの
が入ることがわかる。数字列を数値に変換する場合は
int()
という関数を使えばよい。数字列は、
・ x[1]から最後の要素までのすべての数字
が該当し、これを処理できる表現を書かねばならない。これはスライシングを使って
x[1:]
と表現できる。よって、空欄cにはイの
int(x[1:])
が入る。
[空欄d]
これは、三角関数の基本問題。
図のような座標軸の場合、斜辺に対するx成分とy成分はそれぞれ単純に
cos(角度)
sin(角度)
でよい。したがって、イが正解。
[空欄e]
x1, y1は、出発元の座標が入る。これは、self.xとself.yが情報を保持し続けているので
ウが正解。
本題とは関係ないが、Pythonはこのような複数の変数への一括代入ができるので、読めるようにしておくこと。
2019.10.29 18:05
YGさん
(No.2)
続き
[空欄f]
変数instsにはparse()の戻り値が入っているので、この中身は空欄c の解説で触れた
・ タプルのリスト
が入っている。先ほどの一括代入を応用すれば、タプルの全要素を、別々の変数へ一括代入することもでき、
code, val = insts[opno]
がそれに該当する。
例えば右辺の内容が('F', 100)であれば、codeに'F'、valに100が入る。
そしてこの場合、marker.forward()のメソッド呼び出しに移る。渡す情報は当然valなので、エが正解。
ここでは最初の空欄f で解説したが、他の2箇所でやっても(最後のだけは難易度が高いが)求められる。
[空欄g]
ループの管理は、内部的にはスタックを使っている。具体的には
stack[-1]['opno'] : 現在見ているループの開始位置を管理するための情報
stack[-1]['rest'] : 現在見ているループの残り周回数
である。
codeが'E'の場合は、ループの終端であることを示す。ここで処理を分けるのは、当然ながら
・ 残り周回数があるかないか
のためである。ここのif文がTrueの場合、最後に
stack[-1]['rest'] -= 1
と残り周回数を1減らしていることから、チェック対象の条件が「周回数が残っているか」だとわかる。
ただし処理論理上、restが1でif文に渡った場合「周回数が残ってない」と判断しなければならない点に注意。
よって、「>1」のオが正解。誤ってエを選ばないようにすること。
[空欄f]
変数instsにはparse()の戻り値が入っているので、この中身は空欄c の解説で触れた
・ タプルのリスト
が入っている。先ほどの一括代入を応用すれば、タプルの全要素を、別々の変数へ一括代入することもでき、
code, val = insts[opno]
がそれに該当する。
例えば右辺の内容が('F', 100)であれば、codeに'F'、valに100が入る。
そしてこの場合、marker.forward()のメソッド呼び出しに移る。渡す情報は当然valなので、エが正解。
ここでは最初の空欄f で解説したが、他の2箇所でやっても(最後のだけは難易度が高いが)求められる。
[空欄g]
ループの管理は、内部的にはスタックを使っている。具体的には
stack[-1]['opno'] : 現在見ているループの開始位置を管理するための情報
stack[-1]['rest'] : 現在見ているループの残り周回数
である。
codeが'E'の場合は、ループの終端であることを示す。ここで処理を分けるのは、当然ながら
・ 残り周回数があるかないか
のためである。ここのif文がTrueの場合、最後に
stack[-1]['rest'] -= 1
と残り周回数を1減らしていることから、チェック対象の条件が「周回数が残っているか」だとわかる。
ただし処理論理上、restが1でif文に渡った場合「周回数が残ってない」と判断しなければならない点に注意。
よって、「>1」のオが正解。誤ってエを選ばないようにすること。
2019.10.29 18:07
YGさん
(No.3)
さらに続き
[空欄h]
ループの終端から開始に戻る場合、開始の命令の位置をopnoに設定し直す必要がある。
ただし、その処理が問題文に明記されていないので、空欄hでそれをやるのだとわかる。
opnoの更新処理は1つだけ。アが正解。
[空欄i]
ループが終了した場合の後処理が問題になっている。
スタックで管理しているときに、ループが終わったということは
・ 最内ループのために積んだものを、下ろす
ということをしなければならない。そして、内側のループほど
・ 上部(即ち、最後に積む)
という仕組みがある点にも注意する。このあたりはスタックの知識も必要。
最後に積んだものを下ろせばいいので、ウのstack.pop()が正解。
[空欄h]
ループの終端から開始に戻る場合、開始の命令の位置をopnoに設定し直す必要がある。
ただし、その処理が問題文に明記されていないので、空欄hでそれをやるのだとわかる。
opnoの更新処理は1つだけ。アが正解。
[空欄i]
ループが終了した場合の後処理が問題になっている。
スタックで管理しているときに、ループが終わったということは
・ 最内ループのために積んだものを、下ろす
ということをしなければならない。そして、内側のループほど
・ 上部(即ち、最後に積む)
という仕組みがある点にも注意する。このあたりはスタックの知識も必要。
最後に積んだものを下ろせばいいので、ウのstack.pop()が正解。
2019.10.29 18:08
管理人
(No.4)
YGさん
解説の投稿ありがとうございます。Pythonの文法的な補足もあり非常によくまとまっていると思います。後ほど解説を掲載する際の参考にさせていただきます。
解説の投稿ありがとうございます。Pythonの文法的な補足もあり非常によくまとまっていると思います。後ほど解説を掲載する際の参考にさせていただきます。
2019.10.29 21:08
広告
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
広告