Cyclops番号ですか?"誰も知らない!


66

仕事:

整数の入力が与えられたら、それがサイクロプス数であるかどうかを判断します。

Cyclops番号とは何ですか?まあ、それはバイナリ表現0が中央に1つしかない数値です!

テストケース:

Input | Output | Binary  | Explanation
--------------------------------------
0     | truthy | 0       | only one zero at "center"
1     | falsy  | 1       | contains no zeroes
5     | truthy | 101     | only one zero at center
9     | falsy  | 1001    | contains two zeroes (even though both are at the center)
10    | falsy  | 1010    | contains two zeroes
27    | truthy | 11011   | only one zero at center
85    | falsy  | 1010101 | contains three zeroes
101   | falsy  | 1100101 | contains three zeroes
111   | falsy  | 1101111 | only one zero, not at center
119   | truthy | 1110111 | only one zero at center

入力:

  • 整数型または同等の型。(intlongdecimal、等)

  • 入力を評価した結果、整数オーバーフローまたはその他の望ましくない問題が発生した場合、その入力を評価する必要はないと想定します。

出力:

  • 真実または偽。

  • 真実/偽の出力は、真実/偽の使用言語の仕様を満たしている必要があります。(たとえば、Cは0falseであり、非ゼロはtrueです)

チャレンジルール:

  • 0より小さい入力は偽であると想定されるため、評価する必要はありません。

  • 数値のバイナリ表現の長さが偶数の場合、その数値をシクロプス数にすることはできません。

一般的なルール:


これは私の最初のプログラミングパズルとコードゴルフのチャレンジなので、どのように改善すべきかについてのフィードバックは大歓迎です!


25
注:これはA129868
tsh

35
タイトルにある2800年後期のポップカルチャーリファレンスの+1
Sanchises

テストされる最大数は何ですか?
Serverfrog

@Serverfrogは制限を指定しなかったため、任意の正の整数をテストできると想定しています。
タウ

バイナリ入力は許可されていますか?
Qwertiy

回答:


11

Japt、8バイト

1¥¢q0 äè

オンラインで実行する

説明:

1¥¢q0 äè   
                                                              119
  ¢          // Convert the input into a binary string        "1110111"
   q0        // Split the string on "0"                       ["111","111"]
      ä      // Reduce each item by:                            a     b
       è     //   Seeing how many times a is found in b       [1]
 1¥          // == 1; See if the result equals 1              True                                         

アイデアはでバイナリストリングを分割する0ことです、1つだけがあるなら2つの項目をもたらすでしょう0。次に、最初の項目が2番目の項目と一致するかどうかを確認して、それが回文的であることを確認します。バイナリ文字列に複数0のが含まれている場合、reduceは複数アイテムの配列を返し、==1条件に失敗します。バイナリ文字列に1が含まれている0が、回文ではない場合、の一致が含まれているためäè返さ0bます。0a


1
ここで何が起こっているのかを見るために、数秒前にカフェイン入りの脳を取りました!よくできました。動作するはずです。
シャギー

1
私はJaptを知りませんが、正しく理解すれば以下を実行します。¤=バイナリに変換; q0= 0で分割。äèよくわかりません。フラグは-Nにリストを変換しNaNますが、葉01同じ。以下のためにäè一部私は見ることができ119ている[111,111]スプリット、後äèに変更します1。そして、85ある[1,1,1,1]スプリット、後äèに変更[1,1,1]。仕組みを説明し.ä("è")てください。
ケビンクルーイッセン

2
@KevinCruijssen説明を追加しました。それがお役に立てば幸いです。
オリバー

1
NaNJaptには偽りがありますか?(あなたが条件としてそれとのif-elseを実行した場合に実行取得した場合、すなわち?「Truthy / falsy出力はtruthy / falsyのために使用される言語の仕様を満たしていなければなりません」ん)また、2利回り2私は疑うfalseyである(しかし、JAPT場合があります05AB1Eのような)。
ジョナサンアラン

