連続する等しい2進数のない最初のn個の数字


32

シーケンスには、次の形式の2進数の10進数表現が含まれ10101...ます。ここで、n番目の項にはnビットがあります。

数のバイナリ表現と10進表現の関係を示すだけで、シーケンスを説明するのがおそらく最も簡単です。

0       ->  0
1       ->  1
10      ->  2
101     ->  5
1010    ->  10
10101   ->  21
101010  ->  42

チャレンジ:

入力整数を受け取りn、シーケンスの最初のn個の数値を返します。シーケンスのインデックスを0にするか、1にするかを選択できます。

テストケース:

n = 1   <- 1-indexed
0

n = 18
0, 1, 2, 5, 10, 21, 42, 85, 170, 341, 682, 1365, 2730, 5461, 10922, 21845, 43690, 87381

説明はいつものように奨励されます。

これはOEIS A000975です。


独自のMATLソリューションが与えられた場合、結果を逆順で出力することは許容されますか?
シャギー

はい、ソートされている限り。@シャギー
スティービーグリフィン

ここで私の運を押しますが、この出力形式は受け入れられ[85,[42,[21,[10,[5,[2,[1,0]]]]]]]ますか?
シャギー

回答:


66

Python 2、36バイト

lambda n:[2**i*2/3for i in range(n)]

オンラインでお試しください!説明:のバイナリ表現あり、それは、単に2の適切なパワーを乗算し、整数部をとるままになります。230.101010101...


1
残念なことに、 2018年1月です。そうでなければ、Best of PPCG 2017のBest Math Insightにノミネートされました。うまくいけば、私はまだ2019年の開始時に、それを覚えている; P
ケビンCruijssen

@KevinCruijssenこれは、私はすべてのアウト見た中で最高であるcodegolf.stackexchange.com/a/51574/17360
QWR

3
@KevinCruijssen忘れないでください!
Bassdrop Cumberwubwubwub

2
@BassdropCumberwubwubwubリマインダーをありがとう、私は本当にそれを完全に忘れていたので!ノミネートに追加されていました。
ケビンクルーッセン


9

ゼリー... 4バイト

おかげでマイルのために-1バイト!

ḶḂḄƤ

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

説明:

owered range, or Unength. Get [0, 1, 2, 3, ..., n-1]
 Ḃ    it. Get the last bit of each number. [0, 1, 0, 1, ...]
   Ƥ  for each Ƥrefixes [0], [0, 1], [0, 1, 0], [0, 1, 0, 1], ...
  Ḅ   convert it from inary to integer.

ゼリー、4つのバイト

ジョナサンアランのバージョン。

Ḷ€ḂḄ

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

owered range, or Unength.
 €    Apply for each. Automatically convert the number n
      to the range [1,2,..,n]. Get [[0],[0,1],[0,1,2],..].
  Ḃ   it. Get the last bit from each number.
      Current value: [[0],[0,1],[0,1,0],..]
   Ḅ  Convert each list from inary to integer.

Neilの2/3トリックに基づくバージョンは5バイトを与えます。改訂履歴を参照してください。


ḶḂḄƤプレフィックスクイックがこのために作成されました
マイル

接頭辞も必要ありません-すぐにḶ€ḂḄ動作します。
ジョナサンアラン

5

MATL、5バイト

:WI/k

ニールの答えに基づきます

説明

:       % Implicit input, n. Push range [1 2 ... n]
W       % 2 raised to that, element-wise. Gives [2 4 ...2^n] 
I       % Push 3
/       % Divide, element-wise
k       % Round down, element-wise. Implicit display

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


MATL、9バイト

:q"@:oXBs

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

説明

:       % Implicit input n. Range [1 2 ... n]
q       % Subtract 1, element-wise: gives [0 1 ... n-1]
"       % For each k in [0 1 ... n-1]
  @     %   Push k
  :     %   Range [1 2 ... k]
  o     %   Modulo 2, element-wise: gives [1 0 1 ...]
  XB    %   Convert from binary to decimal
  s     %   Sum. This is needed for k=0, to transform the empty array into 0
        % Implicit end. Implicit display


