BÁSICO (ZX Spectrum), puntaje 244 (nuevo puntaje 247) [¿esto es trampa?]
Fragmento 1:
2356 PRINT PEEK (PEEK 23635+256*PEEK 23636+2)+256*PEEK (PEEK 23635+256*PEEK 23636+3)-56-66
Fragmento 2: :
Fragmento 3: REM
Fragmentos 4-244: Fragmentos de un solo carácter, que utilizan todos los caracteres que no están en los fragmentos 1, 2 y 3.
Explicación
Caracteres
En Spectrum, PRINT
es un solo carácter (código 245). El fragmento 1 utiliza 11 caracteres diferentes: 2
, 3
, 5
, 6
, +
, -
, *
, (
, )
, PRINT
y PEEK
Lo que se ve como espacios son una parte de caracteres PRINT
y PEEK
, por lo que el espacio en sí no ha sido utilizado. Decidí dar el número de línea 2356 porque estos son los únicos dígitos presentes en el código.
Los caracteres 13 y 14 no están permitidos. Eso significa que quedan 243 caracteres para los fragmentos 2-244, comenzando por :
y REM
para evitar el código que produciría un error o haría cualquier otra cosa.
Cómo funciona
Es por eso que no estoy seguro de si esta respuesta es del libro.
23635 es la ubicación de memoria para PROG variable de sistema de 16 bits, almacenada como LH. (El valor generalmente es 23755. Pero aparte del resultado incorrecto si no es el caso, usar este número directamente, aunque acortaría el código, me costaría caracteres de dígitos adicionales). El valor de PROG es la ubicación de la memoria donde se almacena el programa en sí. Los primeros dos bytes son el número de línea almacenado como HL, los siguientes dos bytes son la longitud de la línea almacenada como LH. Así es como el programa busca la longitud de su propia línea, por lo que es necesario restar algo apropiado
Guardando personajes
Teniendo en cuenta cómo se almacenan los números, la línea podría haber terminado con -114 para que el fragmento 1 produjera 1. Pero no quería usar dígitos adicionales, por lo que quité dos números de 2 dígitos, que luego tuvieron que sumar a 122; 56 y 66 lo hicieron muy bien.
El código es un poco feo con todos los valores de anidamiento y cálculo de PROG ( PEEK 23635+256*PEEK 23636
) dos veces. Pero si lo almacenara y luego usara el valor almacenado, costaría caracteres / fragmentos adicionales: la línea podría comenzar como
2356 LET p=PEEK 23635+256*PEEK 23636: PRINT PEEK (s+2)...
que utilizaría 4 caracteres adicionales: LET
, p
, =
y :
.
Tal vez voy a diseñar esto para que todos los números se calculen a partir de números que usan solo 1 dígito y obtienen 3 fragmentos.
EDITAR:
Aquí está el nuevo fragmento 1 (así es como se muestra una línea larga en el Spectrum, por lo que si desea probar el código, eso lo ayudará a ver que lo escribió correctamente):
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
Podría obtener otro fragmento evitando +
y simplemente arreglármelas -
. No voy a intentarlo, esto fue suficiente prueba.