1
JSは、0真理と見なされる整数以外の整数を想定しています...ただし、真理として2返さ2れる場合は、このサブミッションを修正する必要があります。
タウ

21

Python 2、30バイト

lambda n:(2*n^2*n+3)**2==8*n+9

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

これ2*n^2*n+3はPythonの演算子の優先順位であるため、2*nand のビット単位のxorであることに注意してください2*n+3


1
返すために許容可能であるlambda n:(2*n^2*n+3)**2-8*n-9の戻り値で、0サイクロプス番号の?
エリックドゥミニル

2
これによりTRUEn = -1
user2390246

3
@ user2390246この問題は明らかにネガティブを対象としていません。もしそうなら、すべての受け入れソリューションはネガティブである必要があります(そしてPythonが整数を実装する方法はソリューションがPythonで受け入れられないことを意味します)
DreamConspiracy

3
@SolomonUckoの負の数は通常、2の補数表現で保存されます。最初の固定サイズの整数(たとえば32ビット)を検討してください。他のプロパティの中でも、TCRでは、MSBが負の数値で1、正の数値で0であることが必要です。これは、すべての正の出力が偽であることを直ちに必要とします。pythonではさらに問題があります。負の数は、暗黙的に最上位方向に1の無限のシーケンスを持ちます。その真ん中を見つけようとして頑張ってください
DreamConspiracy

2
@ user2390246その後、問題は編集され、コードがネガに対して機能する必要がないことを明確にしました。を追加することで2バイト処理できます>1
xnor

18

x86マシンコード、17バイト

8D 47 01 31 F8 89 C2 F7 D2 0F AF C2 8D 44 78 02 C3

上記のバイトは、32ビット整数の入力値を受け入れる関数を定義します(EDIこの例のレジスターでは、一般的なSystem V呼び出し規約に従っていますが、結果のサイズに影響を与えることなく、必要な入力レジスターを実際に選択できます)コード)、EAX入力値がCyclops数であるかどうかを示す結果(レジスター内)を返します。

チャレンジルールでは負の値を無視できると規定されているため、入力は符号なし整数と見なされます。

n=(2k+1)(2k11)

注:戻り値は真実/虚偽ですが、セマンティクスは逆になり、関数はCyclops数に対して虚偽を返します。マシンコードには「真実/偽物の仕様」がないため、これは合法だと主張しています。これは質問の要件です。(これが不正行為だと思われる場合、代替バージョンについては以下を参照してください。)

アセンブリ言語のニーモニックでは、これは次のとおりです。

; EDI = input value
; EAX = output value (0 == Cyclops number)
8D 47 01           lea    eax, [edi + 1]          ; \ EAX = ((EDI + 1) ^ EDI)
31 F8              xor    eax, edi                ; /
89 C2              mov    edx, eax                ; \ EDX = ~EAX
F7 D2              not    edx                     ; /
0F AF C2           imul   eax, edx                ; EAX *= EDX
8D 44 78 02        lea    eax, [eax + edi*2 + 2]  ; EAX  = (EAX + (EDI * 2) + 2)
C3                 ret                            ; return, with EAX == 0 for Cyclops number

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


約束されたように、実際の標準や規約がないマシンコードでも真実/偽のセマンティクスを逆にするのはごまかしだと思うなら、さらに21バイト、さらに3バイトを追加します

; EDI = input value
; AL  = output value (1 == Cyclops number)
8D 47 01           lea    eax, [edi + 1]          ; \ EAX = ((EDI + 1) ^ EDI)
31 F8              xor    eax, edi                ; /
89 C2              mov    edx, eax                ; \ EDX = ~EAX
F7 D2              not    edx                     ; /
0F AF C2           imul   eax, edx                ; EAX *= EDX
8D 44 78 01        lea    eax, [eax + edi*2 + 1]  ; EAX  = (EAX + (EDI * 2) + 1)
40                 inc    eax                     ; EAX += 1
0F 94 C0           setz   al                      ; AL = ((EAX == 0) ? 1 : 0)
C3                 ret                            ; return, with AL == 1 for Cyclops number

