The first n numbers without consecutive equal binary digits

33

2

The sequence contains the decimal representation of the binary numbers of the form: 10101..., where the n-th term has n bits.

The sequence is probably easiest to explain by just showing the relationships between the binary and decimal representations of the numbers:

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

Challenge:

Take an input integer n, and return the first n numbers in the sequence. You may choose to have the sequence 0-indexed or 1-indexed.

Test cases:

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

Explanations are encouraged, as always.

This is OEIS A000975.

Stewie Griffin

Posted 2018-01-22T09:27:21.747

Reputation: 43 471

Given your own MATL solution, is it acceptable to output the result in reverse order? – Shaggy – 2018-01-22T12:34:22.767

Yes, as long as it's sorted. @Shaggy – Stewie Griffin – 2018-01-22T12:42:47.230

Pushing my luck here, but would this output format be acceptable [85,[42,[21,[10,[5,[2,[1,0]]]]]]]? – Shaggy – 2018-01-22T18:05:38.377

Answers

68

Python 2, 36 bytes

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

Try it online! Explanation: The binary representation of \$\frac{2}3\$ is 0.101010101... so it simply remains to multiply it by an appropriate power of 2 and take the integer portion.

Neil

Posted 2018-01-22T09:27:21.747

Reputation: 95 035

1

Too bad it's January 2018, otherwise I would have nominated it for Best mathematical insight for the Best of PPCG 2017. Hopefully I still remember it at the start of 2019. ;p

– Kevin Cruijssen – 2018-01-24T14:05:49.237

@KevinCruijssen this is the best I've seen out of all https://codegolf.stackexchange.com/a/51574/17360

– qwr – 2018-01-25T07:08:21.927

3@KevinCruijssen don't forget! – Bassdrop Cumberwubwubwub – 2019-02-07T15:19:01.273

2

@BassdropCumberwubwubwub Thanks for the reminder, because I had indeed forgot about it completely! It had been added to the nominations.

– Kevin Cruijssen – 2019-02-07T17:59:27.600

11

05AB1E, 4 bytes

2 bytes saved using Neil's 2/3 trick

Lo3÷

Try it online!

Explanation

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

05AB1E, 6 bytes

TRI∍ηC

Try it online!

Explanation

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

Emigna

Posted 2018-01-22T09:27:21.747

Reputation: 50 798

9

Jelly, ... 4 bytes

Thanks miles for -1 byte!

ḶḂḄƤ

Try it online!

Explanation:

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 bytes

Jonathan Allan's version.

Ḷ€ḂḄ

Try it 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.

A version based on Neil's 2/3 trick gives 5 bytes, see revision history.

user202729

Posted 2018-01-22T09:27:21.747

Reputation: 14 620

ḶḂḄƤ prefix quick was made for this – miles – 2018-01-22T13:11:12.280

No need for the prefix quick even - Ḷ€ḂḄ would also work. – Jonathan Allan – 2018-01-22T14:50:18.173

5

MATL, 5 bytes

:WI/k

Based on Neil's answer.

Explanation

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

Try it online!


MATL, 9 bytes

:q"@:oXBs

Try it online!

Explanation

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

Luis Mendo

Posted 2018-01-22T09:27:21.747

Reputation: 87 464

5

Python 3, 68 61 54 48 43 bytes

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

Thanks to user202729 for helping save 19 bytes and ovs for helping save 6 bytes.

Try It Online

Manish Kundu

Posted 2018-01-22T09:27:21.747

Reputation: 1 947

Thanks for that -1 byte. And I think I can't replace if else with and or? – Manish Kundu – 2018-01-22T10:12:39.290

Okay done that already. – Manish Kundu – 2018-01-22T10:13:39.460

2Because x == 0 is equivalent to not x if x is an integer, swap the operands (i.e., x if c else y = y if not c else x) will save some more bytes. – user202729 – 2018-01-22T10:16:37.323

You can also drop i%2 and use 1-r%2 instead – Rod – 2018-01-22T10:25:10.163

Or ~r%2. (4 more to go) – user202729 – 2018-01-22T10:26:49.677

