Bitowa sekwencja zmiennoprzecinkowa


22

Trochę unosi się z LSB do MSB za każdym razem przesuwając jedną pozycję, aż unosi się na górę kontenera:

0000
0001
0010
0100
1000

Gdy jeden bit unosi się na szczyt, kolejny bit rozpoczyna swoją podróż i zatrzymuje się, gdy napotyka inny bit:

1001
1010
1100

Dzieje się tak, dopóki pojemnik nie zostanie wypełniony bitami:

1101
1110
1111

Wyzwanie

Biorąc pod uwagę liczbę całkowitą, wypisz „ Bitową sekwencję zmienną ” dla kontenera o tej liczbie bitów.

  • Każdy termin w sekwencji może być oddzielony dowolnym wybranym separatorem.
  • Edycja : Sekwencja muszą być przedstawione w postaci liczb całkowitych dziesiętną, począwszy od pierwszego THERM 0.
  • Rozmiar kontenera powinien być większy od zera i do liczby bitów największej liczby całkowitej obsługiwanej przez wybrany język. Możesz założyć, że dane wejściowe zawsze spełniają to wymaganie.

Przykłady

Wymagana jest tylko sekwencja numeryczna, reprezentacja binarna pokazana jest jako przykład:

  • Dla 1 :0 1

    0 -> 0
    1 -> 1
    
  • Dla 3 :0 1 2 4 5 6 7

    000 -> 0
    001 -> 1
    010 -> 2
    100 -> 4
    101 -> 5
    110 -> 6
    111 -> 7
    
  • Dla 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
    
  • Dla 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
Czy możemy wygenerować sekwencję w dowolnej kolejności (tj. Odwróconej), czy też muszą być sortowane od najniższej do najwyższej?
Kevin Cruijssen

1
Czy możemy wyprowadzać dane jako zmiennoprzecinkowe? Np.[0.0, 1.0]
Grimmy

8
Czy możemy generować dane wyjściowe za pomocą reprezentacji binarnej?
Neil

Czy możemy wygenerować sekwencję o indeksie zerowym? tj.0 -> [0, 1]
attinat

Odpowiedzi:


7

05AB1E , 10 bajtów

LRL˜Íoî.¥ï

Wypróbuj online!

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
Myślę, że gdzieś jest meta-post, który .0domyślnie dopuszcza liczbę zmiennoprzecinkową dla liczb całkowitych, ale nie jestem pewien. Osobiście zwykle umieszczam ïstopkę w ładnym druku i nie uwzględniam jej w liczbie bajtów.
Kevin Cruijssen

7

Python 2 , 45 bajtów

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

Wypróbuj online!

Okazuje się, że krótsze jest generowanie 2**nminus każdy termin w sekwencji do wprowadzenia n. Jeśli spojrzymy na ich rozwinięcie binarne, poniżej n=5widzimy ładny wzór trójkątów 1 w rozwinięciach binarnych.

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

Każda liczba jest uzyskiwana z poprzedniej liczby przez usunięcie skrajnej prawej cyfry w rozwinięciu binarnym, z wyjątkiem tego, że liczba 0, odejmujemy 1, tworząc nowy blok 1, który rozpoczyna nowy mniejszy trójkąt. Jest to zaimplementowane jako y=y&y-1or~-y, gdzie y&y-1jest trochę sztuczka, aby usunąć skrajnie prawą 1, i or~-ydaje y-1zamiast tego, jeśli ta wartość wynosiła 0.

Python 2 , 49 bajtów

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

Wypróbuj online!

Funkcja drukująca, kończąca się z błędem. Bardziej przyjemny program poniżej okazał się dłuższy.

51 bajtów

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

Wypróbuj online!


6

Galaretka , 11 10 bajtów

RUḶ’F2*ĊÄŻ

Port odpowiedzi @ABrimy 05AB1E , więc pamiętaj, aby go zagłosować!
-1 bajt dzięki @Grimy .

Wypróbuj online.

Wyjaśnienie:

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-> Ḷ’dla -1. to jedyny rozsądny zakres , naprawdę chciałbym, żeby 05AB1E miał dla niego jednobajtowy.
Grimmy

@Grimy Ah, jak mi tego brakowało. Szukałem zasięgu i musiałem go jakoś pominąć ..>.> Dzięki!
Kevin Cruijssen

4

Perl 5 ( -n), 41 40 bajtów

-1 bajtów dzięki Xcali

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

TIO

  • "{0,1}"x$_: ciąg "{0,1}"powtórzony n razy
  • "0b". : konkatenuje z "0b"
  • glob : ekspansja globalna (produkt kartezjański)
  • map{... }: dla każdego elementu
  • /01.*1/||: aby pominąć, gdy 01następuje coś wtedy1
  • say oct : przekonwertować na dziesiętne i powiedzieć