5

Python 3、68 61 54 48 43バイト

c=lambda x,r=0:x and[r]+c(x-1,2*r+~r%2)or[]  

19バイトの節約を助けてくれたuser202729と6バイトの節約を助けてくれたovsに感謝します。

オンラインで試す


-1バイトありがとう。そして、私は他にandまたはで置き換えることができないと思いますか?
マニッシュクン

わかったよ
マニッシュクン

2
のでx == 0と等価であるnot x場合にはx整数である、オペランドを交換する(すなわち、x if c else y= y if not c else x)いくつかのより多くのバイトを保存します。
user202729

また、ドロップすることができますi%2し、使用1-r%2代わりに
ロッド

1
その後、あなたは追跡する必要はありませんi
user202729


4

APL(Dyalog Unicode)、11 バイトSBCS

想定している⎕IOI NDEX OであることをRIGIN)0多くのシステムではデフォルトです。匿名の暗黙の接頭辞関数。1インデックス付き。

(2⊥⍴∘1 0)¨⍳

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

ɩndices 0…n-1

( 次の暗黙関数をそれぞれに適用します

⍴∘1 0 リスト[1,0]をその長さに周期的に変形します

2⊥ 基数2(バイナリ)から通常の数値に変換します


4

Perlv5.10 -n、24 + 1バイト

Nahuel Fouilleulのおかげで-3バイト!

say$v=$v*2|$|--while$_--

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

私のRubyバージョンと同じロジックですが、perlのほうが簡潔なのでより短くなります。なんらかの奇妙な理由でprint、セパレーターを使わない(くそ!)ので、これを実行するためにsayfrom を使用する必要がありv5.10;ました。 ..

説明

say    # Like shouting, but milder.
  $v = $v*2 | $|-- # Next element is this element times 2 bitwise-OR
                   # with alternating 0 1 0 1..., so 0b0, 0b1, 0b10, 0b101...
                   # $. is OUTPUT_AUTOFLUSH, which is initially 0 and
                   #   setting all non-zero values seem to be treated as 1
  while $_-- # do for [input] times

スコアリングのために私は言う:+ 1 27(-n)= 28バイト、perlのワンライナーを実行するため、1が使用する-eと、あなただけの使用に必要な5.10を使用すること-Eと同じ長さである、
ナウエルFouilleul

$|--代わりに使用して3バイトを保存できます($.^=1)
ナウエルフイユル



4

C81 55 59バイト

1が索引付けされました。

i,j;f(c){for(i=j=0;i<c;)printf("%d ",i++&1?j+=j+1:(j+=j));}

完全なプログラム、少ないゴルフ:

i;j;main(c,v)char**v;{c=atoi(*++v);for(;i<c;i++)printf("%d ",i&1?j+=j+1:(j+=j));}

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

編集2:私はそれを考えると、関数は再利用可能である必要はないと仮定していた、それは再利用可能でなければならないことは完全に理にかなっている:P

編集:私は答えにプログラム全体を含める必要があるという誤解を受けていましたが、それを行う機能だけが必要でした。それはすばらしい。

あちこちで数バイト削ることができると確信しています。私はすでにいくつかのトリックを使用しています。プログラムの大部分は、引数を取得してintに変換することに専念しています。これは私の最初のコードゴルフです。私が間違ったことをしている場合は教えてください:P


2
PPCGへようこそ!:)私はCの男ではありませんが、Steadyboxのソリューションからヒントを収集できるかもしれません。
シャギー

わかりました。今はもっと理にかなっています。必要なのは関数だけで、残りはフッターで実行できるので、プログラム全体を含めました。これで大幅に改善できると思います。
マイナースケール

PPCGへようこそ!あなたは削除することで、バイトを保存することができi++、変化i&1i++&1。グローバル変数としてけれどもまた、ij最初はゼロに初期化されているので、彼らは、関数内で初期化する必要が関数の提出は再利用可能でなければなりません
Steadybox

