Кожен, хто помірно оптимізує код низького рівня, знає про небезпеку розгалуження, будь то реалізована як оператори if, циклі або select-заяви, можливість помилкового прогнозування гілки - жахлива річ, що витрачає годинник.
Прості задачі можна вирішити набагато краще за допомогою простої арифметики, тому давайте це зробимо.
Для наведених нижче проблем усі змінні - це 32-бітні непідписані цілі числа, і єдиний дозволений код - це просто встановлені оператори, що включають лише наступні оператори:
+ 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
=
Кожен рядок повинен складатися з ідентифікатора змінної, за яким слідує оператор набору, а потім - вираз.
Вираз може не містити додаткових операторів набору, але може містити ідентифікатори змінних, буквальні числа та круглі дужки.
Оцінка гольфу повинна враховувати лише кількість операторів.
Приклад:
myvar = ( ( ( foo + 5 ) * bar ) % 7 ) == 3
Має оцінку 5 операторів.
Рішення може включати стільки змінних, скільки автор вважає за потрібне.
Змінні, які не були встановлені, мають значення 0
.
Дозволено переповнення та переповнення, усі негативні числа підпадають, так 3 - 5
само 4294967294
, навіть як частина більшого твердження.
Завдання 1: Макс
Два значення, A
і B
існують у області, змушують RESULT
змінну містити найбільше з цих значень, коли програма припиняється.
Завдання 2: Медіана
Три значення, A
, B
і C
, існує в обсязі, зробити RESULT
змінний містять медіану тих значень , коли програма завершує свою роботу .
Завдання 3: квадратний корінь
Одне значення, яке A
існує в області, змушує RESULT
змінну містити квадратний корінь A
, округлений вниз, коли програма закінчується.
Неправильно розмістити відповідь лише на одне-два питання, для когось із вас просто пошук правильних рішень стане проблемою.
0xFFFF_FFFF_FFFF_FFFF ^ x
і 0 - x
. Як я міг забути?
!
є також досить тривіально: x == 0
.
Boole[a-b]
?
-
але~
може бути приємно (навіть якщо я не знаю, для чого).