このコードの前半は元のコードと同じです(imul命令を下に向かって)。これleaはほぼ同じですが、定数2を追加する代わりに、定数1を追加するだけです。これは、次のinc命令EAXがフラグを設定するためにレジスタ内の値を1 インクリメントするためです。「ゼロ」フラグが設定されている場合、setz命令はAL1に設定されます。それ以外の場合はAL0に設定されます。これは、Cコンパイラがを返すマシンコードを生成する標準的な方法ですbool

lea命令に追加された定数を変更してもコードサイズは変わらず、inc命令は非常に小さい(1バイトのみ)が、setz命令はかなり3バイトです。残念ながら、これを書く短い方法は考えられません。


4
これは非常に高速です。すべての数値を大きな値までテストすることで、誇示する価値があると思います。オンラインで試してください!
デッドコード

@Deadcodeのように、実際にはさらに高速になります。:-)インラインアセンブリでデモを行うとオーバーヘッドが追加されますが、バイト文字列にジャンプする古い手法(たとえば、この回答を参照)がTIOのコンパイラで動作しなくなり、アセンブリに直接結果を出力するコードの記述が多すぎます気にするように働く。ただし、これは、サイズの最適化が速度の最適化と矛盾することのない、これらの異常なケースの1つです。これは、サイズよりも速度を重視する場合にasmでコードを記述する方法とほぼ同じです。
コーディグレイ

コンセンサスにより、asm提出codegolf.stackexchange.com/a/165020/84624およびstackoverflow.com/questions/48381234/…でステータスフラグを返すことは受け入れられません。もしそうなら、あなたはできる-あなたの2番目の答えから3。
640KB

9

正規表現(ECMAScript)、60 58 57 60 58バイト

nx

ネタバレ警告:この正規表現は、一般化された乗算アルゴリズムの変形を使用します。これは自明ではなく、自分で解決する価値のあるパズルになる可能性があります。詳細については、「Rocco番号の検索」のこの形式のアルゴリズムの説明を参照してください。

z
z

これは、を見つけることで機能しますzn=2(nz)+z+1n

^(x*)(?!(x(xx)+)\2*$)(x(x*))(?=(?=(\4*)\5+$)\4*$\6)x\1$|^$

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

^                 # N = tail
(x*)              # tail = Z, with the smallest value that satisfies the following
                  # assertions (which is no different from the largest value that
                  # would satisfy them, since no more than one value can do so);
                  # \1 = N - Z

(?!(x(xx)+)\2*$)  # Assert Z is a power of 2

# Assert Z is a perfect square, and take its square root
(x(x*))           # \4 = square root of Z; \5 = \4 - 1; tail = N - \1 - \4
(?=(\4*)\5+$)     # iff \4*\4 == Z, then the first match here must result in \6==0
(?=\4*$\6)        # test for divisibility by \4 and for \6==0 simultaneously

# Assert that N == \1*2 + \4 + 1. If this fails, then due to a golf optimization,
# the regex engine will backtrack into the capturing of \4, and try all smaller
# values to see if they are the square root of Z; all of these smaller values will
# fail, because the \4*\4==Z multiplication test only matches for one unique value
# of \4.
x\1$

|^$               # Match N==0, because the above algorithm does not

OPは0が真実であるべきだと明確にしたので、現在これは課題を解決していません。
グリムリー

1
単純ではありません^(1*)0\1$か?
の無知の

4
@EmbodimentofIgnorance入力がバイナリである場合のみ。それは多くの課題を簡単にします。該当する場合に単項入力を一貫して使用することは、はるかに興味深いです。
デッドコード

