Это версия недавнего вызова. Является ли это число целым числом -2? с другим набором критериев, разработанных, чтобы подчеркнуть интересный характер проблемы и усложнить задачу. Я положил некоторые соображения в это здесь .
Задача, замечательно сформулированная Тоби в связанном вопросе:
Есть умные способы определить, является ли целое число точной степенью 2. Это больше не интересная проблема, поэтому давайте определим, является ли данное целое число точной степенью -2 . Например:
-2 => yes: (-2)¹ -1 => no 0 => no 1 => yes: (-2)⁰ 2 => no 3 => no 4 => yes: (-2)²
Правила:
- Целое число - 64 бита, со знаком, два дополнения. Это единственный тип данных, с которым вы можете работать.
- Вы можете использовать только следующие операции. Каждый из них считается одной операцией.
n << k
,n >> k
: Сдвиг влево / вправоn
поk
битам. Бит знака расширяется при сдвиге вправо.n >>> k
: Сдвиг вправо, но не удлиняется бит знака. 0 сдвинуты в.a & b
,a | b
,a ^ b
: Побитовое И, ИЛИ, исключающее ИЛИ .a + b
,a - b
,a * b
: Сложение, вычитание, умножение.~b
: Побитовый инвертирование-b
: Отрицание дополнения двух.a / b
,a % b
: Делить (целое частное, округляет до 0) и по модулю.- По модулю отрицательных чисел используются правила, указанные в C99 :
(a/b) * b + a%b
равныa
. Так5 % -3
есть2
и-5 % 3
есть-2
: 5 / 3
есть1
,5 % 3
есть2
, как 1 * 3 + 2 = 5.-5 / 3
есть-1
,-5 % 3
есть-2
, как -1 * 3 + -2 = -5.5 / -3
есть-1
,5 % -3
есть2
, как -1 * -3 + 2 = 5.-5 / -3
есть1
,-5 % -3
есть-2
, как 1 * -3 + -2 = -5.- Обратите внимание, что
//
оператор деления по полу в Python здесь не удовлетворяет свойству деления «в сторону 0», и%
оператор Python также не удовлетворяет требованиям.
- По модулю отрицательных чисел используются правила, указанные в C99 :
- Задания не считаются операцией. Как и в C, назначения оценки к значению левой стороны после выполнения задания:
a = (b = a + 5)
наборыb
дляa + 5
, то наборыa
кb
, и рассчитывает как одну операцию. - Сложные задания могут использоваться
a += b
средствамиa = a + b
и считаться одной операцией.
- Вы можете использовать целочисленные константы, они не считаются ничем.
- Скобки для указания порядка операций допустимы.
- Вы можете объявить функции. Объявления функций могут быть в любом удобном для вас стиле, но обратите внимание, что 64-битные целые числа являются единственным допустимым типом данных. Объявления функций не считаются операциями, но вызов функции считается одним. Кроме того, чтобы быть ясным: функции могут содержать несколько
return
операторов иreturn
допускаются с любой точки. Само поreturn
себе не считается операцией. - Вы можете объявить переменные бесплатно.
- Вы можете использовать
while
петли, но вы не можете использоватьif
илиfor
. Операторы, используемые вwhile
условии, засчитываются в ваш счет.while
Циклы выполняются до тех пор, пока их состояние оценивается как ненулевое значение («истинный» 0 в языках, которые имеют эту концепцию, не является допустимым результатом). С раннего возврата допускается, вы имеете право использовать ,break
а также - Переполнение / переполнение допускается, и фиксация значения не производится. Считается, что операция действительно произошла правильно, а затем была усечена до 64 бит.
Критерии оценки / выигрыша:
Ваш код должен выдавать значение, отличное от нуля, если на входе есть степень -2, и ноль в противном случае.
Это атомный код-гольф . Ваша оценка - это общее количество операций, присутствующих в вашем коде (как определено выше), а не общее количество операций, выполняемых во время выполнения. Следующий код:
function example (a, b) {
return a + ~b;
}
function ispowerofnegtwo (input) {
y = example(input, 9);
y = example(y, 42);
y = example(y, 98);
return y;
}
Содержит 5 операций: две в функции и три вызова функций.
Неважно, как вы представляете свой результат, используете все, что удобно на вашем языке, будь то в конечном итоге сохранение результата в переменной, возвращение его из функции или что-то еще.
Победителем становится должность, которая является явно корректной (предоставьте случайное или формальное доказательство, если необходимо) и имеет наименьший балл, как описано выше.
Бонус Очень Сложный Режим Challenge!
Чтобы получить шанс выиграть абсолютно ничего, кроме потенциальной способности произвести впечатление на людей на вечеринках, отправьте ответ без использования while
петель! Если их будет достаточно, я могу даже рассмотреть вопрос о разделении выигрышных групп на две категории (с петлями и без них).
Примечание. Если вы хотите предоставить решение на языке, который поддерживает только 32-разрядные целые числа, вы можете сделать это при условии, что вы достаточно обосновываете, что оно все равно будет правильным для 64-разрядных целых чисел в объяснении.
Также: некоторые специфичные для языка функции могут быть разрешены бесплатно, если они не обходят правила, но необходимы для того, чтобы заставить ваш язык вести себя в соответствии с вышеуказанными правилами . Например (я придумал), я разрешаю сравнение « не равно 0» в while
циклах применительно к условию в целом, как обходной путь для языка с «истинными» 0. Явные попытки воспользоваться этими вещами недопустимы - например, концепция «истинных» 0 или «неопределенных» значений не существует в приведенном выше наборе правил, поэтому на них нельзя полагаться.
m ^= s
этого все еще впечатляет, и я думаю, что было бы вполне нормально сделать замену, чтобы улучшить ее еще больше.
while
и , break
но не if
? if (x) { ... }
эквивалентно while (x) { ... break; }
.
break
и досрочное возвращение - достойная сожаления часть), и это длинная история и урок, извлеченный из правил для будущих вызовов. Всегда есть «бонусная» версия! :)
if
и for
не разрешено? int x=condition; while (x) { ... x=0; }
бесплатно, просто больше кода. То же самое с с-стилем for
.