1
さらに良いことに、さらに2バイトを節約して、3進数を完全に排除することができます。
user202729

2
50バイト:i,j;f(c){for(i=j=0;i<c;)printf("%d ",j+=j+i++%2);} オンラインでお試しください!
Steadybox

4

Haskell47 40 53 49 44 40 34バイト

user202729のおかげで-4バイトLaikoniのおかげで
-6バイト

(`take`l)
l=0:[2*a+1-a`mod`2|a<-l]

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


otherwise例えば1>0otherwise == True)に置き換えることができます
flawr

さらにゴルフをするには、ガードを使用して何かを割り当てることができます。例:オンラインで試してみてください!
flawr

1
PS:また、haskellでのゴルフのヒントや、モナドと男性の haskellチャットルームもチェックしてください。
flawr

1
リストの最初のn個の要素を返す関数を作成する必要があります(nは引数)。
完全に人間の

1
はい、正確に。Haskellのゴルフ規則ガイドをご覧になることをお勧めします。これは、許可されているものと許可されていないものに関する現在のコンセンサスを取得しようとしています。
ライコニ

4

ルビー、26バイト

->n{(1..n).map{|i|2**i/3}}

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

すべての古いルビーの答えを打ちます。

説明

1/3バイナリはのよう0.01010101...に見えるため、2のべき乗で乗算すると、次のようになります。

n| 2^n/3
-+---------
1|0.1010101...
2|01.010101...
3|010.10101...
4|0101.0101...
5|01010.101...
6|010101.01...

しかし、Rubyはint除算の数値をフロア化して、必要なシーケンスを提供します。



3

