Angka n pertama tanpa angka biner yang sama berturut-turut


32

Urutan berisi representasi desimal dari angka-angka biner dari bentuk 10101...:, di mana istilah ke-n memiliki n bit.

Urutannya mungkin paling mudah untuk dijelaskan dengan hanya menunjukkan hubungan antara representasi biner dan desimal angka:

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

Tantangan:

Ambil integer input n, dan kembalikan angka n pertama dalam urutan. Anda dapat memilih untuk memiliki urutan 0-diindeks atau 1-diindeks.

Kasus uji:

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

Penjelasan didorong, seperti biasa.

Ini adalah OEIS A000975 .


Mengingat solusi MATL Anda sendiri, dapatkah mengeluarkan hasil dalam urutan terbalik?
Shaggy

Ya, asalkan disortir. @Shaggy
Stewie Griffin

Mendorong keberuntungan saya di sini, tetapi apakah format output ini dapat diterima [85,[42,[21,[10,[5,[2,[1,0]]]]]]]?
Shaggy

Jawaban:


66

Python 2 , 36 byte

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

Cobalah online! Penjelasan: Representasi biner dari adalah sehingga ia tinggal mengalikannya dengan kekuatan 2 yang sesuai dan mengambil bagian integer.230.101010101...


1
Sayang sekali ini Januari 2018, kalau tidak saya akan menominasikannya untuk wawasan matematika Terbaik untuk PPCG Terbaik 2017 . Semoga saya masih mengingatnya di awal
2019

@KevinCruijssen ini adalah yang terbaik yang pernah saya lihat dari semua codegolf.stackexchange.com/a/51574/17360
qwr

3
@KevinCruijssen jangan lupa!
Bassdrop Cumberwubwubwub

2
@BassdropCumberwubwubwub Terima kasih atas pengingatnya, karena saya memang sudah lupa sama sekali! Itu telah ditambahkan ke nominasi.
Kevin Cruijssen

11

05AB1E , 4 byte

2 byte disimpan menggunakan trik Neil 2/3

Lo3÷

Cobalah online!

Penjelasan

L      # push range [1 ... input]
 o     # raise 2 to the power of each
  3÷   # integer division of each by 3

05AB1E , 6 byte

TRI∍ηC

Cobalah online!

Penjelasan

T        # push 10
 R       # reverse it
  I∍     # extend to the lenght of the input
    η    # compute prefixes
     C   # convert each from base-2 to base-10

9

Jelly , ... 4 byte

Terima kasih mil untuk -1 byte!

ḶḂḄƤ

Cobalah online!

Penjelasan:

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.

Jelly , 4 byte

Versi Jonathan Allan.

Ḷ€ḂḄ

Cobalah online!

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.

Versi yang didasarkan pada trik Neil 2/3 menghasilkan 5 byte, lihat riwayat revisi.


ḶḂḄƤawalan cepat dibuat untuk ini
mil

Tidak perlu untuk awalan cepat bahkan - Ḷ€ḂḄjuga akan berfungsi.
Jonathan Allan

5

MATL , 5 byte

:WI/k

Berdasarkan jawaban Neil .

Penjelasan

:       % 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

Cobalah online!


MATL , 9 byte

:q"@:oXBs

Cobalah online!

Penjelasan

:       % 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 2 , 45 37 36 byte

-3 byte terima kasih kepada pengguna202729
-1 byte berkat mathmandan

s=0
exec"print s;s+=s+~s%2;"*input()

Cobalah online!


Menggandakan sadalah sama dengan menambahkan ske dirinya sendiri, jadi saya percaya Anda bisa lakukan s+=s+~s%2untuk menghemat satu byte.
mathmandan

5

Python 3, 68 61 54 48 43 byte

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

Terima kasih kepada user202729 untuk membantu menghemat 19 byte dan ovs karena membantu menghemat 6 byte.

Cobalah secara Online


Terima kasih untuk -1 byte itu. Dan saya pikir saya tidak bisa mengganti kalau tidak dengan dan atau?
Manish Kundu

Oke sudah lakukan itu.
Manish Kundu

2
Karena x == 0setara dengan not xjika xadalah bilangan bulat, swap operan (yaitu, x if c else y= y if not c else x) akan menghemat lebih banyak byte.
user202729

Anda juga dapat menjatuhkan i%2dan menggunakan 1-r%2sebagai gantinya
Rod

1
Maka Anda tidak perlu melacak i.
user202729

4

Sekam , 7 byte

