BASIC (ZX Spectrum), điểm số 244 (điểm mới 247) [đây có phải là gian lận không?]
Đoạn 1:
2356 PRINT PEEK (PEEK 23635+256*PEEK 23636+2)+256*PEEK (PEEK 23635+256*PEEK 23636+3)-56-66
Đoạn 2: :
Đoạn 3: REM
Đoạn trích 4-244: Đoạn mã một ký tự, sử dụng tất cả các ký tự không có trong đoạn 1, 2 và 3.
Giải trình
Nhân vật
Trên Spectrum, PRINT
là một ký tự đơn (mã 245). Đoạn 1 sử dụng 11 nhân vật khác nhau: 2
, 3
, 5
, 6
, +
, -
, *
, (
, )
, PRINT
và PEEK
Những gì bạn thấy là không gian là một phần của nhân vật PRINT
vàPEEK
, do đó không gian riêng của mình đã không được sử dụng. Tôi quyết định đưa ra số dòng 2356 vì đây là những chữ số duy nhất có trong mã.
Nhân vật 13 và 14 không được phép. Điều đó có nghĩa là có 243 ký tự còn lại cho đoạn trích 2-244, bắt đầu bằng :
và REM
để tránh mã gây ra lỗi hoặc làm bất cứ điều gì khác.
Làm thế nào nó hoạt động
Đây là lý do tại sao tôi không chắc câu trả lời này là của cuốn sách.
23635 là vị trí bộ nhớ cho PROG biến hệ thống 16 bit, được lưu dưới dạng LH. (Giá trị thường là 23755. Nhưng ngoài kết quả sai nếu không xảy ra trường hợp này, sử dụng trực tiếp số này, mặc dù nó sẽ rút ngắn mã, sẽ khiến tôi mất thêm ký tự chữ số.) Giá trị của PROG là vị trí bộ nhớ nơi chương trình được lưu trữ. Hai byte đầu tiên là số dòng được lưu dưới dạng HL, hai byte sau là độ dài của dòng được lưu dưới dạng LH. Đó là cách chương trình tìm kiếm độ dài của dòng riêng của nó, vì vậy cần phải trừ đi một số thứ thích hợp
Lưu nhân vật
Xem xét cách các số được lưu trữ, dòng có thể đã kết thúc bằng -114 để đoạn 1 tạo ra 1. Nhưng tôi không muốn sử dụng các chữ số phụ, vì vậy tôi đã lấy đi hai số có 2 chữ số, sau đó phải cộng lại đến 122; 56 và 66 đã làm tốt.
Mã này hơi xấu với tất cả các giá trị lồng và tính toán của PROG ( PEEK 23635+256*PEEK 23636
) hai lần. Nhưng nếu tôi lưu trữ nó và sau đó sử dụng giá trị được lưu trữ, nó sẽ tốn thêm các ký tự / đoạn trích - dòng có thể bắt đầu như
2356 LET p=PEEK 23635+256*PEEK 23636: PRINT PEEK (s+2)...
mà sẽ sử dụng 4 ký tự bổ sung: LET
, p
, =
và :
.
Có lẽ tôi sẽ thiết kế điều này để tất cả các số được tính từ các số chỉ sử dụng 1 chữ số và nhận được 3 đoạn.
CHỈNH SỬA:
Đây là đoạn 1 mới (đó là cách một dòng đơn dài được hiển thị trên Spectrum, vì vậy nếu bạn muốn kiểm tra mã, điều đó sẽ giúp bạn thấy rằng bạn đã nhập chính xác):
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
Tôi có thể có được một đoạn khác bằng cách tránh +
và chỉ cần thực hiện với -
. Tôi sẽ không thử nó, điều này là đủ thử thách.