これは最近の課題のバージョンです。この数値は-2の整数乗ですか?問題の興味深い性質を強調し、課題をより困難にするために設計されたさまざまな基準を使用します。ここで考慮します。
リンクされた質問でTobyが素晴らしく述べた挑戦は、次のとおりです。
整数が2の正確なべき乗であるかどうかを判断する賢い方法があります。それはもはや興味深い問題ではないので、与えられた整数が-2の正確なべき乗であるかどうかを判断しましょう。例えば:
-2 => yes: (-2)¹ -1 => no 0 => no 1 => yes: (-2)⁰ 2 => no 3 => no 4 => yes: (-2)²
ルール:
- 整数は、64ビット、符号付き、2の補数です。これは、使用できる唯一のデータ型です。
- 次の操作のみを使用できます。これらはそれぞれ1つの操作としてカウントされます。
n << k、n >> k:左/右シフトnによってkビット。符号ビットは右シフトで拡張されます。n >>> k:右シフトしますが、符号ビットを拡張しません。0がシフトインされます。a & b、a | b、a ^ b:ビット単位のAND、OR、XOR。a + b、a - b、a * b:乗算、減算、追加。~b:ビット単位の反転。-b:2の補数の否定。a / b、a % b除算(整数の商、0に向かって丸める)、およびモジュロ。- 負の数のモジュロはルール使用C99で指定する:
(a/b) * b + a%b等しいものとしますa。そう5 % -3です2、と-5 % 3あります-2。 5 / 3is1、5 % 3is2、as 1 * 3 + 2 = 5-5 / 3is-1、-5 % 3is-2、-1 * 3 + -2 = -5。5 / -3is-1、5 % -3is2、-1 * -3 + 2 = 5-5 / -3is1、-5 % -3is-2、1 * -3 + -2 = -5。- Pythonの
//フロア除算演算子は、ここでは除算の「0に向かう丸め」プロパティを%満たさず、Pythonの演算子も要件を満たしていないことに注意してください。
- 負の数のモジュロはルール使用C99で指定する:
- 割り当ては操作としてカウントされません。Cの場合と同様に、代入は代入後の左側の値に評価されます:に
a = (b = a + 5)設定さbれa + 5、次にに設定さaれb、1つの操作としてカウントされます。 - 複合割り当ては、1つの操作として
a += b意味a = a + bおよびカウントに使用できます。
- 整数定数を使用できますが、何もカウントされません。
- 操作の順序を指定する括弧は許容されます。
- 関数を宣言できます。関数宣言は、ユーザーにとって便利な任意のスタイルにすることができますが、有効なデータ型は64ビット整数のみであることに注意してください。関数宣言は操作としてカウントされませんが、関数呼び出しは1つとしてカウントされます。また、明確にするために、関数には複数の
returnステートメントを含めることができreturn、任意のポイントからのsが許可されます。return自身の操作としてカウントされません。 - 変数を無料で宣言できます。
- あなたは使用することができ
while、ループをしますが、使用することはできませんifかfor。while条件で使用される演算子はスコアにカウントされます。whileループは、条件がゼロ以外の値に評価される限り実行されます(この概念を持つ言語の「真の」0は有効な結果ではありません)。早期返却が許可されているためbreak、使用も許可されています - オーバーフロー/アンダーフローは許可され、値のクランプは行われません。操作が実際に正しく行われ、64ビットに切り捨てられたかのように扱われます。
スコアリング/勝利基準:
入力が-2の累乗の場合、コードはゼロ以外の値を生成する必要があり、そうでない場合はゼロを生成する必要があります。
これはatomic-code-golfです。スコアは、実行時に実行される操作の総数ではなく、コードに存在する操作の総数(上記で定義)です。次のコード:
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つの操作が含まれます:関数内の2つ、および3つの関数呼び出し。
結果をどのように表示するか、言語で便利なものを使用するか、最終的に結果を変数に保存するか、関数から返すかなど、何でもかまいません。
勝者は、明らかに正しい(必要に応じてカジュアルまたは正式な証拠を提供する)投稿であり、上記のように最も低いスコアを持ちます。
ボーナス非常にハードモードチャレンジ!
パーティーで人々を感動させる潜在的な能力以外に絶対に勝つチャンスがないように、whileループを使用せずに答えを提出してください!これらが十分に提出された場合、勝者グループを2つのカテゴリ(ループありとなし)に分割することも検討できます。
注:32ビット整数のみをサポートする言語でソリューションを提供する場合は、説明で64ビット整数が正しいことを十分に正当化することを条件に、そうすることができます。
また、特定の言語固有の機能は、ルールを回避しないが、上記のルールに従って動作するように言語を強制する必要がある場合、無料で許可される場合があります。たとえば、(真理値)0を持つ言語の回避策として、条件全体に適用した場合、ループでの0以外の自由な比較を許可しwhileます。これらのタイプの事柄を利用しようとする明確な試みは許可されません。たとえば、「真の」0または「未定義」の値の概念は上記のルールセットに存在しないため、これらは当てにならない場合があります
m ^= s、それはまだ印象的だ、と私はさらにそれを改善するための置換を作るために、完全にOKだろうと思います。
whileし、breakではなくif?if (x) { ... }はと同等while (x) { ... break; }です。
breakそして、早期のリターンは残念な部分です)、長い物語であり、将来の挑戦のためのルールで学んだ教訓です。常に「ボーナス」バージョンがあります!:)
ifとfor禁止されていますか?int x=condition; while (x) { ... x=0; }無料で、さらに多くのコードがあります。c-styleでも同じですfor。