Sequência flutuante de bits

22

Um bit flutua do LSB para o MSB, movendo-se uma posição de cada vez até flutuar para o topo do contêiner:

0000
0001
0010
0100
1000

Quando um bit flutua para o topo, outro bit inicia sua jornada e para quando encontra outro bit:

1001
1010
1100

Isso acontece até que o contêiner seja preenchido com bits:

1101
1110
1111

Desafio

Dado um número inteiro, imprima a " Sequência flutuante de bits " para um contêiner desse número de bits.

  • Cada termo da sequência pode ser separado por qualquer separador de sua escolha.
  • Editar : Sequência deve ser mostrados como números decimais inteiros, começando pelo primeiro terma: 0.
  • O tamanho do contêiner deve ser maior que zero e até o número de bits do maior número inteiro suportado pelo idioma de sua escolha. Você pode assumir que a entrada sempre corresponde a esse requisito.

Exemplos

Somente a sequência numérica é necessária, a representação binária é mostrada como exemplo:

  • Para 1 :0 1

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

    000 -> 0
    001 -> 1
    010 -> 2
    100 -> 4
    101 -> 5
    110 -> 6
    111 -> 7
    
  • Para 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
    
  • Para 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
    
PaperBirdMaster
fonte
2
Podemos produzir a sequência em qualquer ordem (ou seja, invertida) ou elas precisam ser classificadas do menor para o maior?
Kevin Cruijssen 6/09
1
Podemos produzir como carros alegóricos? Por exemplo[0.0, 1.0]
Grimmy
8
Podemos produzir usando a representação binária?
Neil
Podemos produzir a sequência indexada a zero? por exemplo0 -> [0, 1]
attinat 6/09

Respostas:

7

05AB1E , 10 bytes

LRL˜Íoî.¥ï

Experimente 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
Grimmy
fonte
2
Eu acho que existe um meta-post em algum lugar que permite flutuações com .0por padrão para números inteiros, mas não tenho certeza. Pessoalmente, geralmente coloco o ïrodapé para imprimir e não o incluo na contagem de bytes.
Kevin Cruijssen 6/09
7

Python 2 , 45 bytes

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

Experimente online!

É mais curto gerar 2**nmenos cada termo na sequência de entrada n. Se olharmos para a expansão binária, abaixo, paran=5 , vemos um bom padrão de triângulos de 1 nas expansões binárias.

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

Cada número é obtido do anterior removendo o mais à direita na expansão binária, exceto se isso for o número 0, subtraímos 1 em vez disso, criando um novo bloco de 1s que inicia um novo triângulo menor. Isso é implementado como y=y&y-1or~-y, onde y&y-1é um pequeno truque para remover o 1 mais à direita, e or~-yfornece y-1se esse valor foi 0.

Python 2 , 49 bytes

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

Experimente online!

Uma função que imprime, terminando com erro. O programa mais agradável abaixo acabou por mais tempo.

51 bytes

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

Experimente online!

xnor
fonte
6

Geléia , 11 10 bytes

RUḶ’F2*ĊÄŻ

Porto de @Grimy resposta 05AB1E 's , por isso, certifique-se de upvote-lo!
-1 byte graças a @Grimy .

Experimente online.

Explicação:

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)
Kevin Cruijssen
fonte
2
R_2-> Ḷ’para -1. é o único alcance sensato , eu realmente gostaria que o 05AB1E tivesse um único byter para isso.
Grimmy
@ Grimy Ah, como eu perdi essa. Procurei o alcance e devo ter passado por ele de alguma forma ..>.> Obrigado!
Kevin Cruijssen 6/09
4

Perl 5 ( -n), 41 40 bytes

-1 byte thanls em Xcali

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

TIO

  • "{0,1}"x$_: a sequência "{0,1}"repetida n vezes
  • "0b". : concatenar para "0b"
  • glob : expansão glob (produto cartesiano)
  • map{... }: para cada elemento
  • /01.*1/||: pular quando for 01seguido por algo1
  • say oct : para converter para decimal e dizer
Nahuel Fouilleul
fonte
40
Xcali
4

JavaScript (ES6), 43 bytes

Em caso de dúvida, use o método xnor .

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

