Każdy, kto jest umiarkowanie nastawiony na optymalizację kodu niskiego poziomu, wie o zagrożeniach związanych z rozgałęzianiem, niezależnie od tego, czy są one implementowane jako instrukcje if, pętle lub instrukcje select, możliwość błędnego przewidywania gałęzi jest straszną rzeczą marnującą zegar.
Proste problemy można rozwiązać znacznie lepiej za pomocą prostej arytmetyki, więc zróbmy to.
W przypadku następujących problemów wszystkie zmienne są 32-bitowymi liczbami całkowitymi bez znaku, a jedynym dozwolonym kodem są instrukcje z prostym zestawem obejmujące tylko następujące operatory:
+ 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
=
Każda linia musi składać się z identyfikatora zmiennej, po którym następuje operator zbioru, a po nim wyrażenie.
Wyrażenie może nie zawierać dodatkowych operatorów zestawów, ale może zawierać identyfikatory zmiennych, liczby literalne i nawiasy.
Wynik golfa liczy tylko liczbę operatorów.
Przykład:
myvar = ( ( ( foo + 5 ) * bar ) % 7 ) == 3
Ma wynik 5 operatorów.
Rozwiązanie może obejmować tyle zmiennych, ile autor uzna za stosowne.
Zmienne, które nie zostały ustawione, mają wartość 0
.
Przepełnienie i niedomiar jest dozwolone, wszystkie liczby ujemne niedopełniony, tak 3 - 5
jest 4294967294
, nawet jako część większego rachunku.
Zadanie 1: maks
Dwie wartości, A
i B
istnieją w zakresie, sprawiają, że RESULT
zmienna zawiera największą z tych wartości po zakończeniu programu.
Zadanie 2: Mediana
Trzy wartości, A
, B
i C
istnieją w zakresie sprawiają, że RESULT
zmienna zawiera medianę tych wartości, gdy kończy się program.
Zadanie 3: Pierwiastek kwadratowy
Jedna wartość, A
istniejąca w zakresie, sprawia, że RESULT
zmienna zawiera pierwiastek kwadratowy z A
zaokrąglenia w dół, gdy program się kończy.
Można odpowiedzieć tylko na jedno lub dwa pytania, dla niektórych z was znalezienie odpowiednich rozwiązań będzie wyzwaniem.
0xFFFF_FFFF_FFFF_FFFF ^ x
i 0 - x
. Jak mogłem zapomnieć?
!
również nie jest dość trywialna:x == 0
.
Boole[a-b]
?
-
ale~
może być miły (nawet jeśli nie wiem po co).