BASIC (ZX Spectrum), Punktzahl 244 (neue Punktzahl 247) [Betrügt das?]
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: Einzelzeichen-Snippets, wobei alle Zeichen verwendet werden, die nicht in den Snippets 1, 2 und 3 enthalten sind.
Erläuterung
Zeichen
Bei Spectrum PRINT
handelt es sich um ein einzelnes Zeichen (Code 245). Das Snippet 1 verwendet 11 verschiedene Zeichen: 2
, 3
, 5
, 6
, +
, -
, *
, (
, )
, PRINT
und PEEK
was Sie sehen , wie Räume ein Teil der Zeichen sind PRINT
und PEEK
, so dass der Raum selbst nicht benutzt worden ist . Ich habe beschlossen, die Zeilennummer 2356 anzugeben, da dies die einzigen Ziffern im Code sind.
Zeichen 13 und 14 sind nicht erlaubt. Das bedeutet, dass für die Snippets 2-244 noch 243 Zeichen zur Verfügung stehen, beginnend mit :
und REM
um den Code zu vermeiden, der zu Fehlern führen oder andere Aktionen ausführen würde.
Wie es funktioniert
Aus diesem Grund bin ich mir nicht sicher, ob diese Antwort von dem Buch stammt.
23635 ist der Speicherort für die 16-Bit-Systemvariable PROG, die als LH gespeichert ist. (Der Wert ist normalerweise 23755. Aber abgesehen von einem falschen Ergebnis, wenn dies nicht der Fall ist, würde mich die direkte Verwendung dieser Nummer, auch wenn sie den Code verkürzen würde, zusätzliche Ziffernzeichen kosten.) Der Wert von PROG ist der Speicherort wo das Programm selbst gespeichert ist. Die ersten zwei Bytes sind die als HL gespeicherte Zeilennummer, die folgenden zwei Bytes sind die als LH gespeicherte Zeilenlänge. Auf diese Weise ermittelt das Programm die Länge seiner eigenen Zeile, sodass etwas Passendes abgezogen werden muss
Zeichen speichern
Wenn man bedenkt, wie Zahlen gespeichert werden, hätte die Zeile mit -114 enden können, sodass Snippet 1 1 ergeben würde. Ich wollte jedoch keine zusätzlichen Ziffern verwenden, nahm stattdessen zwei zweistellige Zahlen weg, die sich dann summieren mussten bis 122; 56 und 66 haben sich gut geschlagen.
Der Code ist ein bisschen hässlich, da alle Werte von PROG ( PEEK 23635+256*PEEK 23636
) zweimal verschachtelt und berechnet werden . Aber wenn ich es speichere und dann den gespeicherten Wert verwende, würde es zusätzliche Zeichen / Schnipsel kosten - die Zeile könnte wie folgt beginnen
2356 LET p=PEEK 23635+256*PEEK 23636: PRINT PEEK (s+2)...
die 4 zusätzliche Zeichen verwenden würde: LET
, p
, =
und :
.
Vielleicht werde ich das so konstruieren, dass alle Zahlen aus Zahlen berechnet werden, die nur eine Ziffer verwenden und 3 Schnipsel erhalten.
BEARBEITEN:
Hier ist das neue Snippet 1 (so wird eine lange einzelne Zeile im Spektrum umbrochen angezeigt. Wenn Sie also den Code testen möchten, können Sie sehen, dass Sie ihn richtig eingegeben haben):
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
Ich könnte einen weiteren Ausschnitt gewinnen, indem ich das vermeide +
und mich nur damit begnüge -
. Ich werde es nicht versuchen, das war genug von einer Tortur.