Це версія недавнього виклику. Чи є це число цілою потужністю -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заяв, іreturns з будь-якої точки дозволено. 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.