But wouldn't that increase one byte instead? – Manish Kundu – 2018-01-22T10:28:10.257

1Then you don't need to keep track of i. – user202729 – 2018-01-22T10:29:17.563

Yeah. 7 more bytes gone. – Manish Kundu – 2018-01-22T10:33:35.010

48 bytes – ovs – 2018-01-22T15:45:03.617

Now you also don't need to keep track of s. Just drop it. – user202729 – 2018-01-23T01:34:35.897

5

Python 2, 45 37 36 bytes

-3 bytes thanks to user202729
-1 byte thanks to mathmandan

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

Try it online!

Rod

Posted 2018-01-22T09:27:21.747

Reputation: 17 588

Doubling s is the same as adding s to itself, so I believe you could do s+=s+~s%2 to save a byte. – mathmandan – 2018-01-22T21:38:31.370

4

Husk, 7 bytes

mḋḣ↑Θݬ

Try it online!

1-based, so input n gives the first n results.

Explanation

     ݬ   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.

Martin Ender

Posted 2018-01-22T09:27:21.747

Reputation: 184 808

4

Haskell, 47 40 53 49 44 40 34 bytes

-4 bytes thanks to user202729
-6 bytes thanks to Laikoni

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

Try it online!

oktupol

Posted 2018-01-22T09:27:21.747

Reputation: 697

You can replace otherwise with e.g. 1>0 (otherwise == True) – flawr – 2018-01-22T09:57:04.643

To golf it even more, you can use the guard for assigning something, e.g. like this: Try it online!

– flawr – 2018-01-22T09:59:41.547

1

PS: Also check out tips for golfing in haskell as well as our haskell-chatroom of monads and men.

– flawr – 2018-01-22T10:01:38.537

1You need to make a function that returns the first n elements of the list where n is the argument. – totallyhuman – 2018-01-22T10:59:17.977

Must have missed that. Fixed – oktupol – 2018-01-22T11:13:28.187

Your last line can be shortened to the anonymous function (`take`l): Try it online!

– Laikoni – 2018-01-22T16:37:56.560

The map can be replaced by a list comprehension: l=0:[2*a+1-a`mod`2|a<-l] Try it online!

– Laikoni – 2018-01-22T16:41:20.853

@Laikoni I'm fairly new to this, do I understand it correctly that anonymous functions are sufficient for Code-Golf? – oktupol – 2018-01-22T16:54:32.763

1

Yes, exactly. I can recommend to have a look at our Guide to Golfing Rules in Haskell, which tries to capture the current consensus on what is allowed and what isn't.

– Laikoni – 2018-01-22T16:58:33.790

4

APL (Dyalog), 7 bytes

⌊3÷⍨2*⍳

Try it online!


APL (Dyalog), 11 bytes

(2⊥2|⍳)¨1+⍳

Try it online!

Uses ⎕IO←0.

Uriel

Posted 2018-01-22T09:27:21.747

Reputation: 11 708

Returns one-too-many terms. Run under ⎕IO←0 (but claim it is 1-indexed!) and change 0, to 1+: (2⊥2|⍳)¨1+⍳

– Adám – 2018-01-22T11:28:13.973

4

Perl v5.10 -n, 24+1 bytes

-3 bytes thanks to Nahuel Fouilleul!

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

Try it online!

Same logic as my Ruby version, but shorter because perl is more concise. For some odd reason, print wouldn't do a seperator (dammit!), so I had to use say from v5.10; in order for this to run, I'm not sure how to score this, so I'm leaving it out for now?...

Explanation

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

Unihedron

Posted 2018-01-22T09:27:21.747

Reputation: 1 115

for the scoring i would say: 27 + 1 (-n) = 28 bytes, because to run a perl one-liner, one should use -e and to use 5.10 you just need to use -E, which is the same length – Nahuel Fouilleul – 2018-01-22T12:18:33.103

can save 3 bytes using $|-- instead of ($.^=1) – Nahuel Fouilleul – 2018-01-22T12:22:48.883

4

Haskell, 33 bytes

l=1:0:l
($scanl((+).(2*))0l).take

