Первые n чисел без последовательных равных двоичных цифр


32

Последовательность содержит десятичное представление двоичных чисел вида:, 10101...где n-й член имеет n битов.

Последовательность, вероятно, проще всего объяснить, просто показывая отношения между двоичным и десятичным представлениями чисел:

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, допустимо ли выводить результат в обратном порядке?
лохматый

Да, пока это отсортировано. @Shaggy
Стьюи Гриффин

Здесь мне повезло, но будет ли этот формат вывода приемлемым [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 года, иначе я бы номинировал его на « Лучшее математическое понимание» на «Лучшее из PPCG 2017» . Надеюсь, я все еще помню это в начале 2019 года.; P
Кевин Круйссен

@KevinCruijssen это лучшее, что я видел из всех codegolf.stackexchange.com/a/51574/17360
qwr

3
@KevinCruijssen не забудь!
Bassdrop Cumberwubwubwub

2
@BassdropCumberwubwubwub Спасибо за напоминание, потому что я действительно полностью забыл об этом! Он был добавлен в номинации.
Кевин Круйссен

11

05AB1E , 4 байта

2 байта сохранены с помощью трюка Нила 2/3

Lo3÷

Попробуйте онлайн!

объяснение

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

05AB1E , 6 байтов

TRI∍ηC

Попробуйте онлайн!

объяснение

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

Желе , ... 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.

Версия, основанная на трюке Нила 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 2 , 45 37 36 байт

-3 байта благодаря user202729
-1 байт благодаря mathmandan

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

Попробуйте онлайн!


Удвоение s- это то же самое, что добавление sк самому себе, поэтому я думаю, что вы можете сделать это, s+=s+~s%2чтобы сохранить байт.
математика

5

Python 3, 68 61 54 48 43 байта

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

Спасибо user202729 за помощь в сохранении 19 байтов и ов за помощь в сохранении 6 байтов.

Попробуйте онлайн


Спасибо за это -1 байт. И я думаю, что я не могу заменить, если еще с и или?
Маниш Кунду

Хорошо, уже сделал это.
Маниш Кунду

2
Поскольку x == 0эквивалентно целому числу not xif 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

Предполагается ⎕IO( я ndex O rigin) 0, что по умолчанию во многих системах. Функция анонимного молчаливого префикса. 1-индексироваться.

(2⊥⍴∘1 0)¨⍳

Попробуйте онлайн!

ɩ ndices 0 ... п-1

( Применить следующую молчаливую функцию к каждому

⍴∘1 0 циклически изменить список [1,0]до такой длины

2⊥ преобразовать из base-2 (двоичного) в нормальное число


4

Perlv5.10 -n , 24 + 1 байт

-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

для оценки я бы сказал: 27 + 1 ( -n) = 28 байт, потому что для запуска однострочного perl нужно использовать, -eа чтобы использовать 5.10, вам просто нужно использовать -Eту же длину
Науэль Фуийе

может сэкономить 3 байта, используя $|--вместо($.^=1)
Науэль Фуйе



4

C , 81 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! :) Я не парень С, но вы можете почерпнуть некоторые подсказки из решения Steadybox .
лохматый

Хорошо, теперь это имеет смысл, я включил всю программу, когда все, что мне нужно, это функция, а все остальное можно сделать в нижнем колонтитуле. Я думаю, что это может быть значительно улучшено тогда.
Minerscale

Добро пожаловать в PPCG! Вы можете сохранить байт, удалив i++и изменив i&1на i++&1. Кроме того , хотя в качестве глобальных переменных iи jинициализируются нулем на начальном этапе, они должны быть инициализированы внутри функции, так как функция представления должны быть многоразовым .
Steadybox

1
Более того, можно сэкономить еще 2 байта, полностью исключая троицу.
user202729

2
50 байт: i,j;f(c){for(i=j=0;i<c;)printf("%d ",j+=j+i++%2);} попробуйте онлайн!
Steadybox

4

Haskell , 47 40 53 49 44 40 34 байта

-4 байта благодаря пользователю 202729
-6 байтов благодаря лайкони

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

Попробуйте онлайн!


Вы можете заменить otherwiseна например 1>0( otherwise == True)
flawr

Чтобы играть в гольф еще больше, вы можете использовать охрану для назначения чего-то, например, вот так: Попробуйте онлайн!
flawr

1
PS: Также ознакомьтесь с советами по игре в гольф на хаскеле, а также в нашем хаскель-чате из монад и мужчин .
flawr

1
Вам нужно создать функцию, которая возвращает первые n элементов списка, где n - аргумент.
полностью человек

1
Да, точно. Я могу рекомендовать взглянуть на наши Руководство по правилам игры в гольф на Хаскеле , в котором постарается отразить текущий консенсус относительно того, что разрешено, а что нет.
Лайкони

4

Рубин , 26 байт

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

Попробуйте онлайн!

Бьет все старые рубиновые ответы.

объяснение

1/3в двоичном виде выглядит так 0.01010101..., так что если вы умножите его на степени двух, вы получите:

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

Но Руби записывает числа на деление, давая мне последовательность, которая мне нужна.



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*$-1*

Здесь есть куча настроек: "$+"+оборачивает сцену в цикл. Значение "$+"рассматривается как замена и $+относится к входу программы, т.е. n . Это означает, что цикл запущен n раз.

Затем ¶<оборачивает каждую итерацию в выходной этап, который печатает входные данные этапа с завершающим переводом строки (поэтому первая итерация печатает ноль, вторая итерация печатает результат первой итерации и т. Д.).

Сам этап заменяет всю рабочую строку с подстановкой в ​​последней строке. Тот использует неявные закрывающие скобки и неявные аргументы для оператора повторения *, так что на самом деле это сокращение от:

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

Материал внутри скобок можно разбить на три части:

  • $&*_: дает строку из (n-1) _ s.
  • _: дает сингл _.
  • 2*$-1*_: дает строку 2 * a (n-1) _ . $-1Относится к результату предпоследнего в журнале результата, т.е. итерации цикла до последнего. Вот почему нам нужно было сначала скопировать ноль в журнале, иначе это будет относиться к вводу программы на первой итерации.

Затем $.(…)измеряет длину полученной строки. Другими словами, мы вычислили a(n) = a(n-1) + 1 + 2*a(n-2), пройдя через унарный (хотя на самом деле это не так:$.(…) он ленив и фактически не оценивает его содержимое, если он может определить результирующую длину непосредственно с помощью арифметики, так что это даже довольно эффективно).

Результат последней итерации цикла ( n + 1- й элемент последовательности) печатается из-за неявного вывода Retina в конце программы.


3

Brain-Flak , 36 байт

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

Попробуйте онлайн!

Объяснение:

Следующее число в последовательности получается с помощью n*2+1или 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


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 's 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)

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
}


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

