Це версія недавнього виклику. Чи є це число цілою потужністю -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) та модуль.- У модулі від'ємних чисел використовуються правила, зазначені в С99 :
(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 також не відповідає цим вимогам.
- У модулі від'ємних чисел використовуються правила, зазначені в С99 :
- Призначення не вважаються операцією. Як і в C, призначення оцінки до значення лівого боку після виконання завдання:
a = (b = a + 5)
набориb
дляa + 5
, потім встановлюєшa
доb
, і розраховує як одну операцію. - Складні призначення можуть використовуватися
a += b
засобамиa = a + b
і рахуватися як одна операція.
- Ви можете використовувати цілі константи, вони не вважаються нічим.
- Дужки, що визначають порядок операцій, є прийнятними.
- Ви можете оголосити функції. Декларації функцій можуть бути в будь-якому зручному для вас стилі, але зауважте, що 64-бітні цілі числа - єдиний дійсний тип даних. Оголошення функції не вважаються операціями, але виклик функції вважається одним. Крім того, щоб бути зрозумілим: Функції можуть містити кілька
return
заяв, іreturn
s з будь-якої точки дозволено. Thereturn
по собі не вважається операцією. - Ви можете декларувати змінні безкоштовно.
- Ви можете використовувати
while
петлі, але ви не можете використовуватиif
абоfor
. Оператори, які використовуються вwhile
умові, враховують ваш рахунок.while
циклі виконуються до тих пір, поки їх умова оцінюється до нульового значення ("truthy" 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 операцій: дві у функції та три виклики функції.
Не має значення, як ви представляєте результат, використовуйте все, що зручно на вашій мові, будь то в кінцевому підсумку, зберігаючи результат у змінній, повертаючи її з функції чи інше.
Переможець - посада, яка демонструє правильність (при необхідності надайте випадковий чи офіційний доказ) і має найнижчий бал, як описано вище.
Виклик бонус дуже важкий режим!
Для того, щоб виграти абсолютно нічого, крім потенційної здатності справити враження на людей на вечірках, подайте відповідь, не використовуючи while
циклів! Якщо їх подано достатньо, я навіть можу розглянути питання про поділ переможних груп на дві категорії (з циклами та без них).
Примітка. Якщо ви хочете надати рішення мовою, яка підтримує лише 32-бітні цілі числа, ви можете зробити це за умови, що ви достатньо обґрунтуєте, що це все ще буде правильним для 64-бітових цілих чисел у поясненні.
Також: Певні особливості мови можуть бути дозволені безкоштовно, якщо вони не ухиляються від правил, але необхідні для примушування вашої мови до поведінки відповідно до вищезазначених правил . Наприклад, (надумано), я дозволю вільне не рівне 0 порівнянню в while
циклі, коли його застосовують до умови в цілому, як вирішення для мови, що має "truthy" 0. Чіткі спроби скористатися тими речами не дозволяються - наприклад, поняття "truthy" 0 або "undefined" значень не існує у наведеному вище наборі правил, і тому на них не можна покластися.
m ^= s
це все ще не вражає, і я думаю, було б цілком нормально зробити заміну, щоб покращити її ще більше.
while
і , break
але не if
? if (x) { ... }
еквівалентно while (x) { ... break; }
.
break
а раннє повернення - шкодуючий склад) і це довга історія та урок, виведений з правил для майбутніх викликів. Завжди є "бонусна" версія! :)
if
і for
заборонено? int x=condition; while (x) { ... x=0; }
безкоштовно, просто більше коду. Те ж саме і з c-стилем for
.