비트 플로팅 시퀀스


22

비트가 LSB 에서 MSB 로 플로팅되어 컨테이너 상단 으로 플로팅 될 때까지 매번 한 위치 씩 이동 합니다.

0000
0001
0010
0100
1000

한 비트가 맨 위로 떠 오면 다른 비트가 이동을 시작하고 다른 비트를 만나면 중지합니다.

1001
1010
1100

이것은 컨테이너가 비트로 채워질 때까지 발생합니다.

1101
1110
1111

도전

정수가 주어지면 해당 비트 수의 컨테이너에 대해 " 비트 부동 시퀀스 "를 출력하십시오 .

  • 순서의 각 항은 선택한 구분 기호로 분리 할 수 ​​있습니다.
  • 편집 : 시퀀스는 첫 번째 열로 시작하는 십진 정수로 표시되어야합니다 0.
  • 컨테이너 크기는 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]
그리미

8
이진 표현을 사용하여 출력 할 수 있습니까?

인덱스가없는 시퀀스를 출력 할 수 있습니까? 즉,0 -> [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

파이썬 2 , 45 바이트

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

온라인으로 사용해보십시오!

2**n입력 시퀀스에서 각 항에 마이너스 를 생성하는 것이 더 짧습니다 n. 아래에서 이진 확장을 살펴보면 이진 확장에서 n=51의 멋진 삼각형 패턴을 볼 수 있습니다.

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 아닌 경우.

파이썬 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 의 05AB1E 답변, 따라서 그를 찬성 해야합니다! @Grimy
덕분에 -1 바이트.

온라인으로 사용해보십시오.

설명:

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 그것을 위해 단일 byter 있었으면 좋겠다.
그리미

@ 그림 아, 어떻게 내가 그리워. 나는 범위를 검색했고 어떻게 든 그것을 건너 뛰어야했다. ..>.> 감사합니다!
Kevin Cruijssen

4

펄 5 ( -n), 41 40 바이트

Xcali에 -1 바이트

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

TIO

  • "{0,1}"x$_ : 문자열 "{0,1}" n 번 반복
  • "0b". :에 연결 "0b"
  • glob : 글로브 확장 (카테 시안 제품)
  • map{...} : 각 요소마다
  • /01.*1/||: 01다음에 무언가가 올 때 건너 뛰기1
  • say oct : 십진수로 변환하고 말하기


4

자바 스크립트 (ES6), 43 바이트

의심 스러운 경우 xnor 's method를 사용 하십시오 .

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

온라인으로 사용해보십시오!


자바 스크립트 (ES6),  59 57 55  52 바이트

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

온라인으로 사용해보십시오!

방법?

우리는 정의합니다(엑스)2엑스(0)=0

이 함수는 간단한 비트 AND로 구현할 수 있습니다. 엑스엑스1엑스

(52)=5252=4

에이에이(0)=0

에이(케이+1)={에이(케이)+(에이(케이)),만약 (에이(케이))0 과 에이(케이)+(에이(케이))<2에이(케이)+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

펄 6 , 43 바이트

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

온라인으로 사용해보십시오!

숫자를 가져와 개행 문자로 구분 된 시퀀스를 출력하는 익명 코드 블록입니다. 0 반복 N 시간은 다음 중 하나를 교체로 시작하여이 작품 01과 함께 10또는 마지막 0로모그래퍼 1수까지는 것입니다.

또는 Nahuel Fouilleul의 접근 방식을 사용하여 40 바이트

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

온라인으로 사용해보십시오!


" 다음 중 하나를 교체 01와 함께 10마지막 또는 0A를 1수 때까지 그냥 사람이다 "그것은 천재 이동입니다!
PaperBirdMaster





2

05AB1E , 13 12 바이트

Tsãʒ1ÛSO2‹}C{

@Grimy 덕분에 -1 바이트 (여기서 그의 짧은 접근법을 살펴보십시오).

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

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)

대안 13 : oL<ʒbIj1Û1¢2‹. 내가 더 낮아질 수있는 것처럼 보이지 않습니다.
그리미

1
@ 그림 oL<ʒbIj1ÛSO2‹은 방금 가지고 있었고 내 오류가 어디에 있는지 보려고했습니다. :) 그러나 나는 당신이 변화에 대한 나의 대답 중 하나에 대한 더 짧은 버전을 찾을 수 없다는 것을 기쁘게 생각합니다. ; p (inb4 xxD보다 짧은 것을 찾으십시오)
Kevin Cruijssen

1
나는 느낌이 @Grimy SO2‹어떻게 든 아마도 3 바이트가 될 수 있습니다,하지만 난 그것을 보이지 않아요 또한 전적으로 있는지 ..이 몇 가지 대안이 같이 있습니다 SO1~또는 SÆ>d,하지만 난 3 byter을 찾을 수 없습니다입니다.
Kevin Cruijssen

1
완전히 다른 방식으로 10
Grimmy

1
당신의 느낌이 옳았습니다. 방금 3 바이 터를 찾았습니다 SO!. 2‹이것도 도움이 될 수 있는 오래된 답변 이 있습니다.
그리미

2

레티 나 , 26 바이트

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

온라인으로 사용해보십시오! 이진수로 출력합니다. 이것이 허용되지 않으면 39 바이트 동안 :

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

온라인으로 사용해보십시오! 설명:

.+
*0

입력을 n0 의 문자열로 변환하십시오 .

L$w`.(.*)

비어 있지 않은 모든 하위 문자열을 일치시킵니다.

$.`*1$'1$1

각 하위 문자열에 대해 출력 : 0s 가 붙은 접두사가 s로 변경되었습니다 1. 접미사; 초기와의 일치가로 0변경되었습니다 1.

+`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/옵션을 다시 정렬하여 3 바이트 길이의 정규식 옵션 을 피하려고 했지만 할 수 없었습니다.

온라인으로 사용해보십시오!


바이너리로 출력하는 것이 허용되지 않는다고 생각합니다. 그것이 허용되는지 묻는 의견이 있지만, 요청자가 대답 할 때까지는 할 수 없다고 가정하는 것이 좋습니다
Jo King

1

C (클랑) , 73 바이트

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

온라인으로 사용해보십시오!

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 바이트

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

@ 그림의 접근 방식을 k4로 이식

편집 : ngn 덕분에 -4!


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

이후 공간을 제거 할 수 있습니다xexp
ngn

@ ngn, 아아 |,\!:지금은 내가 그것을 볼 너무 분명 보인다!
낙서
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.