9

JavaScript(Node.js)、20バイト

p=>~p==(p^=p+1)*~p/2

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

たぶんこれは正しいでしょう。

Grimyに感謝、1バイト保存


JavaScript(Node.js)、32バイト

f=(p,q)=>p&1?f(p/2,q+q|2):!(p^q)

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


JavaScript(Node.js)、34バイト

p=>/^(1*)0\1$/.test(p.toString(2))

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



一致しないテスト
edc65

1
@ edc65失敗したテストケースは見つかりましたか?
tsh

2
@tsh .testない.match
ASCIIのみ

@ASCIIのみ
tsh



7

Mathematica(Wolfram言語)、32 31バイト

J42161217のおかげで1バイトが節約されました!

OddQ@Log2[#+Floor@Sqrt[#/2]+2]&

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

入力として整数を受け取り、Trueまたはを返す純粋な関数False。数があるという事実(証明するための楽しい!)に基づいてnいる場合サイクロプスであり、唯一の場合nの平方根プラスn/2プラスが2ダウン2の奇数乗に丸め(一つは、置き換えることができますFloorいずれかの方法でCeiling、またはRound限り、1にも置き換えられますよう+2によります+1。)True入力時に戻ります0


1
Log2[#+Floor@Sqrt...
J42161217

そして1以上使用して√()の代わりにSqrt[]
attinat

バイト数は正しいですか?TIOは、現在のプログラムに32バイトを割り当てます。
mbomb007

@ mbomb007 aha、TIOはJ42161217の1バイトの節約を組み込みませんでした。一定。
グレッグマーティン

attinatが提案したものを使用しなかった理由はありましたか?
mbomb007


5

Japt、8バイト

¢ðT ¥¢Êz

提出を修正してくれたLuis felipe de Jesus Munozに感謝します!

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

古い正規表現ベースのソリューション、15バイト

¤f/^(1*)0\1$/ l

trueの場合は1、falseの場合は0を返します。

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


よく遊んで、いつか正規表現を学ぶべきです。:) +1
Quintec

1
@Quintec Regexは素晴らしいです:)
無知の

更新:短い方法が見つかりました:)
Quintec


1
@LuisfelipeDejesusMunozありがとう、これは本当に素晴らしい==演算子の使い方です!
の無知の

4

ゼリー 8  7 バイト