mḋḣ↑Θݬ

Cobalah online!

Berbasis 1, jadi input n memberikan hasil pertama n .

Penjelasan

     ݬ   The infinite list [1, 0, 1, 0, 1, ...]
    Θ     Prepend a zero.
   ↑      Take the first n elements.
  ḣ       Get the prefixes of that list.
mḋ        Interpret each prefix as base 2.

4

APL (Dyalog Unicode) , 11 byte SBCS

Diasumsikan ⎕IO( I ndex O rigin) 0, yang merupakan default pada banyak sistem. Fungsi awalan diam-diam anonim. 1-diindeks.

(2⊥⍴∘1 0)¨⍳

Cobalah online!

ɩ ndices 0… n − 1

(...  terapkan fungsi diam-diam berikut untuk masing-masing

⍴∘1 0 cyclically membentuk kembali daftar [1,0]dengan panjang itu

2⊥ mengkonversi dari basis-2 (biner) ke angka normal


4

Perlv5.10 -n , 24 +1 byte

-3 byte terima kasih kepada Nahuel Fouilleul !

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

Cobalah online!

Logikanya sama dengan versi Ruby saya, tetapi lebih pendek karena perl lebih ringkas. Untuk beberapa alasan aneh, printtidak akan melakukan pemisah (sialan!), Jadi saya harus menggunakan saydari v5.10;agar menjalankan ini, saya tidak yakin bagaimana untuk mencetak ini, jadi saya meninggalkannya untuk sekarang ?. ..

Penjelasan

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

untuk penilaian saya akan mengatakan: 27 +1 ( -n) = 28 byte, karena untuk menjalankan perl satu-liner, orang harus menggunakan -edan menggunakan 5.10 Anda hanya perlu menggunakan -E, yang panjangnya sama
Nahuel Fouilleul

dapat menghemat 3 byte menggunakan $|--bukan($.^=1)
Nahuel Fouilleul



4

C , 81 55 59 byte

1 diindeks.

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

Program lengkap, kurang golf:

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

Cobalah online!

EDIT 2: Saya berada di bawah asumsi bahwa fungsi tidak perlu dapat digunakan kembali sekarang ketika saya memikirkannya, masuk akal jika mereka harus dapat digunakan kembali: P

EDIT: Saya di bawah kesalahpahaman bahwa saya harus memasukkan seluruh program dalam jawaban, ternyata saya hanya membutuhkan fungsi yang melakukannya. Itu bagus.

Saya cukup yakin saya bisa mencukur beberapa byte di sana-sini. Saya sudah menggunakan beberapa trik. Sebagian besar dari program ini didedikasikan untuk mendapatkan argumen dan mengubahnya menjadi sebuah int. Ini golf kode pertamaku. Jika saya melakukan kesalahan, beri tahu saya: P


2
Selamat datang di PPCG! :) Saya bukan orang C tetapi Anda mungkin dapat memperoleh beberapa petunjuk dari solusi Steadybox .
Shaggy

Ok itu lebih masuk akal sekarang, saya sudah memasukkan seluruh program ketika semua yang saya butuhkan adalah fungsi dan sisanya dapat dilakukan di footer. Saya kira ini dapat ditingkatkan secara signifikan.
Minerscale

Selamat datang di PPCG! Anda dapat menyimpan byte dengan menghapus i++dan mengubah i&1ke i++&1. Juga, meskipun sebagai variabel global idan jdiinisialisasi ke nol pada awalnya, mereka perlu diinisialisasi di dalam fungsi, karena pengiriman fungsi harus dapat digunakan kembali .
Steadybox

1
Lebih baik lagi, dimungkinkan untuk menyimpan 2 byte lebih banyak, menghilangkan sepenuhnya terner.
user202729

2
50 byte: i,j;f(c){for(i=j=0;i<c;)printf("%d ",j+=j+i++%2);} Cobalah secara online!
Steadybox

4

Haskell , 47 40 53 49 44 40 34 byte

-4 byte terima kasih kepada pengguna202729
-6 byte terima kasih kepada Laikoni

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

Cobalah online!


Anda dapat mengganti otherwisedengan eg 1>0( otherwise == True)
flawr

Untuk menambah golf, Anda dapat menggunakan penjaga untuk menetapkan sesuatu, misalnya seperti ini: Coba online!
flawr


1
Anda perlu membuat fungsi yang mengembalikan elemen n pertama dari daftar di mana n adalah argumen.
manusia

