Это версия недавнего вызова. Является ли это число целым числом -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.