4
金曜日の先祖返り:ZXスペクトラムBASICリストの番号を付け直します
私が最初に触れたプログラミング言語はSinclair BASICでした。多くのBASIC方言と同様に、すべてのソースコード行に番号を付ける必要があります。 その結果、GO TOコマンドの使用は慣用的であり、実行を指定された行番号(ラベルなし)にジャンプします。 またGO SUB、基本的な関数呼び出しとして使用できる関連コマンドがあります。繰り返しますが、実行は指定された行番号にジャンプしますが、RETURNコマンドに到達すると、実行はの後の次の命令にジャンプして戻りGO SUBます。 同様に、RUNコマンドは指定された行でプログラムの実行を再開します。 行番号の付いたBASICインタープリターで時間を過ごした人は誰でも、番号にギャップのある番号付けスキームを使用することを学びます。これは、新しいコード行を挿入しやすくするためです。ただし、それでも、連続した番号の行の間に新しい行を挿入する必要がある場合があります。 入力として行番号付きのBASICリストを指定し、同じプログラムを出力しますが、行番号が10から始まり、10ずつ増加するように番号を付け直します。入力リストにはGO TOor GO SUBコマンドがあるため、これらに関連付けられた番号も調整する必要があります。 GO TOまた、GO SUBコマンドは独自の行または行末にありIF THENます。その^(\d+) .*GO (TO|SUB) (\d+)$ような行に一致するには、言うまでもなく安全です。引用符で囲まれたこれらのコマンドは無視する必要があります。 RUNコマンドは常に独自の行にあります。この場合、行番号はオプションです。欠落している場合、インタープリターは単にプログラムの先頭から開始します。 GO TO、GO SUBまたはRUNコマンドが存在しない行を参照する場合、代わりに次の定義された行にジャンプします。エントリはこれに対処し、適切な行を指すようにそのような行参照が修正されるようにする必要があります。これらのコマンドのいずれかでプログラムの終了後の行番号が指定された場合、動作は未定義になる場合があります。 行番号は常に1〜9999の正の整数になります(マニュアルに従って)。これは、入力プログラムが999行を超えないことを意味します。 入力行には、常に数値の昇順で番号が付けられます。 このチャレンジのために、入力リストには印刷可能なASCIIのみが含まれます。ZX文字セットについて心配する必要はありません。そうは言っても、エントリが実際にZX BASICまたは適切なz80アセンブリ/マシンコードで記述されている場合(およびエミュレータがある場合)、代わりにZX文字セットでエンコードする入力を選択できます。 この目的のために特別に調整されたライブラリまたはユーティリティの番号を変更することはできません。 入力例: 1 REM "A rearranged guessing game" 2 INPUT A: CLS 3 INPUT "Guess the number ", B 10 IF A=B …
15
code-golf