BASIC (ZX Spectrum), wynik 244 (nowy wynik 247) [czy to oszustwo?]
Fragment 1:
2356 PRINT PEEK (PEEK 23635+256*PEEK 23636+2)+256*PEEK (PEEK 23635+256*PEEK 23636+3)-56-66
Snippet 2: :
Fragment 3: REM
Fragmenty 4-244: Fragmenty jednoznakowe, wykorzystujące wszystkie znaki spoza fragmentów 1, 2 i 3.
Wyjaśnienie
Postacie
W Spectrum PRINT
jest pojedynczy znak (kod 245). Fragment 1 wykorzystuje 11 różnych znaków: 2
, 3
, 5
, 6
, +
, -
, *
, (
, )
, PRINT
i PEEK
co widzisz jako przestrzenie są częścią znaków PRINT
iPEEK
tak nie była używana sama przestrzeń. Postanowiłem podać numer linii 2356, ponieważ są to jedyne cyfry obecne w kodzie.
Znaki 13 i 14 są niedozwolone. Oznacza to, że dla fragmentów 2-244 pozostało 243 znaków, zaczynając od :
i REM
unikając kodu, który mógłby powodować błędy lub robić cokolwiek innego.
Jak to działa
Dlatego nie jestem pewien, czy ta odpowiedź pochodzi z książki.
23635 to miejsce w pamięci dla 16-bitowej zmiennej systemowej PROG, zapisanej jako LH. (Wartość wynosi zwykle 23755. Ale oprócz złego wyniku, jeśli tak się nie stanie, użycie tego numeru bezpośrednio, nawet jeśli skróciłoby kod, kosztowałoby mnie dodatkowe cyfry). Wartość PROG to lokalizacja pamięci gdzie sam program jest przechowywany. Pierwsze dwa bajty to numer linii przechowywany jako HL, kolejne dwa bajty to długość linii przechowywanej jako LH. W ten sposób program sprawdza długość własnej linii, więc należy odjąć coś odpowiedniego
Zapisywanie znaków
Biorąc pod uwagę sposób przechowywania liczb, linia mogła zakończyć się cyfrą -114, tak że fragment 1 wygenerowałby 1. Ale nie chciałem używać dodatkowych cyfr, więc zamiast tego zabrałem dwie 2-cyfrowe liczby, które następnie musiałem dodać do 122; 56 i 66 wypadły dobrze.
Kod jest nieco brzydki, ponieważ wszystkie zagnieżdżanie i obliczanie wartości PROG ( PEEK 23635+256*PEEK 23636
) dwukrotnie. Ale gdybym go zapisał, a następnie użył przechowywanej wartości, kosztowałoby to dodatkowe znaki / fragmenty - wiersz mógłby zacząć się tak
2356 LET p=PEEK 23635+256*PEEK 23636: PRINT PEEK (s+2)...
który użyłby 4 dodatkowe znaki: LET
, p
, =
i :
.
Może to skonstruuję tak, aby wszystkie liczby były obliczane na podstawie liczb, które używają tylko 1 cyfry i uzyskują 3 fragmenty.
EDYTOWAĆ:
Oto nowy fragment 1 (w ten sposób wyświetlana jest długa pojedyncza linia w Spectrum, więc jeśli chcesz przetestować kod, pomoże ci to sprawdzić, czy wpisałeś go poprawnie):
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
Mógłbym zdobyć kolejny fragment, unikając +
i po prostu się z tym pogodzić -
. Nie zamierzam tego próbować, to wystarczyło na ciężką próbę.