令和2年度春期試験から実施するFE午後試験のプログラム言語の選択問題の変更(Python追加)に関し、
Pythonのサンプル問題を公開しました。とあるので解いてみました。
「出典:基本情報技術者試験 Pythonサンプル問題」
タートルを作る問題で繰り返しの入れ子もできる簡易言語が完成します。
何気にすごい!
Colaboratoryでの実行結果
選択肢を見ずに解こうとしたのですが最後2箇所は無理でした。
テキスト
import math # 数学関数の標準ライブラリ
import matplotlib.pyplot as plt # グラフ描画の外部ライブラリ
def parse(s):
return [(x[0],int(x[1:])) for x in s.split(';')]
class Marker:
def __init__(self):
self.x, self.y, self.angle = 0, 0, 0
plt.xlim(-320, 320) # x軸の表示範囲を設定
plt.ylim(-240, 240) # y軸の表示範囲を設定
def forward(self, val):
rad = math.radians(self.angle) # 度数法で表した角度を,ラジアンで表した角度に変換
dx, dy = val * math.cos(rad), val * math.sin(rad)
x1, y1, x2, y2 = self.x, self.y, self.x + dx, self.y + dy
plt.plot([x1, x2], [y1, y2], color='black', linewidth=2) # (x1,y1)と(x2,y2)を結ぶ線分を描画
self.x, self.y = x2, y2
def turn(self, val):
self.angle = (self.angle + val) % 360
def show(self):
plt.show() # 描画結果を表示
def draw(s):
insts = parse(s)
marker = Marker()
stack = []
opno = 0
while opno < len(insts):
#print(stack)
code, val = insts[opno]
if code == 'F':
marker.forward(val)
elif code == 'T':
marker.turn(val)
elif code == 'R':
stack.append({'opno': opno, 'rest': val})
elif code == 'E':
if stack[-1]['rest'] > 1:
opno = stack[-1]['opno']
stack[-1]['rest'] -= 1
else:
stack.pop() # stackの末尾の要素を削除
opno += 1
marker.show()
draw('R3;R4;F100;T90;E0;F100;E0')
draw("R5;F100;T72;E0")