ドラゴンカーブシーケンス


23

ドラゴン曲線配列(または通常の紙折り配列)がバイナリシーケンスです。 a(n)は、の最下位1の左ビットの否定によって与えられnます。たとえば、計算するにa(2136)は、まずバイナリに変換します。

100001011000

最下位ビットを見つけます

100001011000
        ^

少し左へ

100001011000
       ^

そしてその否定を返します

0

仕事

入力として正の整数を指定すると、output a(n)。(整数またはブール値で出力できます)。バイト単位で測定したコードをできるだけ小さくすることを目指してください。

テストケース

以下は最初の100エントリです。

1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 1


9
の最下位ビットは100001011000です0。意味のないもの1ですか?
散布

回答:


16

Mathematica 25バイト

1/2+JacobiSymbol[-1,#]/2&

これを行う他の方法:

56バイト

(v:=1-IntegerDigits[#,2,i][[1]];For[i=1,v>0,i++];i++;v)&

58バイト

1-Nest[Join[#,{0},Reverse[1-#]]&,{0},Floor@Log[2,#]][[#]]&

3
うわー!数学の答えであり、組み込みだけではありません。賛成票を投じてください!
KeyWeeUsr

2
この答えをさらに良くすることができる唯一のことは、それがなぜそしてどのように機能するかの説明です。:P
マーティンエンダー

2
@MartinEnder arxiv.org/pdf/1408.5770.pdf例13の後のコメントを参照してください。– alephalpha
9:22に

7

Pythonの322の 21バイト

ETHproductionsのおかげで1バイト。

lambda n:n&2*(n&-n)<1

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

ビットごとの算術ftw。


2
「整数またはブールで出力できます」ので、0+(...)
マーティンエンダー

ここでの操作の順序は非常に混乱しています。n&1括弧に入れることができますか?それとも1+(n^~-n)<1、括弧に入れることができますか?それともそれはある1+(n^~-n)...
ETHproductions

なんてこった。これは私が探していたものです:o!
ハイパーニュートリノ

&優先順位が最も低いので1+(n^~-n)
Leaky Nun

ああ、優先順位テーブルが見つかりました。今ではすべてが理にかなっています:P
ETHproductions

6

網膜38 34 29バイト

\d+
$*
+`^(1+)\1$|1111
$1
^1$

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

MartinとLeakyは基本的にこのアイデアを思いつき、さらに5バイトを節約しました!

入力を単項に変換し、数値を2で徐々に除算します。それ以上均等にできなくなると(つまり、数値が奇数になると)、入力から4のパッチを削除し、最後の演算mod 4の結果を計算します最後に、結果が1であるかどうかをチェックします。これは、最下位1ビットの左側の数字がゼロであることを意味します。それが真の場合、最終結果は1で、それ以外の場合はゼロです。


31バイト(自分で投稿する必要がありますか)
リーキー修道女

完全なバイナリ変換を回避し、代わりに2の係数を除算し、1(mod 4)と等しいかどうかをチェックする方法を見つけました:tio.run
Martin Ender

@MartinEnder本質的に私のアルゴリズム... 2バイトをオフにして
漏れの修道女

@LeakyNunそうそう、彼らは両方とも同じ考えです。偉大な心ともの...;)
マーティンエンダー

私はそれを編集しますが、もしあなたのどちらかがそれを投稿したいなら、私はおそらく自分自身を考えなかったので、私は元に戻します;)
FryAmTheEggman

6

ゼリー、5バイト

&N&HṆ

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

使い方

&N&HṆ  Main link. Argument: n

 N     Negate; yield -n.
&      Bitwise AND; compute n&-n.
       This yields the highest power of 2 that divides n evenly.
   H   Halve; yield n/2.
  &    Bitwise AND; compute n&-n&n/2. This rounds n/2 down if n is odd.
    Ṇ  Take the logical NOT of the result.

4

アリス、8バイト

I2z1xnO@

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

Unicode文字のコードポイントとして入力受け取り、それに応じて結果を0x00または0x01バイトとして出力します。

テストしやすいように、正確に同じアルゴリズムを使用する12バイトの10進数I / Oバージョンを示します(I / Oのみが異なります)。

/o
\i@/2z1xn

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

アリスがゴルフ言語であり、明示的なI / Oおよびプログラムの終了を必要としない場合、これは2z1xn05AB1EとJellyの両方を破ってわずか5バイト()で記録します。

説明

I    Read input.
2z   Drop all factors of 2 from the input, i.e. divide it by 2 as long
     as its even. This shifts the binary representation to the right
     until there are no more trailing zeros.
1x   Extract the second-least significant bit.
n    Negate it.
O    Output it.
@    Terminate the program.


3

ワイズ28 20 16バイト

::-~^~-&:[?>]~-^

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

説明

これは、Leaky NunのPython回答の移植版です。TIOのインタープリターのバージョンは少し古くなっているため、残念ながらTIOでは機能しません。

で入力の3つのコピーを作成することから始めて::、トップコピーを1ずつ減らします。これにより、最初の1まですべてのビットが反転します。次に、入力の別のコピーでこれをxorします。入力の最初の1までのすべてのビットが反転しているため、結果のすべてのビットが1になります。次に~-、結果に1 を追加すると、最下位1の左側の位置 1が1つ取得されます。これと入力とのANDにより、入力からそのビットを取得します。これで0、ビットがオフの場合とビットがオンの場合に2のべき乗が得られます。これをシングル1またはに変更できます。これが完了したら、ビットを無効にするだけで完了です。0:[?>]~-^



3

Haskell45 43 39バイト

nimiのおかげで6バイト節約

f x|d<-div x 2=[f d,mod(1+d)2]!!mod x 2

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


div代わりに使用できますquot
-nimi

さらに良い:divModf x|(d,m)<-divMod x 2=[mod(1+d)2,f d]!!m
nimi

@nimi私はそれがどのように機能するかさえ理解していません。おそらく自分で投稿する必要があります。
小麦ウィザード

それはまだ同じアルゴリズムですが、枝(再びベースケース対F再帰呼び出し)を選択するだけで、別の方法なので、編集その中にお気軽に。|(d,m)<-divMod x 2あるパターンガードバインドするddiv x 2してmまでmod x 2m2つの要素のリストにインデックスを付けるために使用します[...,...]!!m。以下の場合はm==0、私たちを返すmod(1+d)2の場合とm==1 f d
-nimi

1
ああ、申し訳ありませんが、リスト要素を反転する必要があります:[f d,mod(1+d)2]オンラインでお試しください!
nimi

3

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

パラメーターがスタックにプッシュされ、戻り値がレジスターにあるABIを想定していますAL

8B 44 24 04 0F BC C8 41 0F BB C8 0F 93 C0 C3

これは次のように分解されます。

_dragoncurve:
  00000000: 8B 44 24 04        mov         eax,dword ptr [esp+4]
  00000004: 0F BC C8           bsf         ecx,eax
  00000007: 41                 inc         ecx
  00000008: 0F BB C8           btc         eax,ecx
  0000000B: 0F 93 C0           setae       al
  0000000E: C3                 ret

1
@PeterTaylor私は答えのためにCPU命令のサイズをバイト単位で数えています。これは、アセンブリの回答のためのPPCGでの非常に一般的な方法です。
ゴビンドパーマー

1
私はそれがどのように共通の言うことができなかった、それは間違いである間違った
ピーター・テイラー

1
それはただつまらないだけでなく、無意味でもあります。コンピュータに関する限り、「マシンコード」と「アセンブリコード」の区​​別はありません。違いは単なる解釈の1つです。ニーモニックをマシンコードバイトに割り当てて、人間が読みやすいようにします。言い換えれば、バイトを理解しやすくするためにバイトをアンゴルフします。
コーディグレー

3
関係ありません、@ Peter。アセンブリコードは、人間が読み取れる機械コードの翻訳です。これらはまったく同じ言語であり、2つの異なる形式/表現にすぎません。TI BASICと違いはありません。TIBASICでは、文字バイトではなくトークンをカウントすることが一般に受け入れられています。これは、システムがトークンをカウントするためです。アセンブリ言語でも同じことが言えます。命令ニーモニックは個々の文字として保存されるのではなく、同等のマシンコードのバイトとして表されます。
コーディグレー

2
それに、実際には、コードゴルフ大会で拡張アセンブリ言語ニーモニックを入力する人がいるとしたら、それを100%同等のマシンコードに変換できます。それだけでは、2つの無意味な点を区別します。
コーディグレー

3

JavaScript(ES6)、17 14バイト

f=
n=>!(n&-n&n/2)
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

編集:ブール出力が許容可能であることに気付いたら、@ Dennisの答えを移植して3バイトを保存しました。


3

C(gcc)、20バイト

f(n){n=!(n&-n&n/2);}

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


これは実際には「機能」しません。特定のアーキテクチャを対象とするコンパイラの特定のバージョンのコードジェネレーターの癖に依存しており、戻り値に使用される同じレジスタで中間計算が行われます。任意のタイプの最適化を有効にしたり、ターゲットアーキテクチャを変更したり、GCCの別のバージョンを使用すると、これが壊れます。「10月13日に満月になると、私のスタック上のゴミには正しい出力が含まれます」と言うだけでもいいでしょう。
コーディグレー

あなたの言うことはすべて真実であり、このようなコードは量産コードでは決して使用されませんが、私たちはコードゴルフの目的のために実装によって言語を定義します。追加のフラグがなければ、これはgccおよびtccのすべての最新バージョンで機能し、有効と見なされるには1つのバージョンでのみ機能する必要があります。
デニス

「私たちは、コードゴルフの目的のためにその実装によって言語を定義し、」待って、何?それでは、すべてのコンパイラフラグとGCCのすべてのバージョンが異なる言語を定義していますか?あなたはそれがクレイジーだと気付きますよね?C言語標準は、言語を定義するものです。
コーディグレー

ここではありません。C標準はあるが実装されていない場合、それを言語とは見なしません。前にも言ったように、コンパイラは言語を定義します。その結果、未定義の動作依存することが許可されます。フラグの異なるセットは異なる言語とは見なされませんが、バイトカウントに追加しない限り、すべての回答は標準のコンパイルフラグを使用します。
デニス

ワオ。それはナッツです。つまり、実装定義の動作は許可されているが、未定義の動作は実装によって定義されていないと言っていれば理解できたということです。文字通り未定義です。実装は毎回ランダムなことを行うことができます。そして、この「標準コンパイルフラグ」という概念は、あなたが発明したものです。私の標準のコンパイルフラグには、コードを壊すものがいくつか含まれています。そして、オプティマイザーは非標準だとはほとんど思いません。まあ、明らかにこのサイトは私のためではありません。
コーディグレー

3

INTERCAL、50バイト

DOWRITEIN.1DO.1<-!?1~.1'~#1DOREADOUT.1PLEASEGIVEUP

INTERCALの単項演算子はこれに非常に適しているため、最初の投稿を書くことにしました。

DO WRITE IN .1
DO .1 <- !?1~.1'~#1
DO READ OUT .1
PLEASE GIVE UP



2

,,,10の 9 バイト

::0-&2*&¬

説明

たとえば、入力を3としてください。

::0-&2*&1≥
               implicitly push command line argument       [3]
::             duplicate twice                             [3, 3, 3]
  0            push 0 on to the stack                      [3, 3, 3, 0]
   -           pop 0 and 3 and push 0 - 3                  [3, 3, -3]
    &          pop -3 and 3 and push -3 & 3 (bitwise AND)  [3, 1]
     2         push 2 on to the stack                      [3, 1, 2]
      *        pop 2 and 1 and push 2 * 1                  [3, 2]
       &       pop 2 and 3 and push 2 & 3                  [2]
        ¬      pop 2 and push ¬ 2 (logical NOT)            [0]
               implicit output                             []


2

オクターブ、34バイト

@(x)~(k=[de2bi(x),0])(find(k,1)+1)

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

説明:

@(x)                               % Anonymous function taking a decimal number as input
    ~....                          % Negate whatever comes next
     (   de2bi(x)   )              % Convert x to a binary array that's conveniently 
                                   % ordered with the least significant bits first
        [de2bi(x),0]               % Append a zero to the end, to avoid out of bound index
     (k=[de2bi(x),0])              % Store the vector as a variable 'k'
                     (find(k,1)    % Find the first '1' in k (the least significant 1-bit)
                               +1  % Add 1 to the index to get the next bit
     (k=[de2bi(x),0])(find(k,1)+1) % Use as index to the vector k to get the correct bit

どうしてde2biのことを聞いたことがありません...:O
Sanchises

1

提出:

パイソン241の 39バイト

x=input()
while~-x&1:x/=2
print 1-x/2%2

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

-FryAmTheEggmanのおかげで2バイト

初期ソリューション:

Python 2、43バイト

lambda x:1-int(bin(x)[bin(x).rfind('1')-1])

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


あなたの提出物はどれですか?
リーキー修道女

@LeakyNun短いので最初のもの。2つ目は、最初の提出物です。個別に投稿する必要がありますか?
ハイパーニュートリノ

~-x&1代わりにwhile条件で動作すると思います。
FryAmTheEggman

(ユーザー名を忘れました); 他の人のコードの編集はPPCGでは推奨されていないため、編集を拒否しました。提案を投稿することもできます(ところで、@ FryAmTheEggmanに感謝します)が、ゴルフの編集は行わないでください。ありがとう!
ハイパーニュートリノ

@StewieGriffinああ、はい、ありがとう。残念ながら、編集が拒否されたため、ユーザーにpingを実行できません。
ハイパーニュートリノ

1

MATL11 10バイト

t4*YF1)Z.~

オンラインでお試しください!または、最初の100出力を参照してください。

説明

t    % Implicit input. Duplicate
4*   % Multiply by 4. This ensures that the input is a multiple of 2, and
     % takes into account that bit positions are 1 based
YF   % Exponents of prime factorization
1)   % Get first exponent, which is that of factor 2
Z.   % Get bit of input at that (1-based) position
~    % Negate. Implicit display


1

Befunge-98、19バイト

&#;:2%\2/\#;_;@.!%2

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

&#                       Initial input: Read a number an skip the next command
  ;:2%\2/\#;_;           Main loop: (Direction: East)
   :2%                    Duplicate the current number and read the last bit
      \2/                 Swap the first two items on stack (last bit and number)
                          and divide the number by two => remove last bit
         \                swap last bit and number again
          #;_;            If the last bit is 0, keep going East and jump to the beginning of the loop
                          If the last bit is 1, turn West and jump to the beginning of the loop, but in a different direction.
&#;           @.!%2      End: (Direction: West)
&#                        Jump over the input, wrap around
                 %2       Take the number mod 2 => read the last bit
               .!         Negate the bit and print as a number
              @          Terminate

1

SCALA、99(78?)文字、99(78?)バイト

if(i==0)print(1)else
print(if(('0'+i.toBinaryString).reverse.dropWhile(x=>x=='0')(1)=='1')0 else 1)

i入力はどこにあります。

ご覧のように、ゼロを処理しない場合は21バイトを節約します(著者がテストケースで行ったように)。

print(if(('0'+i.toBinaryString).reverse.dropWhile(x=>x=='0')(1)=='1')0 else 1)

これは私の最初のcodegolfであるので、私がうまくやったことを願っています

オンラインでお試しください!笑を計算するのはかなり長いですが。


サイトへようこそ!
DJMcMayhem



0

Japt10 8 9バイト

!+¢g¢a1 É

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

説明

!+¢   g    a1 É
!+Us2 gUs2 a1 -1 # Implicit input (U) as number
!+               # Return the boolean NOT of
      g          #   the character at index
       Us2       #     the input converted to binary
           a1    #     the index of its last 1
              -1 #     minus 1
      g          #   in string
  Us2            #     the input converted to binary

false文字(0または1)は常に文字列であるため、これはすべてに対して返されます。
シャギー

おっと、気づいたはずです...今すぐ修正
ルーク

今のところ失敗した1ようです。
シャギー

0

JavaScript(ES6)、53 34バイト

a=>eval("for(;~a&1;a/=2);~a>>1&1")

42バイト:a=>!+(a=a.toString(2))[a.lastIndexOf(1)-1]
シャギー

私はすでに短い(数学的な)ソリューションを見つけました
ルーク

いいね:)その42バイトの1つを投稿してもいいですか?
シャギー

@シャギー、まったくない
ルーク



0

チップ、93バイト

HZABCDEFG,t
 ))))))))^~S
H\\\\\\\/v~a
G\\\\\\/v'
F\\\\\/v'
E\\\\/v'
D\\\/v'
C\\/v'
B\/v'
A/-'

入力をリトルエンディアンバイトとして受け取ります。(TIOには、これを行うPythonが少しあります)。0x0またはとして出力します0x1。(TIOはxxdを使用して値を検査します)。

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

これどうやって?

チップは入力を一度に1バイトずつ見るので、マルチバイト入力を処理すると多少のバルクが追加されますが、私が恐れていたほどではありません。

それに行きましょう:

HZABCDEFG

これらはHZ、前のバイトの上位ビット(ある場合)、およびA- G、現在のバイトの下位7ビットです。これらは、番号の最下位ビットを見つけるために使用されます。

        ,t
))))))))^~S

最下位のセットビットが見つかると、いくつかの作業があります。この最初のチャンクは、「ビット()'s)が設定されている場合S、出力の抑制を停止しt、答えを出力した後で消去します」と言います。

H\\\\\\\/v~a
G\\\\\\/v'
...
A/-'

現在のバイトのどのビット(A- H)の前にもゼロの束が1つだけあり、その後1つ(\および/これらはビットのすぐ北を見て、以前のすべてのビットがゼロであったと信頼できます)がワイヤに渡されます右は(v'、...)、それは反転し、出力の低いビットとして与えられている方の値(~a)。

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