網膜、28バイト

)K`0
"$+"+¶<`.+
$.(*__2*$-1*

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

0から始まるため、入力nは最初のn + 1の結果を返します。

説明

OEISからの再帰を使用します。

a(n) = a(n-1) + 2*a(n-2) + 1

プログラムを見てみましょう。

)K`0

これは一定の段階です。入力を破棄し、作業文字列を0の初期値であるに設定します。)グループ内のこの段階をラップします。そのグループ自体は何も行いませんが、ほぼすべてのステージ(グループステージを含む)はその結果をログに記録します0。プログラムを機能させるには、そのログの2つのコピーが必要です。

"$+"+¶<`.+
$.(*__2*$-1*

ここにはたくさんの設定があります:"$+"+ループでステージをラップします。"$+"置換として扱われ、$+プログラムの入力、すなわち指すN。これは、ループがn回実行されることを意味します。

次に、¶<各反復を出力ステージにラップします。これにより、ステージの入力が後続の改行で出力されます(したがって、最初の反復はゼロを出力し、2番目の反復は最初の反復の結果を出力します)。

ステージ自体は、作業文字列全体を最後の行の置換に置き換えます。その1つは、繰り返し演算子の暗黙的な閉じ括弧と暗黙的な引数を使用するため、*実際には次のように短縮されます。

$.($&*__2*$-1*_)

括弧内の内容は、3つの部分に分割できます。

  • $&*_a(n-1) _の文字列を提供します。
  • _:単一の_
  • 2*$-1*_2 * a(n-1)の 文字列を提供します_$-1すなわち、最後の前にループ繰り返し、結果ログに最後から二番目の結果を参照。そのため、最初にログのゼロをコピーする必要がありました。それ以外の場合、これは最初の反復でのプログラムの入力を参照します。

次に$.(…)、結果の文字列の長さを測定します。言い換えれば、a(n) = a(n-1) + 1 + 2*a(n-2)単項式を介して計算しました(実際にはそうで$.(…)はありません:遅延であり、計算によって結果の長さを直接決定できる場合、実際にはその内容を評価しないため、非常に効率的です)。

プログラムの最後でのRetinaの暗黙的な出力により、最後のループ反復の結果(シーケンスのn + 1番目の要素)が出力されます。




2

> <>、22 + 3(-vフラグ)バイト

0:nao::1+2%++$1-:?!;$!

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

説明

スタックはループカウンターで初期化されます。

0:nao                  : Push 0 to the stack, duplicate and print with a new line.
                         [7] -> [7, 0]
     ::1+              : Duplicate the stack top twice more then add 1 to it.
                         [7, 0] -> [7, 0, 0, 1]
         2%++          : Mod the stack top by 2 then add all values on the stack bar the loop counter.
                         [7, 0, 0, 1] -> [7, 1]
             $1-:?!;$! : Swap the loop counter to the top, minus 1 from it and check if zero, if zero stop the program else continue.

2

Java 8、115 81 80 52バイト

n->{for(int i=2;n-->0;i*=2)System.out.println(i/3);}

@NeilのPython 2回答のポート。
1のインデックスが付けられて直接出力され、各値は個別の行に表示されます。

説明:

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

n->{                           // Method with integer parameter and no return-type
  for(int i=2;                 //  Start integer `i` at 2
      n-->0;                   //  Loop `n` times:
      i*=2)                    //    Multiply `i` by 2 after every iteration
    System.out.println(i/3);}  //   Print `i` integer-divided by 3 and a new-line

古い80バイトの答え:

n->{String t="",r=t;for(Long i=0L;i<n;)r+=i.parseLong(t+=i++%2,2)+" ";return r;}

1インデックス付き入力とスペース区切りのString出力

説明:

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

n->{                             // Method with integer parameter and String return-type
  String t="",r=t;               //  Temp and result-Strings, both starting empty
  for(Long i=0L;i<n;)            //  Loop from 0 to `n` (exclusive)
    r+=                          //   Append the result-String with:
       i.parseLong(        ,2);  //    Binary to integer conversion
                   t+=           //     append the temp-String with:
                      i  %2      //      current index `i` modulo-2
                       ++        //      and increase `i` by one afterwards
       +" ";                     //    + a space
  return r;}                     //  Return the result-String

2

Perl 6の 35の30 27 25  20バイト

{[\~](0,+!*...*)[^$_]».&{:2(~$_)}}

試してみてください(35)

{(0,{$_*2+|($+^=1)}…*)[^$_]}

試してみてください(30)

{(⅓X*(2,4,82**$_))».Int}

試してみてください(30)

{(⅔,* *2…*)[^$_]».Int}

試してみてください(27)

{((2 X**1..$_)X/3)».Int}

試してみてください(25)

{(2 X**1..$_)Xdiv 3}

試してみてください(20)

拡張:

{
 (
  2                  # 2
    X**              # cross to the power of
       1..$_         # Range from 1 to the input (inclusive)
            )

             Xdiv    # cross using integer divide
                  3  # by 3
}


2

C、47 46バイト

a;f(n){for(a=0;n--;a+=a-~a%2)printf("%d ",a);}

アキュムレータaはゼロで始まります。各ステップでa+=a、前の最下位ビットがゼロ(!(a%2)、または同等に-(~a)%2)である場合、それを2倍()し、1を追加します。

テストプログラム

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    while (*++argv) {
        f(atoi(*argv));
        puts("");
    }
}

結果

$ ./153783 1 2 3 4 5 6
0 
0 1 
0 1 2 
0 1 2 5 
0 1 2 5 10 
0 1 2 5 10 21 

2

Japt10 9 7 6バイト

他のソリューションから独立して派生したもの。

1インデックス。

õ!²mz3

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


説明

õ        :[1,input]
 !²      :Raise 2 to the power of each
   m     :Map
    z3   :Floor divide by 3

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


7バイトバージョン

õ_ou ì2

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

õ            :[1,input]
 _           :Pass each through a function
   o         :[0,current element)
    u        :Modulo 2 on above
      ì2     :Convert above from base-2 array to base-10

9バイトバージョン

õ_îA¤w)n2

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