Try it online!

Cristian Lupascu

Posted 2018-01-22T09:27:21.747

Reputation: 8 369

4

APL (Dyalog Unicode), 11 bytesSBCS

Assumes ⎕IO (Index Origin) to be 0, which is default on many systems. Anonymous tacit prefix function. 1-indexed.

(2⊥⍴∘1 0)¨⍳

Try it online!

ɩndices 0…n−1

( apply the following tacit function to each

⍴∘1 0 cyclically reshape the list [1,0] to that length

2⊥ convert from base-2 (binary) to normal number

Adám

Posted 2018-01-22T09:27:21.747

Reputation: 37 779

4

C, 81 55 59 bytes

1 indexed.

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

Full program, less golfed:

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

Try it online!

EDIT 2: I was under the assumption that functions didn't need to be reusable now that I think of it, it makes perfect sense that they would have to be reusable :P

EDIT: I was under the misconception that I had to include the entire program in the answer, turns out I only needed the function that does it. That's nice.

I'm decently sure I can shave off a few bytes here and there. I've already employed a few tricks. A large chunk of the program is dedicated to getting the argument and turning it into an int. This is my first code golf. If I'm doing anything wrong tell me :P

Minerscale

Posted 2018-01-22T09:27:21.747

Reputation: 41

2

Welcome to PPCG! :) I'm not a C guy but you may be able to glean some hints from Steadybox's solution.

– Shaggy – 2018-01-22T12:30:52.480

Ok that makes more sense now, I've included the entire program when all I need is a function and the rest can be done in a footer. I guess this can be significantly improved then. – Minerscale – 2018-01-22T12:33:17.000

Welcome to PPCG! You can save a byte by removing i++ and changing i&1 to i++&1. Also, although as global variables i and j are initialized to zero initially, they need to be initialized inside the function, because function submissions have to be reusable.

– Steadybox – 2018-01-22T12:51:16.757

Oh thanks for the tip! That makes sense now. Will make those edits – Minerscale – 2018-01-22T13:03:12.717

Our rules for how to score function is, if a header include #include<...> is required for the function to work correctly, it should be included in the bytecount. For C that's often not a problem, because most functions work without including header anyway. Just a note. – user202729 – 2018-01-22T13:35:31.517

You can eliminate the duplicate j+= part, saves 5 bytes. – user202729 – 2018-01-22T13:37:44.530

1Even better, it's possible to save 2 more bytes, eliminating the ternary entirely. – user202729 – 2018-01-22T13:39:14.627

How does that work? – Minerscale – 2018-01-22T13:48:39.670

2

50 bytes: i,j;f(c){for(i=j=0;i<c;)printf("%d ",j+=j+i++%2);} Try it online!

– Steadybox – 2018-01-22T14:04:25.940

Alright steadybox, I don't think that's going any lower. Super impressive – Minerscale – 2018-01-23T01:40:10.663

4

J, 9 bytes

