コンテンツにスキップ

023: ラベル付きSSCで最大値を求める

ヒント / 解答

難易度: ☆☆☆

問題

ラベル付きのSSCアセンブラ assemble_program(lines) を書いてください。 そのうえで、2つの入力値の最大値を出力するSSCプログラムを書いてください。

入力は、アセンブリの各行を文字列として並べたリストです。 行には、次の要素を含められます。

  • label::その行の番地に名前を付ける。
  • Load label のような命令:operandにラベル名を書ける。
  • Data value:命令ではなく、Python整数のデータをその番地に置く。
  • StopJump 0 の別名。
  • ; 以降のコメント。

次の関数を実装してください。

  • assemble_program(lines):ラベル付きアセンブリを8ビット命令とデータのリストへ変換する。
  • maximum_program():2つの入力値の最大値を出力するラベル付きアセンブリの行リストを返す。
  • max_with_ssc(a, b)maximum_program() をアセンブルして実行し、最大値を返す。

制約

  • ラベルは、定義より前の行からでも参照できます。
  • Data の値は8ビットに丸めません。
  • 命令は021の encode_instruction を使って8ビット整数にしてください。
  • 空行とコメントだけの行は無視してください。
  • 同じラベルが2回定義された場合は ValueError を送出してください。
  • Jump はAccumulatorが正のときだけ分岐します。
  • 入力値はPython整数です。

>>> program = assemble_program([
...     "Load value",
...     "Shift 1",
...     "Store value",
...     "Write value",
...     "Stop",
...     "value: Data 21",
... ])
>>> run(program)
[42]
>>> max_with_ssc(7, 9)
9
>>> max_with_ssc(12, 4)
12
>>> max_with_ssc(5, 5)
5

発展

3つの入力の最大値を求めるプログラムに拡張してください。