Secuencia flotante de bits

22

Un bit flota del LSB al MSB moviéndose una posición cada vez hasta que flota en la parte superior del contenedor:

0000
0001
0010
0100
1000

Una vez que un bit flota hacia la cima, otro comienza su viaje y se detiene cuando se encuentra con otro:

1001
1010
1100

Esto sucede hasta que el contenedor se llena de bits:

1101
1110
1111

Reto

Dado un número entero, genera la " secuencia flotante de bits " para un contenedor de ese número de bits.

  • Cada término de la secuencia puede estar separado por cualquier separador de su elección.
  • Editar : secuencia debe ser mostrado como números decimales enteros, empezando por la primera therm: 0.
  • El tamaño del contenedor debe ser mayor que cero y hasta el número de bits del entero más grande admitido por el idioma de su elección. Puede suponer que la entrada siempre coincide con este requisito.

Ejemplos

Solo se requiere la secuencia numérica, la representación binaria se muestra como ejemplo:

  • 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
fuente
2
¿Podemos generar la secuencia en cualquier orden (es decir, invertida), o tienen que clasificarse de menor a mayor?
Kevin Cruijssen
1
¿Podemos producir como flotadores? Por ejemplo[0.0, 1.0]
Grimmy
8
¿Podemos generar utilizando la representación binaria?
Neil
¿Podemos generar la secuencia indexada a cero? es decir0 -> [0, 1]
attinat

Respuestas:

7

05AB1E , 10 bytes

LRL˜Íoî.¥ï

Pruébalo en línea!

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
Mugriento
fuente
2
Creo que hay una meta-publicación en algún lugar que permite flotantes con .0números enteros por defecto, pero no estoy seguro. Personalmente, generalmente pongo el ïpie de página en letra bonita y no lo incluyo en el conteo de bytes.
Kevin Cruijssen
7

Python 2 , 45 bytes

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

Pruébalo en línea!

Resulta más corto generar 2**nmenos cada término en la secuencia de entrada n. Si observamos su expansión binaria, a continuación n=5, vemos un bonito patrón de triángulos de 1 en las expansiones binarias.

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 se obtiene del anterior eliminando el que está más a la derecha en la expansión binaria, excepto que si eso fuera el número 0, restamos 1 en su lugar, creando un nuevo bloque de 1 que comienza un nuevo triángulo más pequeño. Esto se implementa como y=y&y-1or~-y, donde y&y-1hay un pequeño truco para eliminar el 1 más a la derecha, y or~-yda y-1en su lugar si ese valor fue 0.

Python 2 , 49 bytes

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

Pruébalo en línea!

Una función que imprime, terminando con error. El programa más agradable a continuación resultó más largo.

51 bytes

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

Pruébalo en línea!

xnor
fuente
6

Jalea , 11 10 bytes

RUḶ’F2*ĊÄŻ

Puerto de @Grimy 's respuesta 05AB1E , así que asegúrese de que le upvote!
-1 byte gracias a @Grimy .

Pruébalo en línea.

Explicación:

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
fuente
2
R_2-> Ḷ’para -1. es el único rango sensible , realmente desearía que 05AB1E tuviera un byte único para ello.
Grimmy
@ Grimy Ah, ¿cómo extrañé esa? Busqué el rango y debo haberlo omitido.>.> ¡Gracias!
Kevin Cruijssen
4

Perl 5 ( -n), 41 40 bytes

-1 byte gracias a Xcali

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

TIO

  • "{0,1}"x$_: la cadena se "{0,1}"repite n veces
  • "0b". : concatenar a "0b"
  • glob : expansión glob (producto cartesiano)
  • map{... }: para cada elemento
  • /01.*1/||: saltar cuando 01algo lo sigue1
  • say oct : para convertir a decimal y decir
Nahuel Fouilleul
fuente
40
Xcali
4

JavaScript (ES6), 43 bytes

En caso de duda, utilice el método de xnor .

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

Pruébalo en línea!


JavaScript (ES6),  59 57 55  52 bytes

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

Pruébalo en línea!

¿Cómo?

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,otherwise

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
fuente
3

Perl 6 , 43 bytes

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

Pruébalo en línea!

Bloque de código anónimo que toma un número y genera la secuencia separada por nuevas líneas. Esto funciona comenzando con 0 repetidas n veces y luego reemplazando 01con 10o el último 0con a 1hasta que el número sea solo unos.

O 40 bytes, usando el enfoque de Nahuel Fouilleul

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

Pruébalo en línea!

Jo King
fuente
" luego reemplazando 01con 10o el último 0con un 1hasta que el número sea solo unos " ¡Es un movimiento genial!
PaperBirdMaster
2

05AB1E , 13 12 bytes

Tsãʒ1ÛSO2‹}C{

-1 byte gracias a @Grimy (también eche un vistazo a su enfoque más corto aquí).

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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
fuente
Alterna 13: oL<ʒbIj1Û1¢2‹. No parece que pueda bajarlo.
Grimmy
1
@Grimy que acababa de tener oL<ʒbIj1ÛSO2‹e intentaba ver dónde estaba mi error. :) Pero me alegra ver que no puedes encontrar una versión más corta de una de mis respuestas para variar. ; p (enb4 encuentras uno más corto después de todo xD)
Kevin Cruijssen
1
@Grimy Tengo la sensación de que SO2‹puede ser de 3 bytes de alguna manera, tal vez, pero no lo veo y tampoco estoy del todo seguro. Hay algunas alternativas, como SO1~o SÆ>d, pero no puedo encontrar un byte 3.
Kevin Cruijssen
1
10 con un enfoque completamente diferente
Grimmy
1
Su sensación fue bien, me acaba de encontrar a 3 byter: SO!. Estoy bastante seguro de que tengo algunas respuestas antiguas 2‹que también podrían beneficiarse de esto.
Grimmy
2

Retina , 26 bytes

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

Pruébalo en línea! Salidas en binario. Si eso no es aceptable, entonces para 39 bytes:

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

Pruébalo en línea! Explicación:

.+
*0

Convierta la entrada en una cadena de nceros.

L$w`.(.*)

Haga coincidir todas las posibles subcadenas no vacías.

$.`*1$'1$1

Para cada subcadena, salida: el prefijo con 0s cambiado a 1s; el sufijo el partido con la inicial 0cambió a 1.

+`10
011
%`1

Convierte de binario a decimal.

Neil
fuente
2

Brachylog , 27 bytes

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

Pruébalo en línea!

Salidas fuera de servicio y con duplicados. Si eso no está bien, vételo doal final.

Cadena no relacionada
fuente
1

Carbón de leña , 19 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

    θ               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
fuente
1

Retina , 24 bytes

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

Salidas en binario. La entrada debe tener una nueva línea final.

Intento de explicación:

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

Traté de evitar la /0/opción de expresión regular de 3 bytes de largo reorganizando las opciones, pero no pude.

Pruébalo en línea!

mi pronombre es monicareinstate
fuente
No creo que la salida en binario esté permitida. Hay un comentario que pregunta si está permitido, pero es mejor suponer que no puede hacerlo hasta que el autor de la pregunta 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;}

Pruébalo en línea!

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
fuente
1

k4, 28 24 bytes

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

Enfoque de @ Grimy portado a k4

editar: -4 gracias a ngn!

garabatear
fuente
1
!:'1+|!:->|,\!:
ngn
puede quitar el espacio despuésxexp
NGN
@ngn, ¡agh |,\!:parece tan obvio ahora que lo veo!
garabato