A primeira linguagem de programação à qual fui exposto foi o Sinclair BASIC . Como muitos dialetos BASIC, ele exige que todas as linhas de código-fonte sejam numeradas .
Como resultado, o uso do GO TOcomando era idiomático e salta a execução para o número da linha fornecido (sem rótulos).
Também existe um GO SUBcomando relacionado que pode ser usado como uma chamada de função rudimentar. Novamente, a execução salta para o número de linha especificado, mas quando um RETURNcomando é alcançado, a execução retorna para a próxima instrução após a GO SUB.
Da mesma forma, o RUNcomando reiniciará a execução do programa na linha especificada.
Qualquer pessoa que tenha passado algum tempo em um intérprete do BASIC numerado por linha aprenderá a usar um esquema de numeração com lacunas. Isso é mais fácil para inserir novas linhas de código. No entanto, mesmo assim, você ainda pode precisar inserir novas linhas entre as linhas numeradas consecutivamente.
Dada uma listagem BASIC numerada por linha como entrada, produza o mesmo programa, mas renumerado, de modo que os números de linha iniciem em 10 e aumentem em etapas de 10. A listagem de entrada pode ter GO TOou GO SUBcomandos, portanto, os números associados a eles também devem ser ajustados.
GO TOe osGO SUBcomandos estão em suas próprias linhas ou no final dasIFTHENlinhas. É seguro dizer que^(\d+) .*GO (TO|SUB) (\d+)$é suficiente para corresponder a essas linhas. Esses comandos entre aspas devem ser ignorados.RUNOs comandos sempre estarão em suas próprias linhas. Nesse caso, um número de linha é opcional. Se estiver faltando, o intérprete simplesmente inicia na parte superior do programa.Se um
GO TO,GO SUBouRUNreferências de comando uma linha inexistente, então ele vai em vez ir para a próxima linha definida. Sua entrada precisa lidar com isso e garantir que essas referências de linha sejam corrigidas para que aponte para a linha correta. O comportamento pode ser indefinido se um número de linha após o final do programa for fornecido em um desses comandos.Os números de linha sempre serão inteiros positivos de 1 a 9999 (conforme o manual). Isso significa que os programas de entrada nunca terão mais de 999 linhas.
As linhas de entrada sempre serão numeradas em ordem numericamente crescente.
Para os fins deste desafio, as listagens de entrada conterão apenas ASCII imprimível. Você não precisa se preocupar com o conjunto de caracteres ZX. Dito isto, se sua entrada for realmente escrita no ZX BASIC ou no código / conjunto de máquinas z80 apropriado (e houver emuladores por aí ), você poderá escolher que sua entrada seja codificada no conjunto de caracteres ZX .
Você não pode usar nenhuma numeração de bibliotecas ou utilitários especificamente personalizados para esse fim.
Exemplo de entrada:
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"
Saída de exemplo:
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"
Eu queria vincular a um manual do ZX BASIC. O melhor que pude encontrar parece ser http://www.worldofspectrum.org/ZXBasicManual/index.html, mas esse parece ser um link morto. A máquina wayback tem uma cópia .
GOTO 100 + A*10 , e o Apêndice C do Manual do ZX Spectrum lista GO TOcomo aceitando uma expressão numérica (sem restrição de constantes). Aqui está uma discussão dos méritos dos computados GOTOno ZX80 e no ZX81. BTW, eu não tenho idéia do por que o espaço foi adicionado na versão Spectrum.