El primer lenguaje de programación al que estuve expuesto fue Sinclair BASIC . Al igual que muchos dialectos BÁSICOS, requiere que todas las líneas del código fuente estén numeradas .
Como resultado, el uso del GO TOcomando era idiomático y salta la ejecución al número de línea dado (sin etiquetas).
También hay un GO SUBcomando relacionado que se puede usar como una llamada de función rudimentaria. Nuevamente, la ejecución salta al número de línea dado, pero cuando RETURNse alcanza un comando, la ejecución vuelve a la siguiente instrucción después de GO SUB.
Del mismo modo, el RUNcomando reiniciará la ejecución del programa en la línea dada.
Cualquiera que haya pasado algún tiempo en un intérprete BASIC numerado por línea habrá aprendido a usar un esquema de numeración con huecos. Esto es para que sea más fácil insertar nuevas líneas de código. Sin embargo, aun así, es posible que necesite insertar nuevas líneas entre líneas numeradas consecutivamente.
Dada una lista BASIC numerada con línea como entrada, genera el mismo programa pero renumerado de tal manera que los números de línea comienzan en 10 y se incrementan en pasos de 10. La lista de entrada puede tener GO TOo GO SUBcomandos, por lo que los números asociados con estos también deben ajustarse.
GO TOy losGO SUBcomandos están en sus propias líneas o al final de lasIFTHENlíneas. Es seguro decir que^(\d+) .*GO (TO|SUB) (\d+)$es suficiente para que coincida con tales líneas. Estos comandos entre comillas deben ignorarse.RUNlos comandos siempre estarán en sus propias líneas. En este caso, un número de línea es opcional. Si falta, el intérprete simplemente comienza en la parte superior del programa.Si a
GO TO,GO SUBoRUNreferencias de comandos de una línea inexistente, entonces en vez saltará a la siguiente línea definida. Su entrada debe ocuparse de esto y asegurarse de que cualquier referencia de línea sea fija para que apunte a la línea correcta. El comportamiento puede ser indefinido si se proporciona un número de línea después del final del programa en uno de estos comandos.Los números de línea siempre serán enteros positivos del 1 al 9999 (según el manual). Esto significa que los programas de entrada nunca tendrán más de 999 líneas.
Las líneas de entrada siempre se numerarán en orden numérico ascendente.
Para los propósitos de este desafío, los listados de entrada solo contendrán ASCII imprimible. No necesita preocuparse por el juego de caracteres ZX. Una vez dicho esto, si su entrada es en realidad escrito en ZX BASIC o apropiarse z80 montaje / código de máquina (y hay emuladores fuera allí ), entonces usted puede elegir que su entrada a codificar en el conjunto de caracteres ZX en su lugar.
No puede utilizar ninguna biblioteca de renumeración o utilidades específicamente diseñadas para este propósito.
Entrada de ejemplo:
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"
Salida de ejemplo:
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"
Quería vincularme a un manual ZX BASIC. Lo mejor que pude encontrar parece ser http://www.worldofspectrum.org/ZXBasicManual/index.html, pero este parece ser un enlace inactivo. Sin embargo, la máquina wayback tiene una copia .
GOTO 100 + A*10 , y el Apéndice C del ZX Spectrum Manual enumeraGO TOcomo aceptar una expresión numérica (sin restricción de constantes). Aquí hay una discusión sobre los méritos de computarGOTOen ZX80 y ZX81. Por cierto, no tengo idea de por qué se agregó el espacio en la versión Spectrum.