raccourcissant IF
déclarations
IF
les instructions sont assez chères, et les jouer au golf peut économiser beaucoup d'octets.
Considérez ce qui suit (adapté d'une réponse d'Erik l'Outgolfer):
IF RND<.5THEN
x=x-1
a(i)=1
ELSE
y=y-1
a(i)=0
ENDIF
La première chose que nous pouvons faire est d'enregistrer le ENDIF
en utilisant une IF
instruction sur une seule ligne :
IF RND<.5THEN x=x-1:a(i)=1ELSE y=y-1:a(i)=0
Cela fonctionne tant que vous n'essayez pas de le mettre sur la même ligne que n'importe quoi d'autre. En particulier, si vous avez des IF
instructions imbriquées , seule la plus interne peut être unilatérale.
Mais dans ce cas, nous pouvons éliminer IF
entièrement les mathématiques. Considérez ce que nous voulons réellement:
- Si
RND<.5
est vrai ( -1
), nous voulons:
x
diminuer de 1
y
rester le même
a(i)
devenir 1
- Sinon, si
RND<.5
est false ( 0
), nous voulons:
x
rester le même
y
diminuer de 1
a(i)
devenir 0
Maintenant , si nous gagnons le résultat du conditionnel dans une variable ( r=RND<.5
), nous pouvons calculer les nouvelles valeurs x
, y
et a(i)
:
- Quand
r
est -1
, x=x-1
; quand r
est 0
, x=x+0
.
- Quand
r
est -1
, y=y+0
; quand r
est 0
, y=y-1
.
- Quand
r
est -1
, a(i)=1
; quand r
est 0
, a(i)=0
.
Notre code final ressemble donc à:
r=RND<.5
x=x+r
y=y-1-r
a(i)=-r
économiser un énorme 20 octets (40%) sur la version originale.
L'approche mathématique peut être appliquée de manière surprenante souvent, mais lorsqu'il y a une différence de logique entre les deux cas (par exemple lorsque vous devez saisir quelque chose dans un cas mais pas dans l'autre), vous devrez toujours utiliser IF
.