Рассчитать n
по модулю 12
для 32-разрядного целого числа без знака.
Правила:
- Должен работать для всех
n
от 0 до 23. Другие числа необязательны. - Необходимо использовать только любой из операторов
+-*
,~&^|
или<<
,>>
как это обычно определяется на 32 - битных uints. - Может использовать произвольное количество постоянных uints.
- Не разрешается использовать любые указатели, в том числе массивы или любые
if
операторы, включая вещи, которые компилируются в операторы if, такие как троичные операторы или операторы «больше чем».
Подсчет очков:
- Операторы
+ -
и побитовые операторы~ & ^ | << >>
(NOT, AND, XOR, OR, битовые сдвиги) дают оценку1
,*
дают оценку2
. - Наименьшее общее количество очков выигрывает.
+-*
это сложение, вычитание, умножение;~&^|
поразрядно НЕ, И, XOR, ИЛИ; и<< >>
сдвиги.for i in x:y:z, .dostuff
?n % 12
под умножение и сдвиг, как в восторге от хакера, так что это тривиально, просто выведите сборку и посмотритеОтветы:
4
(Язык не имеет значения)
Woo! Добрался до 4.
11-n
будет гарантировать, что все биты старшего разряда установлены тогда и только тогда, когда n> = 12.48&(11-n)
== если n> 11, то еще 48 0(48&(11-n))>>2
== если n> 11, то 12, иначе 0n-((48&(11-n))>>2)
это ответисточник
n - (((11 - n) & 0xC0000000) >> 28)
. Хорошо, я не думаю, что это можно сделать менее чем за четыре.4
Решение с помощью справочной таблицы (оно выглядит вверх
i ^ (i % 12)
):4
Вот еще одно решение с 4 операциями:
Предполагается, что операнд подсчета битовых сдвигов неявно принимается мод 32, то
x >> -1
есть такой же, какx >> 31
.5
Другой подход, используя таблицу поиска:
источник
Баш - 1
например
источник
stdin
аstdout
ручьи? Конечно, внутри они являются указателями, но тогда мы могли бы также дисквалифицировать Java, потому что он используетInteger
класс для многих целей.C, little-endian - 2
Это, вероятно, обман, но я думаю, что это соответствует правилам ...
источник
= 0
вместо& 0x0
, который должен засчитываться как дополнительные 2 операции. Но +1 за креативность :)PHP - оценка 0
Интересно, как это возможно, что никто не пришел с этим до меня !!!
источник
С, оценка 5
Работает до 23, не гарантируется выше.
((n+4)>>2)&4
возвращает 4 при n> = 12. Добавьте его к n, и вы получите правильный ответ в младших 4 битах, а затем обрежете остальные биты.источник
на любом языке: 5
не собираюсь побеждать, но участвую потому, что весело, а может, потому что это легче понять, чем другим:
это эквивалентно
это эквивалентно, потому что, когда вы добавляете 20 к 12, вы получаете 32, таким образом, 5-й бит становится 1. Это только когда n> 1, поскольку 32 - наименьшее число, где 5-й бит становится 1.
также обратите внимание, что легко расширяется для более высокого диапазона, как вы можете сделать
достичь диапазона до 35
источник
Python 2.x - 4
Является
=
ли оператор?В этом случае счет 6.
Кстати, решение @steveverrill можно напрямую использовать и в Python.
Работает для диапазона 0 .. 23
Итак, что происходит ? Умножьте на 357913942 и разделите на 2 ^ 32 (или сдвиг вправо 32)
источник
С - 6
источник
Кобра - 2 (или 3)
Это может быть изгиб , тем правила немного, но я попросил и ему было разрешено использовать это.
Это также работает для любого числа.
источник
Кона - 5
Может быть недействительным, потому что я не уверен, разрешен ли оператор пола, но у меня есть два
*
с минусом:Который должен работать для любого целого числа.
источник