BASIC (ZX Spectrum), pontuação 244 (nova pontuação 247) [isso está enganando?]
Snippet 1:
2356 PRINT PEEK (PEEK 23635+256*PEEK 23636+2)+256*PEEK (PEEK 23635+256*PEEK 23636+3)-56-66
Snippet 2: :
Snippet 3: REM
Snippets 4-244: snippets de um caractere, usando todos os caracteres que não estão nos snippets 1, 2 e 3.
Explicação
Personagens
No Spectrum, PRINT
é um caractere único (código 245). O trecho de 1 usa 11 caracteres diferentes: 2
, 3
, 5
, 6
, +
, -
, *
, (
, )
, PRINT
e PEEK
O que você vê como espaços são uma parte de personagens PRINT
ePEEK
, portanto, o espaço em si não tem sido utilizado. Decidi dar o número da linha 2356 porque esses são os únicos dígitos presentes no código.
Os caracteres 13 e 14 não são permitidos. Isso significa que restam 243 caracteres para os trechos 2-244, começando com :
e REM
para evitar o código que produziria erro ou faria qualquer outra coisa.
Como funciona
É por isso que não tenho certeza se essa resposta está no livro.
23635 é o local da memória para a variável de sistema PROG de 16 bits, armazenada como LH. (O valor geralmente é 23755. Mas, além do resultado errado, se esse não for o caso, usar esse número diretamente, mesmo que encurtasse o código, me custaria caracteres de dígito extra.) O valor de PROG é o local da memória onde o próprio programa está armazenado. Os dois primeiros bytes são o número da linha armazenada como HL, os dois bytes a seguir são o comprimento da linha armazenada como LH. É assim que o programa procura o comprimento de sua própria linha, para que algo apropriado precise ser subtraído
Salvando caracteres
Considerando como os números são armazenados, a linha poderia ter terminado com -114, para que o snippet 1 produzisse 1. Mas eu não queria usar dígitos extras, então tirei dois números de 2 dígitos, que então precisavam somar a 122; 56 e 66 foram bem.
O código é um pouco feio com todos os valores de aninhamento e cálculo de PROG ( PEEK 23635+256*PEEK 23636
) duas vezes. Mas se eu o armazenasse e usasse o valor armazenado, isso custaria caracteres / trechos extras - a linha poderia começar como
2356 LET p=PEEK 23635+256*PEEK 23636: PRINT PEEK (s+2)...
que usaria 4 caracteres adicionais: LET
, p
, =
e :
.
Talvez eu planeje isso para que todos os números sejam calculados a partir de números que usam apenas 1 dígito e ganham 3 trechos.
EDITAR:
Aqui está o novo trecho 1 (é assim que uma única linha longa é exibida automaticamente no Spectrum, portanto, se você quiser testar o código, isso ajudará você a ver que você o digitou corretamente):
1111 PRINT +PEEK (PEEK (11111+11
111+1111+(1+1+1)*(111-11)+1+1)+(
111+111+11+11+11+1)*PEEK (11111+
11111+1111+(1+1+1)*(111+1-11))+1
+1)+(111+111+11+11+11+1)*PEEK (P
EEK (11111+11111+1111+(1+1+1)*(1
11-11)+1+1)+(111+111+11+11+11+1)
*PEEK (11111+11111+1111+(1+1+1)*
(111+1-11))+1+1+1)-111-111-111-1
11-111-111
Eu poderia ganhar outro trecho evitando o +
e apenas me contentar com -
. Eu não vou tentar, isso foi uma provação suficiente.