BASIC (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 (ось так довгий один рядок відображається в Spectrum, тому якщо ви хочете перевірити код, це допоможе вам побачити, що ви правильно ввели його):
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
Я міг би отримати інший фрагмент, уникаючи +
і просто зроблю з ним -
. Я не збираюся це пробувати, цього було достатньо випробування.