この数値は-2の整数乗ですか?


41

数値が2のべき乗かどうかを判断する賢い方法があります。これはもはや興味深い問題ではないので、与えられた整数が-2の整数のべき乗かどうかを判断しましょう。例えば:

-2 => yes: (-2)¹
-1 => no
0 => no
1 => yes: (-2)⁰
2 => no
3 => no
4 => yes: (-2)²

ルール

  • プログラムまたは関数を作成し、入力を受け取って出力を提供する標準的な方法を使用できます。

  • 入力は単一の整数であり、整数が-2の整数乗である場合は出力が真実の値であり、それ以外の場合は偽の値である必要があります。他の出力(警告メッセージなど)は許可されません。

  • 通常の整数オーバーフロールールが適用されます。ソリューションは、すべての整数がデフォルトで制限されていない仮想バージョン(または実際のバージョン)の任意の大きな整数で動作できる必要がありますが、実装によりプログラムが実際に失敗する場合それほど大きな整数をサポートしていなくても、ソリューションは無効になりません。

  • 任意のプログラミング言語を使用できますが、これらの抜け穴はデフォルトでは禁止されています。

勝利条件

これは、コンテストです。(選択したエンコーディングで)バイト数が最も少ない答えが勝者です。


17
@KritixiLithosなぜそうなのかわかりません。次のiような整数はありません(-2)^i = 2
致命的

2
指数は正ですか、-0.5それは2 ^(-1)なので有効です 。
ミスターXcoder

1
@ Mr.Xcoder、入力は常に整数値であるため、負の指数は必要ありません(または不可能です)。
トビー・スペイト

1
多分に対し@SIGSEGV i自然ではありません
氏Xcoder

2
@Jason、あなたの言語でサポートされている/自然なもの-3番目のルールを参照してください。そして、ここで話題になるための客観的な勝利基準が必要なため、コードゴルフです。「快適なソリューション」はそれを削減しません(私はMathematicaの答えが好きですが-それは私を驚かせました)。
トビーSpeight

回答:


26

Mathematica、22バイト

