Encurtando IF
declaraçõ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 ENDIF
usando uma IF
instruçã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 IF
instruções aninhadas , apenas a mais interna poderá ser de uma linha.
Mas, neste caso, podemos eliminar IF
totalmente a matemática. Considere o que realmente queremos:
- Se
RND<.5
for true ( -1
), queremos:
x
diminuir em 1
y
permanecer o mesmo
a(i)
tornar-se 1
- Caso contrário, se
RND<.5
for 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
, y
e 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
.