Битовая последовательность


22

Бит плавает от LSB к MSB, перемещаясь на одну позицию каждый раз, пока не достигнет верхней части контейнера:

0000
0001
0010
0100
1000

Как только один бит всплывает наверх, другой бит начинает свое путешествие и останавливается, когда встречается другой бит:

1001
1010
1100

Это происходит до тех пор, пока контейнер не будет заполнен битами:

1101
1110
1111

Вызов

Учитывая целое число, выведите « Последовательность битов » для контейнера с таким количеством битов.

  • Каждый член последовательности может быть отделен любым разделителем по вашему выбору.
  • Редактирование : Последовательность должна быть показана в виде десятичной целых чисел, начиная с первыми термами: 0.
  • Размер контейнера должен быть больше нуля и вплоть до количества бит самого большого целого числа, поддерживаемого выбранным вами языком. Вы можете предположить, что входные данные всегда соответствуют этому требованию.

Примеры

Требуется только числовая последовательность, двоичное представление показано в качестве примера:

  • За 1 :0 1

    0 -> 0
    1 -> 1
    
  • Для 3 :0 1 2 4 5 6 7

    000 -> 0
    001 -> 1
    010 -> 2
    100 -> 4
    101 -> 5
    110 -> 6
    111 -> 7
    
  • Для 4 :0 1 2 4 8 9 10 12 13 14 15

    0000 -> 0
    0001 -> 1
    0010 -> 2
    0100 -> 4
    1000 -> 8
    1001 -> 9
    1010 -> 10
    1100 -> 12
    1101 -> 13
    1110 -> 14
    1111 -> 15
    
  • Для 8 :0 1 2 4 8 16 32 64 128 129 130 132 136 144 160 192 193 194 196 200 208 224 225 226 228 232 240 241 242 244 248 249 250 252 253 254 255

    00000000 -> 0
    00000001 -> 1
    00000010 -> 2
    00000100 -> 4
    00001000 -> 8
    …
    …
    …
    11111000 -> 248
    11111001 -> 249
    11111010 -> 250
    11111100 -> 252
    11111101 -> 253
    11111110 -> 254
    11111111 -> 255
    

2
Можем ли мы вывести последовательность в любом порядке (т.е. в обратном порядке), или они должны быть отсортированы по убыванию?
Кевин Круйссен

1
Можно ли выводить как поплавки? Например[0.0, 1.0]
Grimmy

8
Можем ли мы вывести, используя двоичное представление?
Нил

Можем ли мы вывести последовательность с нулевым индексом? т.е.0 -> [0, 1]
аттинат

Ответы:


7

05AB1E , 10 байтов

LRL˜Íoî.¥ï

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

L                 # range [1..input]
 R                # reversed
  L               # convert each to a range: [[1..input], [1..input-1], ..., [1]]
   ˜              # flatten
    Í             # subtract 2 from each
     o            # 2**each
      î           # round up (returns a float)
       ï          # convert to integer
        .¥        # undelta

2
Я думаю, что где-то есть метапост, позволяющий использовать .0по умолчанию числа с плавающей точкой , но не уверен. Лично я обычно помещаю ïнижний колонтитул в симпатичную печать и не включаю его в подсчет байтов.
Кевин Круйссен

7

Python 2 , 45 байт

y=n=2**input()
while y:print n-y;y=y&y-1or~-y

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

Оказывается, короче, чтобы генерировать 2**nминус каждый член в последовательности для ввода n. Если мы посмотрим на их двоичное расширение, ниже для n=5, мы увидим хороший образец треугольников 1 в двоичных расширениях.

100000  32
011111  31
011110  30
011100  28
011000  24
010000  16
001111  15
001110  14
001100  12
001000  8
000111  7
000110  6
000100  4
000011  3
000010  2
000001  1

Каждое число получается из предыдущего, удаляя самый правый в двоичном расширении, за исключением того, что если бы это было число 0, мы вместо этого вычитаем 1, создавая новый блок из 1, который начинает новый меньший треугольник. Это реализовано как y=y&y-1or~-y, где y&y-1есть небольшая хитрость, чтобы удалить крайнюю правую 1, и or~-yдает y-1вместо этого, если это значение было 0.

