Первым языком программирования, с которым я столкнулся, был Sinclair BASIC . Как и многие другие диалекты BASIC, он требует нумерации всех строк исходного кода .
В результате использование GO TO
команды было идиоматичным и переходит к выполнению на заданный номер строки (без меток).
Также есть связанная GO SUB
команда, которая может использоваться как элементарный вызов функции. Опять же, выполнение переходит к заданному номеру строки, но когда RETURN
команда достигнута, выполнение переходит обратно к следующей инструкции после GO SUB
.
Аналогично, RUN
команда перезапустит выполнение программы с заданной строки.
Любой, кто провел какое-то время в переводчике с базовым номером BASIC, научится использовать схему нумерации с пробелами в ней. Это так, чтобы легче было вставлять новые строки кода. Однако даже в этом случае вам может понадобиться вставить новые строки между последовательно пронумерованными строками.
Если в качестве входных данных указан список BASIC с номерами строк, выведите ту же программу, но перенумеруйте ее так, чтобы номера строк начинались с 10 и увеличивались с шагом 10. Список ввода может содержать команды GO TO
или 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 THEN PRINT "Correct": STOP
100 IF A<B THEN GO SUB 125
120 IF A>B THEN GO SUB 122
121 GO TO 3
125 PRINT "Try again"
126 RETURN
127 REM "An example of GO TO 7 and GO SUB 13 in quotes"
Пример вывода:
10 REM "A rearranged guessing game"
20 INPUT A: CLS
30 INPUT "Guess the number ", B
40 IF A=B THEN PRINT "Correct": STOP
50 IF A<B THEN GO SUB 80
60 IF A>B THEN GO SUB 80
70 GO TO 30
80 PRINT "Try again"
90 RETURN
100 REM "An example of GO TO 7 and GO SUB 13 in quotes"
Я хотел дать ссылку на руководство по ZX BASIC. Лучшее, что я смог найти, - это http://www.worldofspectrum.org/ZXBasicManual/index.html, но, похоже, это мертвая ссылка. У машины обратного хода есть копия, хотя .
GOTO 100 + A*10
и Приложении C из ZX Spectrum Manual списков GO TO
как принимать числовое выражение (без ограничения на константы). Вот обсуждение достоинств вычислений GOTO
на ZX80 и ZX81. Кстати, я понятия не имею, почему место было добавлено в версии Spectrum.