Бітова плаваюча послідовність


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]
attinat

Відповіді:


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*ĊÄŻ

Порт @Grimy '05AB1E відповідь , так що не забудьте підтримати його!
-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 мав для нього однобайтер.
Grimmy

@Grimy Ах, як я пропустив це. Я шукав дальність і, мабуть, пропустив його, пройшов якось ..>.> Спасибі!
Кевін Кройсейсен

4

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

-1 байт дякує Xcali

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

ТІО

  • "{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)]

Спробуйте в Інтернеті!

Як?

Визначимо p(х) як найвища сила Росії 2 ділення х, с p(0)=0 за умовами.

Ця функція може бути реалізована за допомогою простого розрядного AND х і -х щоб виділити найнижчий біт, встановлений на 1 в х. Наприклад:

p(52)=52І-52=4

Використання p, послідовність ан можна визначити як ан(0)=0 і:

ан(к+1)={ан(к)+p(ан(к)),якщо p(ан(к))0 і ан(к)+p(ан(к))<2нан(к)+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 повторним п раз , щось не замінюючи або 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‹. Не схоже, що я можу опустити її нижче.
Grimmy

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

1
@Grimy У мене таке відчуття SO2‹може бути якось 3 байти, але я цього не бачу, а також не зовсім впевнений. Є кілька альтернатив, на кшталт SO1~або SÆ>d, але я не можу знайти 3-байт.
Кевін Круїссен

1
10 із зовсім іншим підходом
Grimmy

1
Ваше почуття було правильно, я тільки що знайшов 3-byter: 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 $

Я спробував уникнути 3- /0/байтного варіанту регулярного виразів, переставляючи параметри, але не зміг.

Спробуйте в Інтернеті!


Я не думаю, що вихід у двійковій формі дозволений. Там є коментар із запитанням, чи дозволено це, але краще припустити, що ви не можете, поки запитувач не відповість
Jo King


1

k4, 28 24 байти

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

@ Підхід Гримі переніс на k4

редагувати: -4 завдяки ngn!


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

you can remove the space after xexp
ngn

@ngn, agh |,\!: seems so obvious now that i see it!
scrawl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.