Python 2 , 49 байт

def f(n,x=0):1%n;print x;f(n-x%2,x+(x%2**n or 1))

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

Функция, которая печатает, завершается с ошибкой. Более приятная программа ниже оказалась длиннее.

51 байт

n=input()
x=0
while n:n-=x%2;print x;x+=x%2**n or 1

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


6

Желе , 11 10 байт

RUḶ’F2*ĊÄŻ

Port of @Grimy 's 05AB1E answer , так что обязательно проголосуйте за него!
-1 байт благодаря @Grimy .

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

Объяснение:

R           # Create a list in the range [1, (implicit) argument]
 U          # Reverse it to [argument, 1]
           # Create an inner list in the range [0, N) for each value N in this list
           # Decrease each by 1
    F       # Flatten the list of lists
     2*     # Take 2 to the power each
       Ċ    # Ceil
        Ä   # Undelta (cumulative sum) the list
         Ż  # And add a leading 0
            # (after which the result is output implicitly)

2
R_2-> Ḷ’для -1. это единственный разумный диапазон , я действительно хотел бы, чтобы 05AB1E имел для этого однобайтовый код.
Мрачный

@ Грими Ах, как я скучал по этому. Я искал диапазон и, должно быть, пропустил его как-то ..>.> Спасибо!
Кевин Круйссен

4

Perl 5 ( -n), 41 40 байт

-1 байт спасибо Xcali

map{/01.*1/||say oct}glob"0b"."{0,1}"x$_

TIO

  • "{0,1}"x$_: строка "{0,1}"повторяется n раз
  • "0b". присоединиться к "0b"
  • glob : глобальное расширение (декартово произведение)
  • map{... }: для каждого элемента
  • /01.*1/||: пропустить, когда 01что-то следует1
  • say oct : преобразовать в десятичную и сказать


4

JavaScript (ES6), 43 байта

В случае сомнений используйте метод xnor .

n=>(g=x=>x?[n-x,...g(x&--x||x)]:[])(n=1<<n)

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


JavaScript (ES6),  59 57 55  52 байта

f=(n,x=0)=>x>>n?[]:[x,...f(n,x+=x+(x&=-x)>>n|!x||x)]

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

Как?

п(Икс)2Иксп(0)знак равно0

xx1x

п(52)знак равно52А ТАКЖЕ-52знак равно4

panaN(0)знак равно0

an(k+1)={an(k)+p(an(k)),if p(aN(К))0 а также aN(К)+п(aN(К))<2NaN(К)+1,иначе

комментарии

f = (                   // f is a recursive function taking:
  n,                    //   n = input
  x = 0                 //   x = current term of the sequence
) =>                    //
  x >> n ?              // if x is greater than or equal to 2**n:
    []                  //   stop recursion
  :                     // else:
    [                   //   update the sequence:
      x,                //     append the current term to the sequence
      ...f(             //     do a recursive call:
        n,              //       pass n unchanged
        x +=            //       update x:
          x + (x &= -x) //         given x' = lowest bit of x set to 1:
          >> n          //         if x + x' is greater than or equal to 2**n
          | !x          //         or x' is equal to 0: add 1 to x
          || x          //         otherwise, add x' to x
      )                 //     end of recursive call
    ]                   //   end of sequence update


3

Perl 6 , 43 байта

{0 x$_,{say :2($_);S/(0)1|0$/1$0/}...1 x$_}

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

Блок анонимного кода, который принимает число и выводит последовательность, разделенную переводами строки. Это работает, начиная с 0, повторенных n раз, затем заменяя либо 01на 10или последним 0на1 пока число не станет равным единице.

Или 40 байтов, используя подход Науэля Фуйе

{grep /010*1/|{say :2($_)},[X~] ^2 xx$_}

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


« затем заменить либо 01на 10или последним 0на, 1пока число не станет равным единице ». Это гениальный ход!
PaperBirdMaster





2

05AB1E , 13 12 байт

Tsãʒ1ÛSO2‹}C{

-1 байт благодаря @Grimy (также посмотрите на его более короткий подход здесь).

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

T             # Push 10
 sã           # Swap to get the (implicit) input, and get the cartesian product with "10"
   ʒ          # Filter it by:
    1Û        #  Remove leading 1s
      SO      #  Get the sum of the remaining digits
        !     #  Check that the sum is either 0 or 1 by taking the factorial
              #  (NOTE: Only 1 is truthy in 05AB1E)
         }C   # After the filter: convert all remaining strings from binary to integer
           {  # And sort (reverse) them
              # (after which the result is output implicitly)

Альтернативный 13: oL<ʒbIj1Û1¢2‹. Не похоже, что я могу получить это ниже.
Мрачный

1
@ Грими, я только что получил oL<ʒbIj1ÛSO2‹и пытался увидеть, где моя ошибка. :) Но я рад, что вы не можете найти более короткую версию для одного из моих ответов для разнообразия. ; p (inb4 ты найдешь более короткий xD)
Кевин Круйссен

