Encurtando IFdeclarações
IF as instruções são bastante caras, e reduzi-las pode economizar muitos bytes.
Considere o seguinte (adaptado de uma resposta de Erik, o Outgolfer):
IF RND<.5THEN
x=x-1
a(i)=1
ELSE
y=y-1
a(i)=0
ENDIF
A primeira coisa que podemos fazer é salvar ENDIFusando uma IFinstrução de linha única :
IF RND<.5THEN x=x-1:a(i)=1ELSE y=y-1:a(i)=0
Isso funciona desde que você não tente colocá-lo na mesma linha que qualquer outra coisa. Em particular, se você tiver IFinstruções aninhadas , apenas a mais interna poderá ser de uma linha.
Mas, neste caso, podemos eliminar IFtotalmente a matemática. Considere o que realmente queremos:
- Se
RND<.5for true ( -1), queremos:
x diminuir em 1
y permanecer o mesmo
a(i) tornar-se 1
- Caso contrário, se
RND<.5for false ( 0), queremos:
x permanecer o mesmo
y diminuir em 1
a(i) tornar-se 0
Agora, se nós salvar o resultado da condicional em uma variável ( r=RND<.5), podemos calcular os novos valores de x, ye a(i):
- Quando
ré -1, x=x-1; quando ré 0, x=x+0.
- Quando
ré -1, y=y+0; quando ré 0, y=y-1.
- Quando
ré -1, a(i)=1; quando ré 0, a(i)=0.
Portanto, nosso código final se parece com:
r=RND<.5
x=x+r
y=y-1-r
a(i)=-r
economizando 20 bytes (40%) sobre a versão original.
A abordagem matemática pode ser aplicada surpreendentemente com frequência, mas quando houver uma diferença na lógica entre os dois casos (por exemplo, quando você precisar inserir algo em um caso, mas não no outro), você ainda precisará usá-lo IF.