BASIC (ZX Spectrum), punteggio 244 (nuovo punteggio 247) [è questo imbroglio?]
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
Snippet 4-244: snippet a carattere singolo, utilizzando tutti i caratteri non presenti nei frammenti 1, 2 e 3.
Spiegazione
Personaggi
Su Spectrum, PRINT
è un singolo carattere (codice 245). Il frammento 1 utilizza 11 diversi personaggi: 2
, 3
, 5
, 6
, +
, -
, *
, (
, )
, PRINT
e PEEK
Quello che si vede in quanto i posti sono una parte di personaggi PRINT
e PEEK
, quindi lo spazio in sé non è stata utilizzata. Ho deciso di dare il numero di riga 2356 perché queste sono le uniche cifre presenti nel codice.
I personaggi 13 e 14 non sono ammessi. Ciò significa che sono rimasti 243 caratteri per gli snippet 2-244, a partire da :
e REM
per evitare il codice che genererebbe errori o farebbe qualsiasi altra cosa.
Come funziona
Questo è il motivo per cui non sono sicuro che questa risposta sia contenuta nel libro.
23635 è la posizione di memoria per la variabile di sistema PROG a 16 bit, memorizzata come LH. (Il valore è di solito 23755. Ma a parte un risultato errato se non fosse il caso, l'uso diretto di questo numero, anche se accorcerebbe il codice, mi costerebbe caratteri extra). Il valore di PROG è la posizione della memoria dove è memorizzato il programma stesso. I primi due byte sono il numero di riga memorizzato come HL, i seguenti due byte sono la lunghezza della riga memorizzata come LH. Ecco come il programma cerca la lunghezza della propria linea, quindi è necessario sottrarre qualcosa di appropriato
Salvataggio di personaggi
Considerando come vengono memorizzati i numeri, la riga potrebbe essere terminata con -114 in modo che lo snippet 1 producesse 1. Ma non volevo usare cifre extra, quindi ho tolto due numeri a 2 cifre, che poi hanno dovuto sommare a 122; 56 e 66 hanno fatto bene.
Il codice è un po 'brutto con tutto l'annidamento e il calcolo del valore di PROG ( PEEK 23635+256*PEEK 23636
) due volte. Ma se lo memorizzassi e quindi utilizzassi il valore memorizzato, costerebbe caratteri / frammenti aggiuntivi: la riga potrebbe iniziare in questo modo
2356 LET p=PEEK 23635+256*PEEK 23636: PRINT PEEK (s+2)...
che sarebbe utilizzare 4 caratteri aggiuntivi: LET
, p
, =
e :
.
Forse lo ingegnerò in modo che tutti i numeri vengano calcolati da numeri che usano solo 1 cifra e ottengono 3 frammenti.
MODIFICARE:
Ecco il nuovo frammento 1 (è così che una lunga riga singola viene visualizzata a capo sullo spettro, quindi se vuoi testare il codice, ti aiuterà a vedere che lo hai digitato correttamente):
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
Potrei ottenere un altro frammento evitando +
e semplicemente accontentandomi -
. Non ho intenzione di provarlo, questo è stato abbastanza di un calvario.