[:#.\2|i.

How it works?

i. - list 0..n-1

2| - the list items mod 2

\ - all prefixes

#. - to decimal

[: - caps the fork (as I have even number (4) of verbs)

Try it online!

Galen Ivanov

Posted 2018-01-22T09:27:21.747

Reputation: 13 815

4

Ruby, 26 bytes

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

Try it online!

Beats all the older ruby answers.

Explanation

1/3 in binary looks like 0.01010101..., so If you multiply it by powers of two, you get:

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

But Ruby floors the numbers on int division, giving me the sequence I need.

MegaTom

Posted 2018-01-22T09:27:21.747

Reputation: 3 787

3

Retina, 28 bytes

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

Try it online!

0-based, so input n gives the first n+1 results.

Explanation

Uses the recursion from OEIS:

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

Let's go through the program:

)K`0

This is a constant stage: it discards the input and sets the working string to 0, the initial value of the sequence. The ) wraps this stage in a group. That group itself does nothing, but almost every stage (including group stages) records its result in a log, and we'll need two copies of the 0 on that log for the program to work.

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

There's a bunch of configuration here: "$+"+ wraps the stage in a loop. The "$+" is treated as a substitution, and $+ refers to the program's input, i.e. n. This means that the loop is run n times.

Then ¶< wraps each iteration in an output stage, which prints the stage's input with a trailing linefeed (so the first iteration prints the zero, the second iteration prints the first iteration's result and so on).

The stage itself replaces the entire working string with the substitution on the last line. That one makes use of an implicit closing parenthesis and implicit arguments for the repetition operator *, so it's actually short for:

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

The stuff inside the parentheses can be broken up into three parts:

  • $&*_: gives a string of a(n-1) _s.
  • _: gives a single _.
  • 2*$-1*_: gives a string of 2*a(n-1) _. The $-1 refers to the penultimate result in the result log, i.e. the loop iteration before the last. That's why we needed to copies of the zero on the log to begin with, otherwise this would refer to the program's input on the first iteration.

Then $.(…) measures the length of the resulting string. In other words, we've computed a(n) = a(n-1) + 1 + 2*a(n-2) by going through unary (not really though: $.(…) is lazy and doesn't actually evaluate its content if it can determine the resulting length directly through arithmetic, so this is even quite efficient).

The result of the final loop iteration (the n+1th element of the sequence) is printed due to Retina's implicit output at the end of the program.

Martin Ender

Posted 2018-01-22T09:27:21.747

Reputation: 184 808

3

Ruby 42 41 43 41 37 35 31 33 30 bytes

-2 bytes thanks to Unihedron

-3 bytes thanks to G B

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

Try it online!

Asone Tuhid

Posted 2018-01-22T09:27:21.747

Reputation: 1 944

Good work! I like your formula ^^ – Unihedron – 2018-01-22T11:16:27.027

1save 3 bytes: ->x{a=0;x.times{a-=~a+p(a)%2}} – G B – 2018-01-24T09:52:07.570

3

Brain-Flak, 36 bytes

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

Try it online!

Explanation:

The next number in the sequence is obtained by n*2+1 or 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

MegaTom

Posted 2018-01-22T09:27:21.747

Reputation: 3 787

2

Japt, 10 9 7 6 bytes

All derived independently from other solutions.

1-indexed.

õ!²mz3

Try it


Explanation

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

Try it


7 byte version

õ_ou ì2

Try it

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

õ_îA¤w)n2

Try it

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

Shaggy

Posted 2018-01-22T09:27:21.747

Reputation: 24 623

2

Java 8, 115 81 80 52 bytes

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

Port of @Neil's Python 2 answer.
1-indexed and outputted directly, each value on a separated line.

Explanation:

Try it 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

Old 80 bytes answer:

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

1-indexed input and space-delimited String output

Explanation:

Try it 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

Kevin Cruijssen

Posted 2018-01-22T09:27:21.747

Reputation: 67 575

2

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

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

Try it online!

Explanation

The stack gets initialized with the loop counter.

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.

Teal pelican

Posted 2018-01-22T09:27:21.747

Reputation: 1 338

2

Perl 6,  35 30 27 25  20 bytes

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

Try it (35)

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

Try it (30)

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

Try it (30)

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

Try it (27)

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

Try it (25)

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

Try it (20)

Expanded:

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

             Xdiv    # cross using integer divide
                  3  # by 3
}

Brad Gilbert b2gills

Posted 2018-01-22T09:27:21.747

Reputation: 12 713

2

C, 47 46 bytes

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

The accumulator a begins with zero. At each step, we double it (a+=a) and add one if the previous least-significant bit was zero (!(a%2), or equivalently, -(~a)%2).

Test program

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

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

Results

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

Toby Speight

Posted 2018-01-22T09:27:21.747

Reputation: 5 058

2

Python 2, 33 bytes

s=2
exec"print s/3;s*=2;"*input()

Try it online!


Python 2, 34 bytes

f=lambda n:n*[f]and[2**n/3]+f(n-1)

Try it online!

Returns in reverse order.

xnor

Posted 2018-01-22T09:27:21.747

Reputation: 115 687

1

Ruby -n, 32 30+1 bytes

Since we have exactly 1 line of input, $. is godly convenient!

EDIT: I'm amazed that I managed to outgolf myself, but it seems using -n which counts as 1 (by rule 2 in default special conditions, since Ruby can be run with ruby -e 'full program' (thus -n is 1) all instances of gets which is only used once can be golfed down 1 char this way; I believe this is a milestone for ruby, please speak up if you disagree with this train of thought before I repeatedly reuse it in the future)

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

Try it online!

Explanation

# 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

Unihedron

Posted 2018-01-22T09:27:21.747

Reputation: 1 115

Interesting. It's possible in 27 bytes, though.

– Eric Duminil – 2018-01-22T15:38:55.580

1Nice! Seems that we all got outgolfed by 26b though. – Unihedron – 2018-01-23T00:44:59.497

1

JavaScript (ES7), 39 35 31 30 bytes

1-indexed with output in reverse order.

f=n=>n?[2**n/3|0,...f(--n)]:[]

Try it

o.innerText=(
f=n=>n?[2**n/3|0,...f(--n)]:[]
)(i.value=8);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>


35 byte version, without recursion

n=>[...Array(n)].map(_=>2**n--/3|0)

o.innerText=(f=
n=>[...Array(n)].map(_=>2**n--/3|0)
)(i.value=8);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>

Shaggy

Posted 2018-01-22T09:27:21.747

Reputation: 24 623

1

Haskell, 52 bytes

(`take`map a[0..])
a 0=0
a 1=1
a n=a(n-1)+2*a(n-2)+1

Try it online!

totallyhuman

Posted 2018-01-22T09:27:21.747

Reputation: 15 378

1

MATL, 7 bytes

:&+oRXB

Try it online!

Explanation:

         % 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

The output would be 0, 1, 2, 5 ... if P was added to the end (flip), making it 8 bytes.

Stewie Griffin

Posted 2018-01-22T09:27:21.747

Reputation: 43 471

1Good idea, &+ – Luis Mendo – 2018-01-22T11:13:32.903

1

brainfuck, 40 bytes

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

Try it online!

0-indexed. Input as char code, output as unary with null bytes separating series of char code 1s. Assumes 8-bit cells unless you want to input over 255. Assumes negative cells, though this could be fixed at the expense of several bytes.

Previously, 50 bytes

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

Try it online!

Inputs as char code, outputs as char code. 1-indexed. Probably could be golfed a little.

@Unihedron points out I forgot to specify that this needs infinite sized cells, otherwise it tops out at the 8th number.

Jo King

Posted 2018-01-22T09:27:21.747

Reputation: 38 234

When I run it with `` (0d018) as par the test case, your code prints *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) :( https://tio.run/##SypKzMxLK03O/v9fJzraJtZO184u2kbXBkjZ2enaxNpEA1na2jZAGTvtaF0bG207u1gbGz0QI/b/fyEA

– Unihedron – 2018-01-22T11:51:26.167

Ok, seems it is a cell size problem. I think either your code should adapt to big integers or you need to specify the implementation that would run your code properly, but the default of 8-bit cells isn't enough – Unihedron – 2018-01-22T11:53:31.803

Forgot about that, thanks @Unihedron! I'll have a think about an 8-bit version, probably outputting in unary. – Jo King – 2018-01-22T12:38:48.853

Using an interpreter with 32-bit cells, it works. Though I think I might have a try at a bitinteger (8bit) version myself if you haven't by the weekend :D – Unihedron – 2018-01-22T13:25:16.943

1

AWK a=0, 31 bytes

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

Try it online!

Uses the formula shamelessly stolen from this other Ruby answer.

While not having a=0 would work (awk treats "empty" as 0), the first element of 0 won't get printed and instead be an empty line, which while I would argue is a valid output probably won't pass, so there's a=0 which can be inserted as command line argument.

Unihedron

Posted 2018-01-22T09:27:21.747

Reputation: 1 115

I like your formula ^^ – Asone Tuhid – 2018-01-22T16:42:04.357

1

C, 52 bytes

i,k;f(n){for(i=k=0;i<n;k=++i%2+2*k)printf("%d ",k);}

1-indexed

Try it online!

Steadybox

Posted 2018-01-22T09:27:21.747

Reputation: 15 798

1

R, 21 bytes

cat(2^(1:scan())%/%3)

Try it online!

Based on the same algorithm as many here. 1-indexed.

R, 37 bytes

for(i in 0:scan())cat(F<-2*F+i%%2,"")

Try it online!

0-indexed. Doubling and adding n mod 2 at each iteration yields the correct result. F is initialized to zero.

Giuseppe

Posted 2018-01-22T09:27:21.747

Reputation: 21 077

1

Julia 0.6, 15 14 bytes

!n=2.^(1:n)÷3

Try it online!

Using the 2/3 method. ÷ does integer division in Julia and . is element-wise function application.

-1 Byte thanks to Dennis.

LukeS

Posted 2018-01-22T09:27:21.747

Reputation: 421

2÷ doesn't need the .. – Dennis – 2018-01-22T15:19:03.540

I wanted to avoid WARNING: div(A::AbstractArray, B::Number) is deprecated, use div.(A, B) instead.. But you are right: The warning does not matter.

– LukeS – 2018-01-22T18:01:50.133

Julia 0.5 doesn't print a warning. – Dennis – 2018-01-22T18:03:10.100

1

Ruby, 27 bytes

->n{n.times{|i|p 2**i*2/3}}

Try it online!

It's just a Ruby port of this awesome Python answer.

Eric Duminil

Posted 2018-01-22T09:27:21.747

Reputation: 701

1

Actually, 14 bytes

r⌠;"10"*H2@¿⌡M

Try it online!

Explanation:

r⌠;"10"*H2@¿⌡M
r               range(0, input)
 ⌠;"10"*H2@¿⌡M  map (for n in range):
   "10"*          repeat "10" n times
  ;     H         first n characters
         2@¿      interpret as binary integer

Mego

Posted 2018-01-22T09:27:21.747

Reputation: 32 998

1

Pyt, 5 bytes

1←ř«₃

Explanation:

1        Pushes 1
 ←       Gets input
  ř      Pushes [1,2,...,input]
   «     Bit-shift 1 to the left by each element in the array
    ₃    Python 2-style division by 3 (2^k/3)

Try it online!

mudkip201

Posted 2018-01-22T09:27:21.747

Reputation: 833

1

Octave, 20 bytes

@(x)fix(2.^(1:x)./3)

Try it online!

Using @Neils Python method (+1 to him) saves a heck of a lot of bytes.


Previous answer (independent creation):

Octave, 49 40 bytes

@(n)arrayfun(@(x)sum(2.^(x-1:-2:0)),0:n)

Try it online!

Basically for each value x in 0:n where n is the input (0-indexed), we take a range of x-1:-2:0, and raise 2 to the power of each element in the range. The range results in alternating powers of 2, starting with an empty array [] for 0, then [],[1] for 0:1, then [],[1],[1 4] for 0:2, and so on.

If we then sum each of the produced alternating powers of two, we end up with the required sequence. This only works because in Octave the sum of an empty array is 0, so we can produce the first number 0 by producing no powers of two.

The resulting array, which contains all numbers in the pattern up to and including n is then returned.

Tom Carpenter

Posted 2018-01-22T09:27:21.747

Reputation: 3 990

1

JavaScript (Node.js), 44 bytes

In ascending order. Simple recursion. 1-indexed.

f=(n,i=0,a=[])=>n?f(n-1,~i&1+i*2,[...a,i]):a

Try it online!

JavaScript (Node.js), 43 41 38 35 bytes

... or return as string. Still in ascending order. 0-indexed.

f=(n,i=0)=>n?i+[,f(n-1,~i&1+i*2)]:i

Try it online!

JavaScript (Node.js), 40 bytes

In ascending order. 2**n/3 trick. 1-indexed.

n=>Array(n).fill(i=0).map(_=>2**++i/3|0)

Try it online!

Shieru Asakoto

Posted 2018-01-22T09:27:21.747

Reputation: 4 445

1

Ruby, 72 68 61 bytes

->n{a=[0]*n;n.times{|i|i.times{|j|a[i]|=1<<j if i%2!=j%2}};a}

Explained:

def f(n)
  a = [0] * n
  n.times do |i|
    i.times do |j|
      if i.even? != j.even?
        a[i] |= (1 << j)
      end
    end
  end
  a
end

This approach uses n'th bit installation using x | (1 << n). We start from the last bit and proceeding to the first, setting each 2'nd, alternating ones and zeros 'even?' check tells where to start.

Try Now!

I am new in both code golf and Ruby, so any comments will be appreciated!

Netherwire

Posted 2018-01-22T09:27:21.747

Reputation: 119

1Welcome to PPCG! Since you're not using f for a recursive call, unnamed functions are completely fine, so you can save two bytes on the f=. Also using odd? instead of even? saves two more bytes. – Martin Ender – 2018-02-19T08:54:07.887

0

Python 3 53 bytes

lambda n:[int(('0'+'10'*i)[:i+1],2)for i in range(n)]

Try it online

Asone Tuhid

Posted 2018-01-22T09:27:21.747

Reputation: 1 944

0

Red, 71 67 bytes

f: func[n][d: 0 loop n - 1[print d d: d * 2 + either odd? d[0][1]]]

1-indexed

Try it online!

And here's the Red impementation of Neil's 2/3 trick:

Red, 51 bytes

f: func[n][repeat i n[print to-integer 2 ** i / 3]]

Try it online!

Galen Ivanov

Posted 2018-01-22T09:27:21.747

Reputation: 13 815

0

SNOBOL4 (CSNOBOL4), 64 bytes

	N =INPUT
I	X =LT(X,N) X + 1	:F(END)
	OUTPUT =2 ^ X / 3	:(I)
END

Try it online!

1-indexed. Uses the 2^i/3 method.

Giuseppe

Posted 2018-01-22T09:27:21.747

Reputation: 21 077

0

C 52 bytes

i,a;f(n){for(;i++<n;){printf("%d ",a);a=a*2+1-a%2;}}

Try it online!

Without error messages (61 bytes):

int i,a;void f(n){for(;i++<n;){printf("%d ",a);a=a*2+1-a%2;}}

Try it online!

Asone Tuhid

Posted 2018-01-22T09:27:21.747

Reputation: 1 944

0

Clean, 61 bytes

import StdEnv
$i=[sum[2^(n-p)\\p<-[1..n]|isOdd p]\\n<-[0..i]]

Try it online!

Οurous

Posted 2018-01-22T09:27:21.747

Reputation: 7 916

0

Perl 5, 44 + 2 (-pa) = 46 bytes

$\+=(length sprintf'%b',$_)/$F[0]while$_--}{

Try it online!

Xcali

Posted 2018-01-22T09:27:21.747

Reputation: 7 671

0

clojure, 61 bytes

(fn f[n r](if(> n 0)(cons r(f(- n 1)(+ r r 1(-(mod r 2)))))))

Usage:

user> (f 10 0)
(0 1 2 5 10 21 42 85 170 341)

user84207

Posted 2018-01-22T09:27:21.747

Reputation: 171

0

Dart, 49 bytes

f(n,{a:0})=>new List.generate(n,(x)=>a=a<<1|x&1);

Use as

main() {
 print(f(31));
}

See DartPad

lrn

Posted 2018-01-22T09:27:21.747

Reputation: 521

0

Jelly, 5 bytes

R2*:3

Try it online!

Took Emigna's strategy and ported it to Jelly.

ellie

Posted 2018-01-22T09:27:21.747

Reputation: 131

0

Scala, 64 bytes

val f=(n:Int)=>Stream from 1 map(i=>(1<<i)/3)take n mkString " "

1-indexed. A call to f(7) for example would return 0 1 2 5 10 21 42.

6infinity8

Posted 2018-01-22T09:27:21.747

Reputation: 371

0

Jelly, 13 bytes

Rṁ@⁾10VDḄ
ḶÇ€

Try it online!

Comrade SparklePony

Posted 2018-01-22T09:27:21.747

Reputation: 5 784