Bit schwebende Sequenz

22

Ein Bit schwebt vom LSB zum MSB und bewegt sich jedes Mal um eine Position, bis es oben im Container schwebt :

0000
0001
0010
0100
1000

Sobald ein Bit nach oben schwebt, beginnt ein anderes Bit seine Reise und stoppt, wenn es auf ein anderes Bit trifft:

1001
1010
1100

Dies geschieht so lange, bis der Container mit Bits gefüllt ist:

1101
1110
1111

Herausforderung

Geben Sie bei einer Ganzzahl die " Bit Floating Sequence " für einen Container mit dieser Anzahl von Bits aus.

  • Jeder Term der Sequenz kann durch ein beliebiges Trennzeichen Ihrer Wahl getrennt werden.
  • Bearbeiten : Sequenz als Dezimalzahl mit Integer - Zahlen dargestellt werden, die durch die erste therm Anfänge 0.
  • Die Containergröße sollte größer als Null und bis zur Anzahl der Bits der größten Ganzzahl sein, die von der Sprache Ihrer Wahl unterstützt wird. Sie können davon ausgehen, dass die Eingabe immer dieser Anforderung entspricht.

Beispiele

Es wird nur die numerische Sequenz benötigt, die binäre Darstellung wird als Beispiel gezeigt:

  • Für 1 :0 1

    0 -> 0
    1 -> 1
    
  • Für 3 :0 1 2 4 5 6 7

    000 -> 0
    001 -> 1
    010 -> 2
    100 -> 4
    101 -> 5
    110 -> 6
    111 -> 7
    
  • Für 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
    
  • Für 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
quelle
2
Dürfen wir die Sequenz in beliebiger Reihenfolge ausgeben (dh umgekehrt), oder müssen sie vom niedrigsten zum höchsten sortiert werden?
Kevin Cruijssen
1
Dürfen wir als floats ausgeben? ZB[0.0, 1.0]
Grimmy
8
Dürfen wir mit der binären Darstellung ausgeben?
Neil
Dürfen wir die nullindexierte Sequenz ausgeben? ie0 -> [0, 1]
attinat

Antworten:

7

05AB1E , 10 Bytes

LRL˜Íoî.¥ï

Probieren Sie es 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
Grimmig
quelle
2
Ich denke, es gibt irgendwo einen Meta-Post, der .0standardmäßig Gleitkommazahlen für ganze Zahlen zulässt, aber nicht sicher ist. Normalerweise ïfüge ich das in die Fußzeile ein, um einen hübschen Ausdruck zu erhalten, und beziehe es nicht in die Byteanzahl ein.
Kevin Cruijssen
7

Python 2 , 45 Bytes

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

Probieren Sie es online!

Es stellt sich heraus, dass es kürzer ist, 2**nminus jedes Terms in der Sequenz für die Eingabe zu generieren n. Wenn wir uns ihre binäre Erweiterung ansehen n=5, sehen wir unten ein schönes Muster von Dreiecken von Einsen in den binären Erweiterungen.

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

Jede Zahl ergibt sich aus der vorherigen, indem die am weitesten rechts stehende Zahl in der binären Erweiterung entfernt wird. Wenn dies jedoch die Zahl 0 ergibt, subtrahieren wir stattdessen 1 und erstellen einen neuen Einsenblock, der ein neues kleineres Dreieck beginnt. Dies wird implementiert als y=y&y-1or~-y, wo y&y-1ist ein Trick, um die am weitesten rechts stehende 1 zu entfernen, und or~-ygibt y-1stattdessen, wenn dieser Wert 0 war.

Python 2 , 49 Bytes

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

Probieren Sie es online!

Eine Funktion, die druckt und mit einem Fehler beendet wird. Das schönere Programm unten fiel länger aus.

51 Bytes

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

Probieren Sie es online!

xnor
quelle
6

Jelly , 11 bis 10 Bytes

RUḶ’F2*ĊÄŻ

Port of @Grimys 05AB1E-Antwort , also stelle sicher, dass du ihn positiv bewertest!
-1 Byte dank @Grimy .

Probieren Sie es online aus.

Erläuterung:

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
quelle
2
R_2-> Ḷ’für -1. ist der einzig sinnvolle Bereich , ich wünschte wirklich, 05AB1E hätte einen Single-Byter dafür.
Grimmy
@Grimy Ah, wie habe ich das vermisst? Ich habe nach Bereich gesucht und muss ihn irgendwie übersprungen haben ..>.> Danke!
Kevin Cruijssen
4

Perl 5 ( -n), 41 - 40 Bytes

-1 Byte Danke an Xcali

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

TIO

  • "{0,1}"x$_: Die Zeichenfolge wird "{0,1}"n-mal wiederholt
  • "0b". : verketten zu "0b"
  • glob : Glob Expansion (kartesisches Produkt)
  • map{... }: für jedes Element
  • /01.*1/||: zu überspringen, wenn 01dann etwas folgt1
  • say oct : in dezimal umwandeln und sagen
Nahuel Fouilleul
quelle
40
Xcali
4