1
Ya persis. Saya dapat merekomendasikan untuk melihat Panduan kami untuk Peraturan Golf di Haskell , yang mencoba untuk menangkap konsensus saat ini tentang apa yang diperbolehkan dan apa yang tidak.
Laikoni

4

Ruby , 26 byte

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

Cobalah online!

Mengalahkan semua jawaban ruby ​​yang lebih tua.

Penjelasan

1/3dalam binary terlihat seperti 0.01010101..., jadi Jika Anda mengalikannya dengan kekuatan dua, Anda mendapatkan:

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

Tapi Ruby memberi angka pada divisi int, memberi saya urutan yang saya butuhkan.


4

J , 9 byte

[:#.\2|i.

Bagaimana itu bekerja?

i. - daftar 0..n-1

2| - daftar item mod 2

\ - semua awalan

#. - ke desimal

[: - tutup garpu (karena saya memiliki angka genap (4) dari kata kerja)

Cobalah online!


3

Retina , 28 byte

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

Cobalah online!

Berbasis 0, jadi input n memberikan hasil pertama n + 1 .

Penjelasan

Menggunakan rekursi dari OEIS:

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

Mari kita pergi melalui program:

)K`0

Ini adalah tahap konstan: membuang input dan mengatur string yang bekerja ke 0, nilai awal dari urutan. The )membungkus tahap ini dalam kelompok. Grup itu sendiri tidak melakukan apa-apa, tetapi hampir setiap tahap (termasuk tahap grup) mencatat hasilnya dalam sebuah log, dan kita akan membutuhkan dua salinan 0log tersebut agar program dapat berfungsi.

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

Ada banyak konfigurasi di sini: "$+"+membungkus panggung dalam satu lingkaran. Ini "$+"diperlakukan sebagai substitusi, dan $+mengacu pada input program, yaitu n . Ini berarti bahwa loop dijalankan n kali.

Kemudian ¶<bungkus setiap iterasi dalam tahap output, yang mencetak input stage dengan trafeed linefeed (jadi iterasi pertama mencetak nol, iterasi kedua mencetak hasil iterasi pertama dan seterusnya).

Tahap itu sendiri menggantikan seluruh string kerja dengan substitusi pada baris terakhir. Yang itu menggunakan kurung penutup implisit dan argumen implisit untuk operator pengulangan *, jadi itu sebenarnya kependekan dari:

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

Barang-barang di dalam tanda kurung dapat dipecah menjadi tiga bagian:

  • $&*_: memberikan string dari (n-1) _ s.
  • _: memberikan satu _.
  • 2*$-1*_: memberikan string 2 * a (n-1) _ . The $-1mengacu pada hasil kedua dari belakang di log hasil, yaitu iterasi lingkaran sebelum terakhir. Itu sebabnya kami perlu menyalin nol pada log untuk memulai, jika tidak, ini akan merujuk pada input program pada iterasi pertama.

Kemudian $.(…)mengukur panjang string yang dihasilkan. Dengan kata lain, kami telah menghitung a(n) = a(n-1) + 1 + 2*a(n-2)dengan melalui unary (tidak benar-benar: $.(…)malas dan tidak benar-benar mengevaluasi kontennya jika dapat menentukan panjang yang dihasilkan secara langsung melalui aritmatika, jadi ini bahkan cukup efisien).

Hasil iterasi loop akhir (elemen n + 1 dari urutan) dicetak karena output implisit Retina di akhir program.


3

Brain-Flak , 36 byte

{([()]{}<((({}<>)<>){}([{}]()))>)}<>

Cobalah online!

Penjelasan:

Angka berikutnya dalam urutan diperoleh oleh n*2+1atau n*2+0.

{([()]{}< Loop input times
  (
   (({}<>)<>){} Copy n to other stack; n*2
   ([{}]())  i = 1-i
  ) push n*2 + i
>)} End loop
<> Output other stack

3

Ruby 42 41 43 41 37 35 31 33 30 byte

-2 byte terima kasih kepada Unihedron

-3 byte berkat GB

->x{a=0;x.times{a-=~a+p(a)%2}}

Cobalah online!


Kerja bagus! Saya suka susu formula Anda ^^
Unihedron

1
hemat 3 byte:->x{a=0;x.times{a-=~a+p(a)%2}}
GB

2

> <> , 22 + 3 (-v flag) byte

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

Cobalah online!

Penjelasan

Tumpukan diinisialisasi dengan penghitung lingkaran.

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 byte

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

Port of @Neil 's Python 2 menjawab .
1-diindeks dan dikeluarkan secara langsung, masing-masing nilai pada baris yang terpisah.

Penjelasan:

Cobalah online.

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

Jawaban 80 byte lama:

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

Input 1-diindeks dan Stringoutput terbatas-ruang

Penjelasan:

Cobalah online.

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

C, 47 46 byte

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

Akumulator adimulai dengan nol. Pada setiap langkah, kami menggandakannya ( a+=a) dan menambahkannya jika bit terkecil sebelumnya yang signifikan adalah nol ( !(a%2), atau setara, -(~a)%2).

Program uji

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

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

Hasil

$ ./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

Japt , 10 9 7 6 byte

Semua diturunkan secara independen dari solusi lain.

1-diindeks.

õ!²mz3

Cobalah


Penjelasan

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

Cobalah


Versi 7 byte

õ_ou ì2

Cobalah

õ            :[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

Versi 9 byte

õ_îA¤w)n2

Cobalah

õ            :[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 byte

:&+oRXB

Cobalah online!

Penjelasan:

         % 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

Outputnya adalah 0, 1, 2, 5 ...jika Pditambahkan ke end ( flip), membuatnya 8 byte.


1
Ide bagus,&+
Luis Mendo

1

Ruby -n ,32 30 + 1 byte

Karena kita benar-benar memiliki 1 jalur input, $.nyaman bagi Tuhan!

EDIT: Saya kagum bahwa saya berhasil mengalahkan diri sendiri, tetapi tampaknya menggunakan -nyang dianggap sebagai 1 (dengan aturan 2 dalam kondisi khusus default , karena Ruby dapat dijalankan dengan ruby -e 'full program'( dengan demikian -nadalah 1) semua contoh getsyang hanya digunakan sekali dapat golf di bawah 1 char dengan cara ini; saya percaya ini adalah tonggak untuk ruby, tolong angkat bicara jika Anda tidak setuju dengan kereta pemikiran ini sebelum saya berulang kali menggunakannya kembali di masa depan)

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

Cobalah online!

Penjelasan

# 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

Menarik. Mungkin saja dalam 27 byte .
Eric Duminil

1
Bagus! Sepertinya kita semua kalah oleh 26b.
Unihedron

1

AWK a=0 , 31 byte

{for(;$1--;a=a*2+1-a%2)print a}

Cobalah online!

Menggunakan rumus yang dicuri tanpa malu-malu dari jawaban Ruby lainnya ini.

Meskipun tidak memiliki a=0akan berfungsi (awk memperlakukan "kosong" sebagai 0), elemen pertama dari 0 tidak akan dicetak dan sebaliknya menjadi emptygaris, yang sementara saya berpendapat adalah output yang valid mungkin tidak akan berlalu, jadi ada a=0yang bisa dimasukkan sebagai argumen baris perintah.


Saya suka formula Anda ^^
Asone Tuhid


1

brainfuck , 40 byte

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

Cobalah online!

Diindeks 0. Input sebagai kode char, output sebagai unary dengan byte nol memisahkan serangkaian kode char 1s. Mengasumsikan sel 8-bit kecuali jika Anda ingin memasukkan lebih dari 255. Mengasumsikan sel negatif, meskipun ini dapat diperbaiki dengan mengorbankan beberapa byte.

Sebelumnya, 50 byte

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

Cobalah online!

Input sebagai kode char, output sebagai kode char. 1-diindeks. Mungkin bisa bermain golf sedikit.

@ Unihedron menunjukkan saya lupa untuk menentukan bahwa ini membutuhkan sel berukuran tak terbatas, jika tidak, nomor 8 berada di urutan teratas.


Ketika saya menjalankannya dengan `` (0d018) sebagai par test case, kode Anda mencetak `* 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, sepertinya itu adalah masalah ukuran sel. Saya pikir kode Anda harus beradaptasi dengan bilangan bulat besar atau Anda perlu menentukan implementasi yang akan menjalankan kode Anda dengan benar, tetapi standar sel 8-bit tidak cukup
Unihedron

Lupa tentang itu, terima kasih @Unihedron! Saya akan memikirkan versi 8-bit, mungkin keluaran di unary.
Jo King

Menggunakan interpreter dengan sel 32-bit, ia bekerja. Meskipun saya pikir saya mungkin harus mencoba versi bitinteger (8bit) sendiri jika Anda belum pada akhir pekan: D
Unihedron
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.