1
@ Грими У меня такое чувство, что SO2‹может быть 3 байта, может быть, как-то, но я не вижу этого, а также не совсем уверен ... Есть некоторые альтернативы, например SO1~или SÆ>d, но я не могу найти 3-байтовый.
Кевин Круйссен

1
10 с совершенно другим подходом
Grimmy

1
Ваше чувство было правильным, я только что нашел 3 байта SO!. Я уверен, что у меня есть несколько старых ответов, 2‹которые тоже могли бы извлечь из этого пользу.
Мрачный

2

Сетчатка , 26 байт

.+
*0
L$w`.(.*)
$.`*1$'1$1

Попробуйте онлайн! Выходы в двоичном виде. Если это не приемлемо, то для 39 байтов:

.+
*0
L$w`.(.*)
$.`*1$'1$1
+`10
011
%`1

Попробуйте онлайн!Объяснение:

.+
*0

Преобразовать ввод в строку n нулей.

L$w`.(.*)

Сопоставьте все возможные непустые подстроки.

$.`*1$'1$1

Для каждой подстроки выведите: префикс с 0s изменен на 1s; суффикс; совпадение с исходным 0изменено на1 .

+`10
011
%`1

Преобразовать из двоичного в десятичное.



1

Древесный уголь , 19 байт

I⮌E⊕θEι⁺⁻X²IθX²ιX²λ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

    θ               Input
   ⊕                Incremented
  E                 Map over implicit range
      ι             Outer index
     E              Map over implicit range
           Iθ       Input cast to integer
               ι    Outer index
                  λ Inner index
         X²  X² X²  Power of 2
       ⁺⁻           Subtract and add
 ⮌                  Reverse outer list
I                   Cast to string
                    Implicitly print


1

Сетчатка , 24 байта

.+
*0
/0/+<0`(0)1|0$
1$1

Выходы в двоичном виде. У ввода должен быть завершающий перевод строки.

Попытка объяснения:

.+              #match the entire input
*0              #replace it with that many zeroes
/0/+<0`(0)1|0$  #while the string has a 0, substitute the first match and output
1$1             #if 01 is present in the string, replace it with 10, else replace the last character with $

Я попытался избежать /0/опции регулярного выражения длиной 3 байта , переставив параметры, но не смог.

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


Я не думаю, что вывод в двоичном разрешен. Есть комментарий, спрашивающий, разрешено ли это, но лучше предположить, что вы не можете, пока ответчик не ответит
Джо Кинг,


1

k4, 28 24 байта

0,+\"j"$2 xexp,/-1+|,\!:

Подход @ Grimy портирован на k4

редактировать: -4 благодаря ngn!


1
!:'1+|!:->|,\!:
ngn

Вы можете удалить пробел послеxexp
нгн

@ngn, ах, |,\!:кажется, теперь так очевидно, что я это вижу!
каракули
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.