Бейсик (ZX Spectrum), оценка 244 (новая оценка 247) [это обман?]
Фрагмент 1:
2356 PRINT PEEK (PEEK 23635+256*PEEK 23636+2)+256*PEEK (PEEK 23635+256*PEEK 23636+3)-56-66
Фрагмент 2: :
Фрагмент 3: REM
Фрагменты кода 4-244: фрагменты из одного символа, в которых используются все символы, не входящие в фрагменты 1, 2 и 3.
объяснение
Символы
На Спектруме PRINT
стоит один символ (код 245). Сниппета 1 использует 11 различных символов: 2
, 3
, 5
, 6
, +
, -
, *
, (
, )
, PRINT
и PEEK
что вы видите , как пробелы являются частью символов PRINT
иPEEK
, таким образом , само пространство не используется. Я решил дать номер строки 2356, потому что это единственные цифры в коде.
Символы 13 и 14 не допускаются. Это означает, что для фрагментов 2-244 осталось 243 символа, начиная с кода :
и REM
избегая кода, который может привести к ошибке или сделать что-то еще.
Как это работает
Вот почему я не уверен, что этот ответ от книги.
23635 - это ячейка памяти для 16-битной системной переменной PROG, хранящаяся как LH. (Значение обычно составляет 23755. Но если не считать неправильный результат, если это не так, использование этого числа напрямую, даже если это укорачивает код, обойдется мне в дополнительные цифры.) Значение PROG - это место в памяти где хранится сама программа. Первые два байта - это номер строки, хранящийся как HL, следующие два байта - это длина строки, хранящаяся как LH. Вот как программа ищет длину собственной строки, поэтому необходимо вычесть что-то подходящее
Сохранение персонажей
Учитывая то, как хранятся числа, строка могла бы заканчиваться на -114, чтобы фрагмент 1 выдавал 1. Но я не хотел использовать дополнительные цифры, поэтому вместо этого я убрал два двузначных числа, которые затем пришлось сложить до 122; 56 и 66 сделали хорошо.
Код немного некрасив, со всеми вложенными и вычисленными значениями PROG ( PEEK 23635+256*PEEK 23636
) дважды. Но если я сохраню его, а затем использую сохраненное значение, это будет стоить дополнительных символов / фрагментов - строка может начинаться как
2356 LET p=PEEK 23635+256*PEEK 23636: PRINT PEEK (s+2)...
который будет использовать 4 дополнительных символов: LET
, p
, =
и :
.
Может быть, я спроектирую это так, чтобы все числа рассчитывались из чисел, которые используют только 1 цифру, и получают 3 фрагмента.
РЕДАКТИРОВАТЬ:
Вот новый фрагмент 1 (именно так длинная отдельная строка отображается на Спектруме в виде переноса, поэтому, если вы захотите проверить код, это поможет вам убедиться, что вы набрали его правильно):
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
Я мог бы получить другой фрагмент, избегая +
и просто обойтись -
. Я не собираюсь пробовать это, это было достаточно тяжелым испытанием.