-1 Erik the Outgolferに感謝します(isPalindromeビルトインを使用しŒḂ、の代わりに、⁼Ṛ$

B¬ŒḂ⁼SƊ

1(真)または0(偽)を生成する整数を受け入れる単項リンク。

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

どうやって?

B¬ŒḂ⁼SƊ - Link: integer             e.g. 1    9          13         119
B       - to base 2                      [1]  [1,0,0,1]  [1,1,0,1]  [1,1,1,0,1,1,1]
 ¬      - logical NOT (vectorises)       [0]  [0,1,1,0]  [0,0,1,0]  [0,0,0,1,0,0,0]
      Ɗ - last three links as a monad:
  ŒḂ    -   is a palindrome?             1    1          0          1
     S  -   sum                          0    2          1          1
    ⁼   -   equal?                       0    0          0          1

あなたは実際に私の前に賢いアイデアを持っているように見えますが、その賢さは明らかではありません(Bċ0⁼1ȧŒḂ8バイトでもあります)、-1 ⁼Ṛ$と同じŒḂです また、負の数を処理する必要はありません。
エリック・ザ・アウトゴルファー

エリックに感謝します。ビルトインはなんらかの理由で私の心を滑らせました!
ジョナサンアラン

実際、ṚƑ今日ではその場所で使用することもできるので、そのように覚えておくとよいでしょう(最も重要なものƑ)。
エリック・ザ・アウトゴルファー



4

Brachylog、8バイト

ḃD↔Dḍ×ᵐ≠

これは、入力がCyclops数の場合に成功し、入力がCyclops数でない場合に失敗する述語です。成功/失敗は、Brachylogで最も基本的な真実/偽の概念です。

オンラインでお試しください!または、10000までのすべての真実の出力を見つけます

説明

          Input is an integer
ḃ         Get its binary representation, a list of 1's and 0's
 D        Call that list D
  ↔       When reversed...
   D      It's the same value D
    ḍ     Dichotomize: break the list into two halves
          One of these halves should be all 1's; the other should contain the 0
     ×ᵐ   Get the product of each half
       ≠  Verify that the two products are not equal

これは、Cyclops番号を指定した場合にのみ成功します。理由は次のとおりです。

  • バイナリ表現が回文ではない場合、D↔D失敗します。以下では、それが回文だと仮定できます。
  • ゼロが複数ある場合、両方の半分には少なくとも1つのゼロが含まれます。したがって、製品は両方ともゼロになり、×ᵐ≠失敗します。
  • ゼロがない場合、両方の半分には1のみが含まれます。したがって、製品は両方とも1つになり、×ᵐ≠失敗します。
  • これにより、ゼロが1つだけである場合が残ります。パリンドロームがあることはすでにわかっているので、これが中心となるに違いありません。それは半分に表示され、その半分の積はゼロになります。残りの半分にはすべてが含まれるため、その製品は1つになります。その後、1≠0が×ᵐ≠成功し、述語全体が成功します。


3

05AB1E、8(または9)バイト

bD0¢sÂQ*

オンラインそれを試してみたり、すべてのテストケースを確認してください

1真実であれば戻ります。0または1falsey 以外の正の整数。05AB1Eでは真実のみ1であり、他のすべては偽です。しかし、これが許可された出力であるかどうか、または出力が2つの一貫した一意の値であるかどうかはわかりません。第二の場合には、末尾がΘよりので、すべての出力が他の追加することができ1なります0

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

b     # Convert the (implicit) input-integer to a binary-string
 D    # Duplicate it
  0¢  # Count the amount of 0s
 s    # Swap to get the binary again
  ÂQ  # Check if it's a palindrome
 *    # Multiply both (and output implicitly)

  Θ   # Optionally: check if this is truthy (==1),
      # resulting in truthy (1) or falsey (0)

算術的アプローチは10バイトになります。

LoD<s·>*Iå

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

a(n)=(2n1)(22n+1)

L        # Create a list in the range [1, (implicit) input-integer]
 o       # For each integer in the list, take 2 to the power this integer
  D<     # Create a copy, and decrease each value by 1
  s·     # Get the copied list again, and double each value
    >    # Then increase each value by 1
  *      # Multiply the numbers at the same indices in both lists
     Iå  # Check if the input-integer is in this list
         # (and output the result implicitly)

有する1他の言語(例えば、CおよびTI-BASIC)は類似truthy / falsy定義(両方とも0 /非ゼロ)を有するのでfalsy限りtruthyおよび他のすべての数字は、この課題のために許容可能です。真実または偽と考えられるものが言語の仕様と一致する限り、それは公正なゲームです。
タウ

3

Excel、97 63バイト

=A1=2*4^(ROUND(LOG(A1,4),0))-2^(ROUND(LOG(A1,4),0))-1

2つの数値を計算します。

最も近い4のべき乗の2倍
>Num|Binary|2*Power4|Binary
> 1| 1| 2* 1= 2| 10
> 2| 10| 2* 4= 8| 1000
> 4| 100| 2* 4= 8| 1000
> 20| 10100| 2*16=32|100000

 

1プラス4の最も近い累乗の平方根
>Num|Binary|1+√Power4|Binary
> 1| 1|1+ √1= 2| 10
> 2| 10|1+ √4= 3| 11
> 4| 100|1+ √4= 3| 11
> 20| 10100|1+ √16= 5| 101

次に、最初の数値から2番目の数値を引きます。

>Num|Binary|2*Power4|Binary|1+√Power4|Binary|a-b|Binary
> 1| 1| 2* 1= 2| 10|1+ √1= 2| 10| 0| 0
> 2| 10| 2* 4= 8| 1000|1+ √4= 3| 11| 5| 101
> 4| 100| 2* 4= 8| 1000|1+ √4= 3| 11| 5| 101
> 20| 10100| 2*16=32|100000|1+ √16= 5| 101| 27| 11011

この結果を元の数値と比較します

古い方法

=DEC2BIN(A1)=REPLACE(REPT("1",1+2*INT(IFERROR(LOG(A1,2),0)/2)),1+IFERROR(LOG(A1,2),0)/2,1,"0")

A1のLog-base-2から始め、最も近い偶数に切り捨ててから、1を加算します。

次に、その数"1"sの文字列を作成し、中間の文字をa "0"に置き換えて、常に奇数で、A1のバイナリ長と同じか1未満のバイナリ長を持つCyclops数を作成します

次に、A1のバイナリ表現と比較します


3

R37 33バイト

(x=scan())%in%(2*4^(n=0:x)-2^n-1)

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

Rにはバイナリに変換するための組み込み機能がないため、OEISの式の1つを使用して、シーケンスから用語のリストを計算しました。

n<-0:x開始値の寛大なリストを生成します。2*4^(n<-0:x^2)-2^n-1)はOEISからの式であり、入力をそのシーケンスに表示するかどうかをチェックし%in%ます。

