Chiunque sia moderatamente interessato all'ottimizzazione del codice a basso livello conosce i pericoli della ramificazione, sia che sia implementato come se dichiarazioni, cicli o dichiarazioni selettive, la possibilità di un errore nel ramo sia una cosa terribile che fa perdere tempo.
I problemi semplici possono essere risolti molto meglio con l'aritmetica semplice, quindi facciamolo.
Per i seguenti problemi, tutte le variabili sono numeri interi senza segno a 32 bit e l'unico codice consentito è costituito da semplici istruzioni che coinvolgono solo i seguenti operatori:
+ addition
- subtraction
* multiplication
/ integer division, rounds down, division by 0 not allowed
% modulo
& binary and
| binary or
^ binary exclusive or
>> bitshift right
<< bitshift left
Logic operators, return 1 if the expression is true and 0 if it is false.
== equal
!= not equal
< less than
<= less than or equal
> greater than
>= greater than or equal
Set operator
=
Ogni riga deve essere composta da un identificatore di variabile seguito da un operatore set, seguito da un'espressione.
Un'espressione non può contenere operatori di set aggiuntivi, ma può contenere identificatori di variabili, numeri letterali e parentesi.
Il punteggio del golf deve contare solo il numero di operatori.
Esempio:
myvar = ( ( ( foo + 5 ) * bar ) % 7 ) == 3
Ha un punteggio di 5 operatori.
Una soluzione può includere tutte le variabili che l'autore ritiene più adatte.
Le variabili che non sono state impostate hanno valore 0
.
Overflow e underflow sono consentiti, tutti i numeri negativi sono underflow, così come lo 3 - 5
sono 4294967294
, anche come parte di un'istruzione più grande.
Attività 1: max
Due valori, A
ed B
esistono nell'ambito, fanno sì che la RESULT
variabile contenga il più grande di quei valori al termine del programma.
Compito 2: mediana
Tre valori A
, B
e C
, presenti nell'area, rendono la RESULT
variabile contiene la mediana dei valori quando il programma termina.
Attività 3: radice quadrata
Un valore, A
esistente nell'ambito, fa sì che la RESULT
variabile contenga la radice quadrata di A
, arrotondata per difetto, al termine del programma.
È giusto pubblicare una risposta solo a una o due delle domande, per alcuni di voi solo trovare soluzioni valide sarà una sfida.
0xFFFF_FFFF_FFFF_FFFF ^ x
e 0 - x
. Come avrei potuto dimenticarlo?
!
è anche abbastanza banale: x == 0
.
Boole[a-b]
?
-
ma~
potrebbe essere carino (anche se non so per cosa).