BASIC (ZX Spectrum), score 244 (nouveau score 247) [est-ce de la triche?]
Extrait 1:
2356 PRINT PEEK (PEEK 23635+256*PEEK 23636+2)+256*PEEK (PEEK 23635+256*PEEK 23636+3)-56-66
Extrait 2: :
Extrait 3: REM
Extraits 4 à 244: extraits à un seul caractère, utilisant tous les caractères ne figurant pas dans les extraits 1, 2 et 3.
Explication
Personnages
Sur Spectrum, PRINT
est un seul caractère (code 245). L'extrait 1 utilise 11 caractères différents: 2
, 3
, 5
, 6
, +
, -
, *
, (
, )
, PRINT
et PEEK
ce que vous voyez comme des espaces sont une partie de caractères PRINT
et PEEK
, si l'espace lui - même n'a pas été utilisé. J'ai décidé de donner le numéro de ligne 2356 car ce sont les seuls chiffres présents dans le code.
Les caractères 13 et 14 ne sont pas autorisés. Cela signifie qu'il reste 243 caractères pour les extraits 2 à 244, en commençant par :
et REM
pour éviter le code qui produirait une erreur ou ferait autre chose.
Comment ça marche
C'est pourquoi je ne sais pas si cette réponse vient du livre.
23635 est l'emplacement de mémoire de la variable système 16 bits PROG, stockée sous la forme LH. (La valeur est généralement 23755. Mais à part un mauvais résultat s'il s'avère que ce n'est pas le cas, l'utilisation directe de ce numéro, même si cela raccourcirait le code, me coûterait des caractères numériques supplémentaires.) La valeur de PROG est l'emplacement de la mémoire où le programme lui-même est stocké. Les deux premiers octets sont le numéro de ligne stocké en tant que HL, les deux octets suivants sont la longueur de la ligne stockée en tant que LH. C'est ainsi que le programme recherche la longueur de sa propre ligne, donc quelque chose de approprié doit être soustrait
Sauvegarde des personnages
Compte tenu de la façon dont les numéros sont stockés, la ligne aurait pu se terminer par -114 pour que l'extrait 1 produise 1. Mais je ne voulais pas utiliser de chiffres supplémentaires, j'ai donc pris à la place deux numéros à 2 chiffres, qui devaient ensuite s'additionner à 122; 56 et 66 s'en sont bien sortis.
Le code est un peu moche avec toutes les valeurs d'imbrication et de calcul de PROG ( PEEK 23635+256*PEEK 23636
) deux fois. Mais si je le stockais puis utilisais la valeur stockée, cela coûterait des caractères / extraits supplémentaires - la ligne pourrait commencer comme
2356 LET p=PEEK 23635+256*PEEK 23636: PRINT PEEK (s+2)...
qui utiliserait 4 caractères supplémentaires: LET
, p
, =
et :
.
Je vais peut-être concevoir cela de sorte que tous les nombres soient calculés à partir de nombres qui n'utilisent qu'un seul chiffre et gagnent 3 extraits.
MODIFIER:
Voici le nouvel extrait 1 (c'est ainsi qu'une longue ligne unique est affichée sur le Spectrum, donc si vous voulez tester le code, cela vous aidera à voir que vous l'avez tapé correctement):
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
Je pourrais gagner un autre extrait en évitant le +
et me contenter de -
. Je ne vais pas l'essayer, c'était assez une épreuve.