EvenQ@Log2@Max[#,-2#]&

オンラインでお試しください!(代わりにMathicsを使用します。このソリューションも機能します。)

私はしばらくの間ビット演算子を使用した解決策を見つけようとしましたが、間違いなく存在する一方で、おそらくもっと簡単なものを見つけました:

  • Max[#,-2#]負の場合、入力に-2を乗算します。-2の別の係数を乗算しても、値が-2の累乗であるかどうかは変わりません。しかし、今のすべての奇数の力は-2の偶数乗になってきた-2
  • ただし、-2の累乗でも2の累乗であるため、単純なものLog2@...を使用して、結果が整数かどうかを確認できます(2の累乗かどうかを確認するため)。これにより、すでに2バイトを節約できますLog[4,...]-2の累乗を調べる別の方法)。
  • 追加ボーナスとして、値が偶数の整数はちょうどそれが整数だかどうかをチェックするよりも短くなっているかどうかを確認する:私たちは使用して3つのバイトを保存することができますEvenQ代わりにIntegerQ

-2の累乗も4の整数乗であると考えるのに役立ちますか?私は、すべてをポジティブにするために-2を掛けるというアイデアが好きです。
トビー

5
@TobySpeightそれらを2のべき乗として扱うと、実際には5バイト節約されます。私が最初に4の力を使用しますが、Log[4,...]より長いLog2@...IntegerQより長いですEvenQ
マーティンエンダー


12

Python、46バイト

@ovsのおかげで-2バイト。

def g(x):
 while x%-2==0!=x:x/=-2
 return x==1

用途のある機能:

g(4) # put your number between the brackets

オンラインでお試しください!


print g(8)プリントFalse
フェリペナルディバティスタ

2
@FelipeNardiBatistaはそうではないでしょうか?
氏Xcoder

2
申し訳ありませんが、私の例は悪い例でしたprint g(4)、同じことをします
フェリペナルディバティスタ

そこに小さな誤差が、あるすぐにそれを固定し、待って
氏Xcoder

1
私が置かれている;代わりに、改行のを...そのため申し訳ありません。@FelipeNardiBatistaを修正
Mr. Xcoder

11

ゼリー、6バイト

b-2S⁼1

オンラインでお試しください!

これはゼリーは整数変換方法に基づいてNを任意のベースにB変換することによってそうすること、Nの各整数数字である配列に、D(のNB値を有することができ、0≤ VのD < B。ここでは、右から0インデックスの数字を使用するため、すべての数字がV d B dを追加してNを形成します。VがD < BVのDの B D < BB D = BとD +1したがって、すべての可能なNBの先頭の0を無視すると、Nには一意の表現が1つしかありません。

ここで、d =入力、B = -2。N = B D = 1つのBのD = VのDの BのD ⇔1= VのDVのD = 1、そして、私たちはの力の他の倍数追加していないので、Bを、他のすべてのVは、今のところは0になり、配列は、d 0 と連結された1でなければなりません。Jellyは左から1インデックスになるので、配列の最初の要素が1で、他のすべての要素が0であるかどうかを確認する必要があります。

うーん...すべて良いですよね?番号?どうしたの?そうそう、もっといいアイデアがある!最初に、配列内のすべての整数の合計を取り、それを整数配列であり、ベース-2の数値ではないものとして扱います。それが1である場合、それが唯一の1であり、先頭のゼロが存在することができないので、他のすべての整数が0の場合を除いて、0であることを意味-2(とにかく合計が0≠1になる場合)、最初の整数はゼロ以外でなければなりません。配列内のゼロ以外の整数は1のみであるため、最初の整数でなければなりません。したがって、これは、正の整数のペアの最小の合計がΣ{1,1} = 2であるため、配列内のすべての整数の合計が1になる唯一のケースです。最小の正の整数は1であるためです。 。ベース表現のすべての整数は負ではないので、合計が1になる唯一の方法は1のみで、他のすべての整数は0です。したがって、すべての整数の合計が配列は1です。

コードの機能は次のとおりです。

b-2S⁼1 Main link. Arguments: d
b-2    Convert d to base -2.
   S   Take the sum.
    ⁼1 Check if the sum is equal to 1.

1
ふぅ、その説明は...書き込みに時間がかかった
エリックOutgolfer

それでは、長いプログラムの説明がどのようになるかを見
たくありません...-boboquack

1
@boboquackここで、ベース変換を使用する理由を説明します。長いプログラムの説明がこれほど長くなるとは思わない。投稿には最大30000個のマークダウン文字を含めることができ、長いプログラムの説明はとにかく簡潔になります。また、私はずっと長い説明を読みました、そして、それらはそれほど退屈ではありません。
エリックアウトゴルファー



10

Excel、40 36バイト

CallumDAにより4バイト保存

Excelは確かにそれを行うことができますが、エラーを修正すると11バイトが追加されます

=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1

入力はcell A1です。出力はTRUEまたはFALSE

false値に対してエラーFALSEまたは#NUM!エラーのいずれかを返すことが許可された場合、25バイトのみになります。

=-2^IMREAL(IMLOG2(A1))=A1

ここに小さな改善があります:=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1
CallumDA

1
@CallumDAありがとう!複素数関数を使用する方法を考えてみましたが、思いついたものはすべて長くなりました。
エンジニアトースト

9

05AB1E、8バイト

Y(IÄÝm¹å

オンラインでお試しください! またはテストスイートとして

説明

Y(         # push -2
  IÄÝ      # push range [0 ... abs(input)]
     m     # element-wise power
      ¹å   # check if input is in the resulting list

なぜ下票なのですか?
クリチキシリソス

@KritixiLithos:誰かがすべてのゴルフ言語を支持しているようです。
エミグナ

6
それにも気づきました。私は長い間PPCGを使用していませんが、ゴルフ言語の3バイトのソリューションよりも、標準言語の創造的で興味深いソリューションの方がはるかに高く評価されていることを学びました。ただし、すべてが組み込まれていると考えているために、(残念ながら)ゴルフ言語で非常に創造的なソリューションに投票する人もいます。すばらしいソリューション@Emignaの+1
Mr Xcoder

ÄLY(småO8のY(sÄLm¢Z8のために...ネヴァーマインド、すべて8
マジックタコ壺

9

JavaScript(ES6)、37 28 24バイト

f=x=>!x|x%2?x==1:f(x/-2)

Arnauldのおかげで4バイト節約されました。

f=x=>!x|x%2?x==1:f(x/-2)

console.log(f(-2));
console.log(f(-1));
console.log(f(0));
console.log(f(1));
console.log(f(2));
console.log(f(3));
console.log(f(4));


[コードスニペットを実行]をクリックすると、いくつかのエラー(true / false値の前)が表示されるのはなぜですか?
numbermaniac

@numbermaniacよくわかりませんが、ES6を完全にサポートしていないブラウザを使用しているのでしょうか?
トム

エラーは発生しませんでした。初めて何が起こったのかわからない。
-numbermaniac


8

MATL9 8バイト

2_y|:q^m

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

-8例として入力を検討する

2_    % Push -2
      % STACK: -2
y     % Implicit input. Duplicate from below
      % STACK: -8, -2, -8
|     % Absolute value
      % STACK: -8, -2, 8
:     % Range
      % STACK: -8, -2, [1 2 3 4 5 6 7 8]
q     % Subtract 1, element-wise
      % STACK: -8, -2, [0 1 2 3 4 5 6 7]
^     % Power, element-wise
      % STACK: -8, [1 -2 4 -8 16 -32 64 -128]
m     % Ismember. Implicit display
      % STACK: 1

あなたの説明を正しく理解していれば、inputが与えられると、中間ステップとしてnサイズの配列が作成さnれます。ここでは効率性が基準ではないという良い仕事です!
トビースパイト

2
@Tobyもちろん!これは効率性を重視するコードゴルフですか?:-D
ルイスメンドー


6

PHP、41バイト

for(;$argn%-2==0;)$argn/=-2;echo$argn==1;

PHP、52バイト

echo($l=log(abs($argn),2))==($i=$l^0)&&$argn>0^$i%2;

PHP、64バイト

正規表現の使用

echo preg_match("#^".($argn>0?1:"1+0")."(00)*$#",decbin($argn));

5

Python 3、34バイト

lambda n:n==(-2)**~-n.bit_length()

5

JavaScript(ES6)、21バイト

0またはを返す再帰関数true

f=n=>n==1||n&&f(n/-2)

使い方

これには、入力が-2の正確なべき乗でない場合に再帰を早期に停止するための明示的なテスト(n奇数であるabs(n)、1より小さいなど)は含まれません。

またはのnいずれかと正確に等しい場合にのみ終了します。10

ただし0算術アンダーフローのため、IEEE-754 floatは2(または-2)で十分な回数で除算されると最終的に丸められるため、これは機能します。

テストケース



4

Java 7、55バイト

boolean c(int n){return n==0?0>1:n%-2==0?c(n/-2):n==1;}

説明:

boolean c(int n){  // Method with integer parameter and boolean return-type
  return n==0 ?    //  If n is zero:
    0>1//false     //   Return false
   : n%-2==0 ?     //  Else-if n mod -2 is zero:
    c(n/-2)        //   Recursive call for the input divided by -2
   :               //  Else:
    n==1;          //   Return if n is one
}                  // End of method

テストコード:

ここで試してみてください。

class M{
  static boolean c(int n){return n==0?0>1:n%-2==0?c(n/-2):n==1;}

  public static void main(String[] a){
    for(int i = -2; i <= 4; i++){
      System.out.println(i + ": " + c(i));
    }
  }
}

出力:

-2: true
-1: false
0: false
1: true
2: false
3: false
4: true

非再帰的な方法は5バイト短くなりますboolean c(int n){while(0==n%-2)n/=-2;return 1==n;}
オリビエグレゴワール

OlivierGrégoire@残念ながら1が動作しないことをn=0ので、Javaで0%-2==0なりtrueそして0/-2まだ0私が追加した理由で無限ループ、原因、n==0?0>1私の再帰的な方法に一部を。
ケビンCruijssen

きれいに見つけた!
オリビエグレゴワール

4

ハスケル、24の 23バイト

f 0=0
f 1=1
f n=f(-n/2)

-2のべき乗などfを返す関数を定義します。10

他の挑戦への私の最初の提出のゴルフ版。


3

Javascript(ES7)、45バイト

x=>-1**Math.log2(Math.abs(x))*Math.abs(x)==x

Math.abs(x)はx> 0?x:-xよりも長く、11バイトから8バイトです。また、-1 ...の代わりに-2 ** ...を実行して、2番目のMath.abs(x)
fəˈnɛtɪk

これでES7固有のものは何ですか?
アルジュン

@ DobbyTheFree-Elf、**です。
-Qwertiy

3

Perl 6、21バイト

{$_==(-2)**(.lsb//0)}

それを試してみてください

拡張:

{  # bare block lambda with implicit parameter 「$_」

  $_                  # is the input
  ==                  # equal to
  (-2)**( .lsb // 0 ) # -2 to the power of the least significant bit of the input
}

なお、0.lsbリターンNil番号として使用される場合に警告を生成し、そのように定義され、またはオペレータが  //使用されます。
(を考える//など||異なる傾斜の)

用語が予想されるインボカントのないメソッド呼び出しは、暗黙的に呼び出され$_ます。(.lsb

でも動作し.msbます。


私はこれが好きです!
tale852150


3

Python、24バイト

lambda n:n*n&n*n-1<n%3%2

オンラインでお試しください!

ビットトリックは、2のべき乗(または)k&k-1==0かどうかをチェックします。これをasでチェックすると、2のべき乗かどうかがわかります。kk==0k=n*nn*n&n*n-1==0abs(n)

n-2の累乗であるかどうかをさらに確認するには、それだけをチェックする必要がありn%3==1ます。これは、mod 3、値-2が1であるため機能します。したがって、べき乗は1です。これに対して、否定は2 mod 3であり、もちろん0は0 mod 3になります。

私たちは、チェックを組み合わせるn*n&n*n-1==0と、n%3==1単一の式に。最初は<1for ==0で書くことができます。決して負ではないからです。n%3==1同等であるn%3%20または1を与えるので、私たちは、それらを組み合わせることができますn*n&n*n-1<n%3%2


2

R、22バイト

stdinから入力を取得し、TRUEそれにFALSE応じて返します。

scan()%in%(-2)^(0:1e4)

Rのサイズ制限までの整数に対してのみ機能するため、これが有効な答えであるとは100%確信が持てません。ただし、ルールの状態は次のとおりです。

通常の整数オーバーフロールールが適用されます。ソリューションは、すべての整数がデフォルトで制限されていない仮想バージョン(または実際のバージョン)の任意の大きな整数で動作できる必要がありますが、実装によりプログラムが実際に失敗する場合それほど大きな整数をサポートしていなくても、ソリューションは無効になりません。

制限のない整数を許可する仮想バージョンのR では、同じバイトカウントに対して次のコードを使用できます。

scan()%in%(-2)^(0:Inf)

もちろん、実際のRでは、上記のコードは単にを与えError in 0:Inf : result would be too long a vectorます。


2

bc 88バイト

bc -l <<< "n=$1;q=l(sqrt(n*n));p=4*a(1);((n<1)*c(q/l(2)*p/2)+(n>1)*(s(q/l(4)*p)))^2==0"

私はこれをファイルneg2.shに入れて、それ以外の1力のために印刷します-20

私はそれが本当に長いことを知っていますが、楽しかったです

テスト

$ for i in {-129..257}; do echo -n "$i: "; ./neg2.sh $i; done | grep ': 1'
-128: 1
-32: 1
-8: 1
-2: 1
1: 1
4: 1
16: 1
64: 1
256: 1

説明

本体には2つの半分があり、両方ともの累乗でゼロに等しくなろうとしています-2

q=l(sqrt(n*n))               % ln of the absolute value of the input
p=4*a(1)                     % pi: arctan(1) == pi/4
q/l(2) -> l(sqrt(n*n))/l(2)  % change of base formula -- this gives
                             % the power to which 2 is raised to equal
                             % sqrt(n*n). It will be an integer for 
                             % numbers of interest
n<1                          % 1 if true, 0 if false. for negative
                             % numbers check for powers of 2
n>1                          % for positive numbers, check for powers
                             % of 4
c(q/l(2)*p/2)                % cos(n*pi/2) == 0 for integer n (2^n)
s(q/l(4)*p)                  % sin(n*pi) == 0 for integer n (4^n)
(....)^2==0                  % square the result because numbers are
                             % not exactly zero and compare to 0

私は三角法を期待していませんでした!いい答えだ!
トビーSpeight


2

フーリエ、53バ​​イト

I~X1~N~G0(0-2*G~GX*X~PG*G>P{1}{0~O~N}G{X}{1~O0~N}N)Oo

これについては後でゴルフに取り組みますが、概要は次のとおりです。

X = User input
G = N = 1
Loop until N = 0
    G = -2 * G
    P = X*X 
    If G*G > P then
        N = O = 0
    End if
    If G = X then
        O = 1
        N = 0
    End if
End loop
Print O

出力は、どこ0のためfalsey1するためにtruthy

オンラインでお試しください!


アルゴの説明では、P変数を使用せず、If G * G> X * X then ...?
RosLuP

@RosLuPそれは良いでしょうが、フーリエは単にそれを次のように扱います(G*G > X)*X
ベータ崩壊

2

カシオベーシック、76バイト

76バイトは、私の計算機で言うことに注意してください。

?→X
0→O
While Abs(X)≥1
X÷-2→X
If X=1
Then 1→O
IfEnd
WhileEnd
O

これはカシオベーシックへの私の最初のベンチャーです...私は電卓でこのようなまともなプログラムを書くことができることに気づきませんでした:D


1

Python 2.7、40バイト

a=input()
while a%-2==0:a/=-2
print a==1

長さ43バイトの元のコードに対するMr. Xcoderのクレジット。コメントするのに十分な評判がないので、別の回答として投稿する必要がありました。


私は回答バージョンをユニバーサルにしたので、同じことです。Python2と3の両方で動作します。Python3でこれを行う場合は、次int(input())の制限を超えていたはずです。def様機能。さらに、Python 3ではprint()、無駄になる1バイトを使用する必要があります。これはPython 3で、それは...長くなるので、私は、そのように選んだ理由の
氏Xcoder

1

網膜、27バイト

+`(1+)\1
$1_
^(1|-1_)(__)*$

オンラインでお試しください!

Retinaの標準である単項入力を受け取ります。最初の2行は、チュートリアルエントリの最初の2行のコードに基づいて、部分的な単項からバイナリへの変換を行います(余分な1sはいずれにしても一致を失敗させます)。最後の行は、4のべき乗または負の奇数乗2つの。

+`(1+)\1\1\1
$1_
^(-1)?1_*$

オンラインでお試しください!

今回は、部分単項から基底4への変換を行います。4の^1_*$べき乗は2の負の奇数のべき乗として終了します^-11_*$

+`\b(1111)*$
$#1$*
^(-1)?1$

オンラインでお試しください!

今回は、できるだけ4で割って、最後1または-11最後にチェックします。

+`\b(1+)\1\1\1$
$1
^(-1)?1$

オンラインでお試しください!

4で割る別の方法。まだ迷惑な27バイト...


1

スキーム、60バイト

(define(f n)(cond((= 1 n)#t)((<(abs n)1)#f)(#t(f(/ n -2)))))

再帰的なソリューション。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.