4

JavaScript (ES6), 43 bajty

W razie wątpliwości użyj metody xnor .

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

Wypróbuj online!


JavaScript (ES6),  59 57 55  52 bajtów

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

Wypróbuj online!

W jaki sposób?

p(x)2xp(0)=0

xx1x

p(52)=52AND52=4

panan(0)=0

an(k+1)={an(k)+p(an(k)),if p(an(k))0 and an(k)+p(an(k))<2nan(k)+1,Inaczej

Skomentował

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 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera liczbę i wyświetla sekwencję oddzieloną znakami nowej linii. Ten zaczynając od 0 powtarzane n razy następnie zastąpienie albo prace 01z 10lub ostatni 0z 1aż liczba jest zaledwie nich.

Lub 40 bajtów, używając podejście Nahuela Fouilleula

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

Wypróbuj online!


Następnie zastąpienie albo 01z 10lub ostatni 0z 1aż liczba jest tylko te ” To posunięcie geniusz!
PaperBirdMaster





2

05AB1E , 13 12 bajtów

Tsãʒ1ÛSO2‹}C{

-1 bajt dzięki @Grimy (zobacz także jego krótsze podejście tutaj).

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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)

Alternatywny 13: oL<ʒbIj1Û1¢2‹. Nie wygląda na to, żebym mógł obniżyć.
Grimmy

1
@Grimy Właśnie miałem oL<ʒbIj1ÛSO2‹i próbowałem zobaczyć, gdzie był mój błąd. :) Ale cieszę się, że nie możesz znaleźć krótszej wersji dla jednej z moich odpowiedzi na zmianę. ; p (inb4 w końcu znajdziesz krótszy xD)
Kevin Cruijssen

1
@Grimy Mam wrażenie, że SO2‹może być jakoś 3 bajtami, ale nie widzę tego i też nie jestem do końca pewny .. Istnieje kilka alternatyw, takich jak SO1~lub SÆ>d, ale nie jestem w stanie znaleźć 3-bajtowego.
Kevin Cruijssen

1
10 z zupełnie innym podejściem
Grimmy

1
Twoje uczucie było w porządku, po prostu znaleźli 3-byter: SO!. Jestem pewien, że mam kilka starych odpowiedzi, 2‹które również mogłyby z tego skorzystać.
Grimmy

2

Siatkówka , 26 bajtów

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

Wypróbuj online!Wyjścia w formacie binarnym. Jeśli to nie do przyjęcia, to dla 39 bajtów:

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

Wypróbuj online!Wyjaśnienie:

.+
*0

Przekształć dane wejściowe w ciąg znaków n zer.

L$w`.(.*)

Dopasuj wszystkie możliwe niepuste podciągi.

$.`*1$'1$1

Dla każdego podłańcucha należy wyprowadzić: przedrostek 0s zmieniono na 1s; sufiks; dopasowanie z początkową 0zmieniono na1 .

+`10
011
%`1

Konwertuj z binarnego na dziesiętny.



1

Węgiel drzewny , 19 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

    θ               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

Siatkówka , 24 bajty

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

Wyjścia w formacie binarnym. Dane wejściowe powinny mieć końcowy znak nowej linii.

Próba wyjaśnienia:

.+              #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 $

Próbowałem ominąć /0/opcję wyrażenia regularnego o długości 3 bajtów, zmieniając opcje, ale nie mogłem.

Wypróbuj online!


Nie wydaje mi się, aby wyjście w formacie binarnym było dozwolone. Jest komentarz z pytaniem, czy jest to dozwolone, ale lepiej założyć, że nie możesz, dopóki pytający nie odpowie
Jo King,

1

C (brzęk) , 73 bajty

o,j,y;f(x){for(o=j=0;printf("%d ",o),x;o+=y+!y,y+=y+!y)j=!j?y=0,--x:--j;}

Wypróbuj online!

for(o=j=0;printf("%d ",o),x;  o+=y+!y, y+=y+!y) 
// adds 1, 1+1=>2 , 2+2=> 4 .... sequence

 j=!j?y=0,--x:--j; 
// uses ternary instead of nested loop to decrement 'x' when 'j' go to 0

1

k4, 28 24 bajtów

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

@ Podejście Grimy przeniesione na k4

edycja: -4 dzięki ngn!


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

możesz usunąć spację poxexp
ngn

@ngn, agh |,\!:wydaje się teraz tak oczywiste, jak to widzę!
bazgranina
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.