マイナス入力を処理する必要がないため、-2バイト。-2バイトに変更できること<-を思い出してください=


3

C(gcc)、26バイト

f(n){n=~n==(n^=-~n)*~n/2;}

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

ニールの答え。実装定義の操作の順序に依存します。

C ++(clang)、38バイト

int f(int n){return~n==(n^=-~n)*~n/2;}

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

C ++では型を省略できません。clangでは戻り値を省略できません。それ以外は同一です。


1
return脆弱でプラットフォームに依存する暗黙的なアキュムレータの戻り値の悪用の代わりに、C ++の回答をCの回答と区別することを希望します。
デッドコード

2
また、ルールに標準への準拠を要求するようにしたいと思いますが、そうではないため、これを利用しないのは悪いゴルフです。C ++(clang)は戻り値を必要とし、これを38バイトにします。
Grimmy

次に、C(gcc)とC ++(gcc)の代わりにC(gcc)とC ++(clang)を回答に含めることで、これを回避できます。今やった。
デッドコード


3

J22 19 17 15 14バイト

BolceBussiereのおかげで-3バイト!

ngnのおかげで-4バイト!

Trawsのおかげで-1バイト!

J、14バイト

1=1#.(*:|.)@#:

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


1
#=1++/­­­­­­­
ngn