õ            :[1,input]
 _           :Pass each through a function
   A         :10
    ¤        :Convert to binary
     w       :Reverse
  î          :Repeat the above until it's length equals the current element
      )      :Close nested methods
       n2    :Convert from binary to base-10


1

MATL、7バイト

:&+oRXB

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

説明:

         % Implicitly grab input, n
:        % Range: 1 2 ... n

 &+      % Add the range to itself, transposed
         % 2 3 4 5 ...
         % 3 4 5 6 ...
         % 4 5 6 7 ...
         % 5 6 7 8 ...

   o     % Parity (or modulus 2)
         % 0 1 0 1 ...
         % 1 0 1 0 ...
         % 0 1 0 1 ...
         % 1 0 1 0 ...

    R    % Upper triangular matrix:
         % 0 1 0 1
         % 0 0 1 0
         % 0 0 0 1
         % 0 0 0 0

    XB   % Convert rows to decimal:
         % [5, 2, 1, 0]
         % Implicitly output

出力は、末尾に追加された0, 1, 2, 5 ...場合Pflip)で、8バイトになります。


1
良いアイデア、&+
ルイスメンドー

1

ルビー -n32 30 + 1バイト

入力が正確に1行あるため、$.非常に便利です!

編集:私は、私は自分自身をoutgolfするために管理することを驚いて、使用しているようだ-n1とその数(内のルール2により、デフォルトの特別な条件のRubyを使用して実行させることができるので、ruby -e 'full program'(これ-n1である)すべてのインスタンスのgets唯一の缶一度使用されていますこのように1文字までゴルフダウンします。これはルビーのマイルストーンであると信じています。この考えの列に同意しない場合は、将来繰り返し使用する前に声を上げてください)

v=0
?1.upto($_){p v=v*2|$.^=1}

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

説明

# while gets(); -- assumed by -n
v=0            # First element of the sequence
?1.upto($_){   # Do from "1" to "$LAST_READ_LINE" aka: Repeat [input] times
  p            # print expression
  v=v*2|$.^=1  # Next element is current element times two
               # bitwise-or 0 or 1 alternating
               # $. = lines of input read so far = 1 (initially)
}
# end           -- assumed by -n

面白い。ただし、27バイトで可能です。
エリックドゥミニル

1
いいね!しかし、私たち全員が26bまでにアウトゴルフされたようです。
単面体



1

brainfuck、40バイト

,[>.>>[>]<[.->[>]+[<]+<]+<[[-<+>]>-<]<-]

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

0インデックス。文字コードとして入力し、一連の文字コード1を分離するヌルバイトを持つ単項として出力します。255を超える値を入力する場合を除き、8ビットセルを想定します。負のセルを想定しますが、これは数バイトを犠牲にして修正できます。

以前は、50バイト

,[[<]>->>[<-<->>>>-<]<[->>++<<]>>+[-<<+>>]<<.<<+>]

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

文字コードとして入力、文字コードとして出力。1インデックス。おそらく少しゴルフができるかもしれません。

@Unihedronは、これに無限のサイズのセルが必要であることを指定するのを忘れたことを指摘しています。


テストケースとして ``(0d018)で実行すると、コードは `*UªUªUªUªUªUª`(0x01 02 05 0a 15 2a 55 aa 55 aa 55 aa 55 aa 55 aa 55 aa; 0d001 002 005 010 021 042 085を出力します170 085 170 085 170 085 170 085 170 085 170):( tio.run/##SypKzMxLK03O/...
Unihedron

OK、セルサイズの問題のようです。私はあなたのコードが大きな整数に適応しなければならないか、適切にあなたのコードを実行します実装を指定する必要がありますどちらかと思いますが、8ビット・セルのデフォルトでは十分ではありません
Unihedron

@Unihedronに感謝します!おそらく単項で出力する8ビットバージョンについて考えます。
ジョーキング

32ビットセルのインタープリターを使用すると、動作します。週末までに持っていない場合は、自分でビット整数(8ビット)バージョンで試してみるかもしれないと思いますが:D
Unihedron
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.