Experimente online!


JavaScript (ES6),  59 57 55  52 bytes

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

Experimente online!

Quão?

p(x)2xp(0)=0

xx1x

p(52)=52E-52=4

pumanuman(0 0)=0 0

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

Comentado

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
Arnauld
fonte
3

Python 2 , 95 76 bytes

n=input()
a=0
print 0
while n:
 for j in range(n):print a+2**j
 n-=1;a+=2**n

Experimente online!

TFeld
fonte
3

Perl 6 , 43 bytes

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

Experimente online!

Bloco de código anônimo que pega um número e gera a sequência separada por novas linhas. Isso funciona, começando com 0 repetidas n vezes, em seguida, substituindo, quer 01com 10ou o último 0com um 1até que o número é apenas queridos.

Ou 40 bytes, usando a abordagem de Nahuel Fouilleul

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

Experimente online!

Brincadeira
fonte
"Em seguida, substituindo, quer 01com 10ou o último 0com um 1até que o número é apenas os " Isso é um movimento gênio!
PaperBirdMaster
2

05AB1E , 13 12 bytes

Tsãʒ1ÛSO2‹}C{

-1 byte graças a @Grimy ( veja também sua abordagem mais curta aqui).

Experimente online ou verifique todos os casos de teste .

Explicação:

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)
Kevin Cruijssen
fonte
Alternate 13: oL<ʒbIj1Û1¢2‹. Não parece que eu posso diminuí-lo.
Grimmy
1
@ Grimy eu só tinha oL<ʒbIj1ÛSO2‹e estava tentando ver onde estava o meu erro. :) Mas fico feliz em ver que você não consegue encontrar uma versão mais curta para uma das minhas respostas, para variar. ; p (inb4 você encontra um menor, afinal xD)
Kevin Cruijssen
1
@ Grimy Tenho a sensação de que SO2‹pode ter 3 bytes, de alguma forma, talvez, mas não estou vendo e também não tenho certeza. Existem algumas alternativas, como SO1~ou SÆ>d, mas não consigo encontrar um byter de 3.
Kevin Cruijssen 6/09
1
10 com uma abordagem completamente diferente
Grimmy 6/09
1
Seu sentimento era certo, eu só encontrei um 3-Byter: SO!. Tenho certeza de que tenho algumas respostas antigas 2‹que poderiam se beneficiar disso também.
Grimmy 6/09
2

Retina , 26 bytes

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

Experimente online! Saídas em binário. Se isso não for aceitável, então para 39 bytes:

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

Experimente online! Explicação:

.+
*0

Converta a entrada em uma sequência de nzeros.

L$w`.(.*)

Combine todas as possíveis substrings não vazias.

$.`*1$'1$1

Para cada substring, output: o prefixo com 0s mudou para 1s; o sufixo; a partida com a inicial0 alterada para1 .

+`10
011
%`1

Converta de binário para decimal.

Neil
fonte
2

Braquilog , 27 bytes

1;0|⟦₅;2z^₍ᵐLtT&-₁↰+ᵐ↙T,L,0

Experimente online!

Saídas fora de ordem e com duplicatas. Se não estiver tudo bem, siga dopara o final.

String não relacionada
fonte
1

Carvão , 19 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

    θ               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
Neil
fonte
1

Retina , 24 bytes

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

Saídas em binário. A entrada deve ter uma nova linha à direita.

Tentativa de explicação:

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

Tentei evitar a /0/opção regex de 3 bytes de comprimento reorganizando as opções, mas não consegui.

Experimente online!

meu pronome é monicareinstate
fonte
Eu não acho que a saída em binário seja permitida. Há um comentário perguntando se é permitido, mas é melhor supor que você não pode até que o solicitante responda
Jo King
1

C (clang) , 73 bytes

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;}

Experimente 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
AZTECCO
fonte
1

k4, 28 24 bytes

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

@ Abordagem de Grimy portada para k4

edit: -4 graças a ngn!

rabisco
fonte
1
!:'1+|!:->|,\!:
ngn 16/09
você pode remover o espaço apósxexp
ngn 16/09
@ngn, agh |,\!:parece tão óbvio agora que eu vejo isso!
rabisco