JavaScript (ES6), 43 Byte

Verwenden Sie im Zweifelsfall die Methode von xnor .

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

Probieren Sie es online!


JavaScript (ES6),  59 57 55  52 Byte

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

Probieren Sie es online!

Wie?

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

Kommentiert

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
quelle
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

Probieren Sie es online!

TFeld
quelle
3

Perl 6 , 43 Bytes

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

Probieren Sie es online!

Anonymer Codeblock, der eine Zahl annimmt und die durch Zeilenumbrüche getrennte Sequenz ausgibt. Dies funktioniert, indem Sie n-mal mit 0 beginnen und dann entweder 01mit 10oder das letzte Mal 0mit a ersetzen1 bis die Zahl nur noch eins ist.

Oder 40 Bytes mit Nahuel Fouilleuls Ansatz

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

Probieren Sie es online!

Scherzen
quelle
" dann entweder 01durch 10oder das letzte 0durch a ersetzen, 1bis die Zahl nur noch eins ist " Das ist ein genialer Schachzug!
PaperBirdMaster
3

Python 3 , 62 Bytes

def f(n,c=0):
 while c<2**n:yield c;r=c&-c;c+=c+r>>n or r or 1

Probieren Sie es online!

Die Idee ist mehr oder weniger die gleiche wie bei @ Arnauld .

Eine weitere 65-Byte-Lösung:

lambda n:g(2**n-1)
g=lambda c:[0][c:]or g(c-((c&-c)//2 or 1))+[c]

Probieren Sie es online!

Joel
quelle
2

05AB1E , 13 12 Bytes

Tsãʒ1ÛSO2‹}C{

-1 Byte dank @Grimy ( siehe auch seine kürzere Herangehensweise hier).

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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
quelle
Alternative 13: oL<ʒbIj1Û1¢2‹. Sieht nicht so aus, als könnte ich es senken.
Grimmy
1
@ Grimy hatte ich gerade oL<ʒbIj1ÛSO2‹ versucht zu sehen, wo mein Fehler war. :) Aber ich bin froh zu sehen, dass Sie ausnahmsweise keine kürzere Version für eine meiner Antworten finden. ; p (inb4 findest du immerhin einen kürzeren xD)
Kevin Cruijssen
1
@Grimy Ich habe das Gefühl SO2‹kann vielleicht irgendwie 3 Bytes sein, aber ich sehe es nicht und bin mir auch nicht ganz sicher .. Es gibt einige Alternativen, wieSO1~ oder SÆ>d, aber ich kann keine 3-Bytes finden.
Kevin Cruijssen
1
10 mit einem ganz anderen Ansatz
Grimmy
1
Ihr Gefühl war richtig, ich habe gerade einen 3-byter: SO!. Ich bin mir ziemlich sicher, dass ich einige alte Antworten habe, 2‹die auch davon profitieren könnten.
Grimmig
2

Netzhaut , 26 Bytes

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

Probieren Sie es online! Ausgänge in binärer Form. Wenn das nicht akzeptabel ist, dann für 39 Bytes:

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

Probieren Sie es online! Erläuterung:

.+
*0

Konvertieren Sie die Eingabe in eine Folge von nNullen.

L$w`.(.*)

Ordnen Sie alle möglichen nicht leeren Teilzeichenfolgen zu.

$.`*1$'1$1

Geben Sie für jede Teilzeichenfolge Folgendes aus: das Präfix mit 0 s wurde in s geändert 1. das Suffix; Die Übereinstimmung mit der Initiale 0änderte sich zu 1.

+`10
011
%`1

Konvertiert von binär zu dezimal.

Neil
quelle
2

Brachylog , 27 Bytes

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

Probieren Sie es online!

Ausgaben außer Betrieb und mit Duplikaten. Wenn das nicht in Ordnung ist, gehe dozum Ende.

Nicht verwandte Zeichenfolge
quelle
1

Holzkohle , 19 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

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

Retina , 24 Bytes

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

Ausgänge in binärer Form. Die Eingabe sollte einen nachgestellten Zeilenumbruch haben.

Erklärungsversuch:

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

Ich habe versucht, die 3 Bytes lange /0/Regex-Option durch Neuanordnen der Optionen zu umgehen , konnte dies aber nicht.

Probieren Sie es online!

Mein Pronomen ist monicareinstate
quelle
Ich glaube nicht, dass die Ausgabe in Binärform erlaubt ist. In einem Kommentar wird gefragt, ob dies zulässig ist. Es ist jedoch besser anzunehmen, dass dies nicht möglich ist, bis der Fragesteller antwortet
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;}

Probieren Sie es 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
quelle
1

k4, 28 24 Bytes

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

@ Grimys Ansatz auf k4 portiert

edit: -4 danke an ngn!

kritzeln
quelle
1
!:'1+|!:->|,\!:
ngn
Sie können den Raum nach dem Entfernenxexp
ngn
@ngn, agh |,\!:scheint jetzt so offensichtlich, dass ich es sehe!
kritzeln