ลำดับการลอยบิต


22

บิตลอยจากLSBไปยังMSBย้ายหนึ่งตำแหน่งในแต่ละครั้งจนกว่าจะลอยไปที่ด้านบนของคอนเทนเนอร์:

0000
0001
0010
0100
1000

เมื่อหนึ่งบิตลอยไปด้านบนอีกบิตเริ่มต้นการเดินทางและจะหยุดเมื่อพบบิตอื่น:

1001
1010
1100

สิ่งนี้จะเกิดขึ้นจนกว่าคอนเทนเนอร์จะเต็มไปด้วยบิต:

1101
1110
1111

ท้าทาย

กำหนดตัวเลขจำนวนเต็มเอาท์พุท " ลำดับบิตลอย " สำหรับคอนเทนเนอร์ที่มีจำนวนบิตนั้น

  • แต่ละคำของลำดับสามารถแยกโดยตัวคั่นที่คุณเลือก
  • แก้ไข : ลำดับจะต้องแสดงเป็นตัวเลขทศนิยมจำนวนเต็มเริ่มต้นโดย Therm 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
เราสามารถเรียงลำดับในลำดับใด ๆ (เช่นกลับด้าน) หรือต้องเรียงลำดับจากต่ำสุดไปสูงสุด
Kevin Cruijssen

1
เราจะเอาท์พุทแบบลอยได้ไหม? เช่น[0.0, 1.0]
Grimmy

8
เราสามารถส่งออกโดยใช้การเป็นตัวแทนไบนารี?
Neil

เราสามารถส่งออกลำดับศูนย์ดัชนี ie0 -> [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จำนวนเต็มเป็นค่าเริ่มต้น แต่ไม่แน่ใจ ฉันมักจะใส่ïในส่วนท้ายเพื่อพิมพ์สวยและไม่รวมไว้ในไบต์นับ
Kevin Cruijssen

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 's คำตอบ 05AB1Eเพื่อให้แน่ใจว่าจะ upvote เขา!
-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 Ah ฉันพลาดได้อย่างไร ฉันค้นหาช่วงและต้องข้ามผ่านไปอย่างใด .. >.> ขอบคุณ!
Kevin Cruijssen

4

Perl 5 ( -n), 41 40 ไบต์

-1 ไบต์ทะลุถึง Xcali

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

TIO

  • "{0,1}"x$_: สตริง"{0,1}"ซ้ำ n ครั้ง
  • "0b". : เชื่อมต่อกับ "0b"
  • glob : การขยายแบบ 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)]

ลองออนไลน์!

อย่างไร?

พี(x)2xพี(0)=0

ฟังก์ชั่นนี้สามารถใช้งานได้ด้วยระดับบิตและจาก x-x1x

พี(52)=52และ-52=4

พีanan(0)=0

an(k+1)={an(k)+พี(an(k)),ถ้า พี(an(k))0 และ an(k)+พี(an(k))<2nan(k)+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 ซ้ำ n ครั้งแล้วแทนที่ด้วย01ด้วย10หรือสุดท้าย0ด้วย a 1จนกระทั่งจำนวนเป็นเพียง

หรือ 40 ไบต์โดยใช้ แนวทางของ Nahuel Fouilleul

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

ลองออนไลน์!


" จากนั้นแทนที่01ด้วย10หรือสุดท้าย0ด้วย a 1จนกระทั่งตัวเลขเป็นเพียงแค่ " นั่นเป็นการย้ายอัจฉริยะ!
PaperBirdMaster



3

Python 3 , 62 ไบต์

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

ลองออนไลน์!

แนวคิดนี้มากหรือน้อยเหมือนกับวิธีการแก้ปัญหาของ @ Arnauldวิธีการแก้ปัญหาของ

โซลูชัน 65 ไบต์อื่น:

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

ลองออนไลน์!



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)

สำรอง oL<ʒbIj1Û1¢2‹13: ดูไม่เหมือนว่าฉันจะลดระดับลงได้
Grimmy

1
@Grimy ฉันเพิ่งได้oL<ʒbIj1ÛSO2‹และพยายามที่จะดูว่าข้อผิดพลาดของฉันอยู่ที่ไหน :) แต่ฉันดีใจที่เห็นว่าคุณไม่สามารถหารุ่นที่สั้นกว่าสำหรับคำตอบของฉันสำหรับการเปลี่ยนแปลง ; p (inb4 คุณหาอันที่สั้นกว่า xD)
Kevin Cruijssen

1
@Grimy ฉันมีความรู้สึกที่SO2‹อาจเป็น 3 ไบต์อย่างใด แต่ฉันไม่เห็นมันและยังไม่แน่ใจทั้งหมด .. มีทางเลือกบางอย่างเช่นSO1~หรือSÆ>dแต่ฉันไม่สามารถหา 3 byter
Kevin Cruijssen

1
10ด้วยวิธีที่แตกต่างอย่างสิ้นเชิง
Grimmy

1
ความรู้สึกของคุณถูกขวาฉันเพิ่งพบ 3 SO!byter: ค่อนข้างแน่ใจว่าฉันมีคำตอบเก่า ๆ ที่ใช้2‹ซึ่งจะได้ประโยชน์จากเรื่องนี้เช่นกัน
Grimmy

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; คำต่อท้าย; การแข่งขันที่มีการเริ่มต้นที่มีการเปลี่ยนแปลงไป01

+`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 $

ฉันพยายามหลีกเลี่ยง/0/ตัวเลือก regex ยาว 3 ไบต์โดยจัดเรียงตัวเลือกใหม่ แต่ทำไม่ได้

ลองออนไลน์!


ฉันไม่คิดว่าจะอนุญาตให้ส่งออกในรูปแบบไบนารี มีความคิดเห็นถามว่าได้รับอนุญาตหรือไม่ แต่ดีกว่าที่จะสมมติว่าคุณทำไม่ได้จนกว่าผู้ถามจะตอบ
Jo King


1

k4, 28 24 ไบต์

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

@ วิธีการของ Grimy ส่งไปยัง k4 แล้ว

แก้ไข: -4 ขอบคุณ ngn!


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

คุณสามารถลบพื้นที่หลังจากxexp
NGN

@ngn |,\!:ดูเหมือนจะชัดเจนแล้วตอนนี้ฉันเห็นมัน!
เขียนลวก ๆ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.