Тестовая программа

#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

Джапт , 10 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 ...если бы Pбыл добавлен в конец ( flip), делая его 8 байтов.


1
Хорошая идея,&+
Луис Мендо

1

Рубин -n ,32 30 + 1 байт

Так как у нас есть ровно 1 строка ввода, $. это божественно удобно!

РЕДАКТИРОВАТЬ: Я удивлен, что мне удалось превзойти себя, но кажется, что использование -nкоторого считается как 1 (по правилу 2 в особых условиях по умолчанию , так как Ruby может быть запущен с ruby -e 'full program'(таким образом -n, 1), все экземпляры 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, хотя.
Unihedron

1

AWK a=0 , 31 байт

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

Попробуйте онлайн!

Использует формулу, бесстыдно украденную из этого другого ответа Ruby.

Несмотря на то, что не сработало a=0бы (awk рассматривает «пусто» как 0), первый элемент 0 не будет напечатан и вместо этого будет emptyстрокой, которая, хотя я бы сказал, что правильный вывод, вероятно, не пройдет, поэтому есть a=0что быть вставлен в качестве аргумента командной строки.


Мне нравится ваша формула ^^
Asone Tuhid


1

брейкфук , 40 байт

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

Попробуйте онлайн!

0 индексированные. Вводить как код символа, выводить как унарный с нулевыми байтами, разделяющими серии кодов 1 с. Предполагает 8-битные ячейки, если вы не хотите вводить более 255. Предполагается, отрицательные ячейки, хотя это может быть исправлено за счет нескольких байтов.

Ранее 50 байтов

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

Попробуйте онлайн!

Входы как код символа, выходы как код символа. 1-индексироваться. Вероятно, можно немного поиграть в гольф.

@Unihedron указывает, что я забыл указать, что для этого нужны ячейки бесконечного размера, в противном случае он занимает 8-е число.


Когда я запускаю его с `` (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

Хорошо, кажется, это проблема с размером ячейки. Я думаю, либо ваш код должен адаптироваться к большим целым числам, либо вам нужно указать реализацию, которая бы правильно выполняла ваш код, но по умолчанию 8-битных ячеек недостаточно
Unihedron

Забыл об этом, спасибо @Unihedron! Я подумаю над 8-битной версией, вероятно, с выводом в унарной версии.
Джо Кинг

Используя интерпретатор с 32-битными ячейками, все работает. Хотя я думаю, что я мог бы попробовать себя в bitinteger (8-битной) версии, если вы не
попробуете
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.