1
(#=1++/)@(*|.)@#:
ngn

1
1=1#.1-(*|.)@#:
ngn

1
私はそれを使用するのに十分なjは知りませんが、それはそれを短くしようとすることで、他の人のコードから学ぶ楽しい
NGN

1
-1バイト1=1#.(*:|.)@#:
トラウズ


2

アタッシュ、22バイト

{Flip@_=_∧1=0~_}@Bin

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

代替案

27バイト: {BitXor[2*_,2*_+3]^2=8*_+9}

27バイト: {BitXor@@(2*_+0'3)^2=8*_+9}

27バイト: {Palindromic@_∧1=0~_}@Bin

28バイト: {BitXor[...2*_+0'3]^2=8*_+9}

28バイト: {BitXor[…2*_+0'3]^2=8*_+9}

28バイト: {Same@@Bisect@_∧1=0~_}@Bin

29バイト: {_[#_/2|Floor]=0∧1=0~_}@Bin

30バイト: Same@Bin@{_+2^Floor[Log2@_/2]}

30バイト: {_[#_/2|Floor]=0and 1=0~_}@Bin


2

網膜0.8.238の 37バイト

.+
$*
+`^(1+)\1
$+0
10
1
^((1+)0\2)?$

オンラインでお試しください!リンクにはテストケースが含まれます。編集:明確化した後、以前のソリューションはゼロを正しく処理しませんでした。説明:

.+
$*

10進数から単項に変換します。

+`^(1+)\1
$+0
10
1

Retina wikiのメソッドを使用して、単項からバイナリに変換します。

^((1+)0\2)?$

1の前後に同じ数のs 0、または空の文字列(上記の変換でゼロを処理する方法)を確認します。


1

バッチ、39 37バイト

@cmd/cset/a"m=%1^-~%1,!(m/2*(m+2)-%1)

n=(2k+1)(2k11)m=2k1n=m2(m+2)n


1

Excel、101 107バイト

@Chronocidalのおかげで-6バイト。

=AND(ISEVEN(LOG(A1,2)),MID(DEC2BIN(A1),LEN(DEC2BIN(A1))/2+1,1)="0",LEN(SUBSTITUTE(DEC2BIN(A1),1,))=1)

3つのチェックを実行します。

  • 奇数の長さ
ISEVEN(LOG(A1,2))
  • 真ん中のキャラクターは 0
MID(DEC2BIN(A1),LEN(DEC2BIN(A1))/2+1,1)="0"
  • シングルがあります 0
LEN(SUBSTITUTE(DEC2BIN(A1),1,))=1

1
変更することで、6つのバイトを保存ISODD(LEN(DEC2BIN(A1)))するISEVEN(LOG(A1,2))
Chronocidal


1

VBA、41 36バイト

x=2^Int([Log(A1,4)]):?[A1]=2*x^2-x-1

明示的宣言をオフにして、イミディエイトウィンドウで実行します。入力はA1アクティブシートのセルです。イミディエイトウィンドウにTrue / Falseを出力します。

Excel Answerと同じロジックを使用して、同じビット数のCyclops番号(または偶数がある場合は1ビット短い!)を見つけ、それを入力と比較します。

フォームにそれらを減少させることによって、サイクロプス番号を計算いくつかのバイトを節約するy = 2x^2 - x - 1x = n-1ためのn番目のサイクロプス番号、またはx = 2^Int(Log([A1])/Log(4))変数Xのビットの同等あまりまたは番号と最大サイクロプス番号を見つける)と格納

テイラー・スコットのおかげで-5バイト!)


1
ログの分割を使用してログのベースを変換する代わりに、次のように[...]表記法を使用して直接変更することができます[(Log(A1,4)]
Taylor Scott

1

PHP、74バイト

function($x){return($c=strlen($a=decbin($x)))&1&&trim($a,1)===$a[$c/2|0];}

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

完全に素朴な非数学的なアプローチ、単なる文字列。

function cyclops( $x ) {
    $b = decbin( $x );     // convert to binary string (non-zero left padded)
    $l = strlen( $b );     // length of binary string
    $t = trim( $b, 1 );    // remove all 1's on either side
    $m = $b[ $l / 2 |0 ];  // get the middle "bit" of the binary string
    return 
        $l & 1 &&          // is binary string an odd length?
        $t === $m;         // is the middle char of the binary string the same as
                           // the string with left and right 1's removed? (can only be '0')
}

または、上記の @Chronocidalのアルゴリズムに基づいて60バイト

function($x){return decbin($x)==str_pad(0,log($x,2)|1,1,2);}

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


1

Haskell、82バイト

import Text.Printf
(`all`[(==)<*>reverse,("0"==).filter(<'1')]).flip($).printf"%b"

そして、xnorのPythonソリューションの移植版:

Haskell、47バイト

import Data.Bits
\n->(2*n`xor`(2*n+3))^2==8*n+9
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.