연속적인 이진 숫자가없는 첫 n 개의 숫자


32

이 시퀀스에는 다음과 같은 형식의 이진수 숫자의 10 진수 표현이 포함됩니다. 10101...여기서 n 번째 항에는 n 비트가 있습니다.

순서는 숫자의 이진 표현과 소수 표현 사이의 관계를 보여줌으로써 가장 쉽게 설명 할 수 있습니다.

0       ->  0
1       ->  1
10      ->  2
101     ->  5
1010    ->  10
10101   ->  21
101010  ->  42

도전:

입력 integer를 가져 와서 n시퀀스에서 처음 n 개의 숫자를 리턴하십시오. 0 인덱스 또는 1 인덱스 시퀀스를 선택할 수 있습니다.

테스트 사례 :

n = 1   <- 1-indexed
0

n = 18
0, 1, 2, 5, 10, 21, 42, 85, 170, 341, 682, 1365, 2730, 5461, 10922, 21845, 43690, 87381

언제나처럼 설명이 권장됩니다.

이다 OEIS A000975 .


자체 MATL 솔루션이 주어지면 결과를 역순으로 출력 할 수 있습니까?
얽히고 설킨

예, 정렬되어있는 한 가능합니다. @Shaggy
Stewie Griffin

내 행운을 여기로 밀고 있지만이 출력 형식이 허용 [85,[42,[21,[10,[5,[2,[1,0]]]]]]]됩니까?
얽히고 설킨

답변:


66

파이썬 2 , 36 바이트

lambda n:[2**i*2/3for i in range(n)]

온라인으로 사용해보십시오! 설명 : 이진 표현 인 단순히 2의 적절한 전원하여 곱하고 정수 부분을 남아 있도록.20.101010101...


1
2018 년 1 월이 너무 나쁘면 그렇지 않으면 Best of PPCG 2017에 대한 최고의 수학적 통찰력으로 추천했을 것입니다 . 잘만되면 나는 아직도 2019 년 초에 그것을 기억한다.; p
Kevin Cruijssen

@KevinCruijssen이 나는 모든 밖으로 본 것 중에 최고입니다 codegolf.stackexchange.com/a/51574/17360
qwr

3
@KevinCruijssen 잊지 마세요!
Bassdrop Cumberwubwubwub

2
@BassdropCumberwubwubwub 사실은 완전히 잊어 버렸기 때문에 미리 알림에 감사드립니다. 그것은 지명에 추가되었습니다.
Kevin Cruijssen


9

젤리 , ... 4 바이트

감사 마일 -1 바이트!

ḶḂḄƤ

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

설명:

owered range, or Unength. Get [0, 1, 2, 3, ..., n-1]
 Ḃ    it. Get the last bit of each number. [0, 1, 0, 1, ...]
   Ƥ  for each Ƥrefixes [0], [0, 1], [0, 1, 0], [0, 1, 0, 1], ...
  Ḅ   convert it from inary to integer.

젤리 , 4 바이트

Jonathan Allan의 버전.

Ḷ€ḂḄ

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

owered range, or Unength.
 €    Apply for each. Automatically convert the number n
      to the range [1,2,..,n]. Get [[0],[0,1],[0,1,2],..].
  Ḃ   it. Get the last bit from each number.
      Current value: [[0],[0,1],[0,1,0],..]
   Ḅ  Convert each list from inary to integer.

Neil의 2/3 트릭을 기반으로하는 버전은 5 바이트를 제공합니다 (개정 내역 참조).


ḶḂḄƤ빠른 접두사가이를 위해 만들어졌다
마일

접두사가 빠를 필요조차 없습니다 Ḷ€ḂḄ.
Jonathan Allan

5

MATL , 5 바이트

:WI/k

Neil의 답변을 기반으로 합니다.

설명

:       % Implicit input, n. Push range [1 2 ... n]
W       % 2 raised to that, element-wise. Gives [2 4 ...2^n] 
I       % Push 3
/       % Divide, element-wise
k       % Round down, element-wise. Implicit display

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


MATL , 9 바이트

:q"@:oXBs

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

설명

:       % Implicit input n. Range [1 2 ... n]
q       % Subtract 1, element-wise: gives [0 1 ... n-1]
"       % For each k in [0 1 ... n-1]
  @     %   Push k
  :     %   Range [1 2 ... k]
  o     %   Modulo 2, element-wise: gives [1 0 1 ...]
  XB    %   Convert from binary to decimal
  s     %   Sum. This is needed for k=0, to transform the empty array into 0
        % Implicit end. Implicit display


5

파이썬 3, 68 61 54 48 43 바이트

c=lambda x,r=0:x and[r]+c(x-1,2*r+~r%2)or[]  

19 바이트 저장을 도와 준 user202729 와 6 바이트 저장을 도와 주는 ov 에게 감사 합니다.

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


-1 바이트 주셔서 감사합니다. 그리고 나는 and 또는 or로 바꿀 수 없다고 생각합니다.
Manish Kundu

알았어 이미 했어
Manish Kundu

2
때문에 x == 0에 해당 not x하는 경우 x정수, (즉, 피연산자를 교환 x if c else y= y if not c else x) 좀 더 바이트를 저장합니다.
user202729

대신 드롭 i%2하여 사용할 수도 있습니다1-r%2
Rod

1
그런 다음를 추적 할 필요가 없습니다 i.
user202729

4

껍질 , 7 바이트

mḋḣ↑Θݬ

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

1 기반이므로 입력 n 은 처음 n 개의 결과를 제공합니다 .

설명

     ݬ   The infinite list [1, 0, 1, 0, 1, ...]
    Θ     Prepend a zero.
   ↑      Take the first n elements.
  ḣ       Get the prefixes of that list.
mḋ        Interpret each prefix as base 2.

4

APL (Dyalog Unicode) , 11 바이트 SBCS

⎕IO( i ndex O rigin)을 0많은 시스템에서 기본값 이라고 가정 합니다. 익명의 암묵적 접두사 기능. 1- 색인.

(2⊥⍴∘1 0)¨⍳

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

ndi 는 0… n−1을 가리 킵니다.

( 다음의 암묵적 기능을 각각에 적용하십시오

⍴∘1 0 주기적으로 목록 [1,0]을 해당 길이로 재구성

2⊥ 기수 -2 (이진수)에서 일반 숫자로 변환


4

v5.10 -n , 24 + 1 바이트

Nahuel Fouilleul 덕분에 -3 바이트 !

say$v=$v*2|$|--while$_--

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

내 Ruby 버전과 같은 논리이지만 perl이 더 간결하기 때문에 더 짧습니다. 어떤 이상한 이유로, print구분자 (젠장!)를하지 않을 것, 내가 사용했다, 그래서 say에서 v5.10;나는 지금 그것을 밖으로 떠날거야, 그래서 나는 확실히 방법이 점수 아니에요 실행하려면이 순서를? ..

설명

say    # Like shouting, but milder.
  $v = $v*2 | $|-- # Next element is this element times 2 bitwise-OR
                   # with alternating 0 1 0 1..., so 0b0, 0b1, 0b10, 0b101...
                   # $. is OUTPUT_AUTOFLUSH, which is initially 0 and
                   #   setting all non-zero values seem to be treated as 1
  while $_-- # do for [input] times

점수는 다음과 같습니다. 27 + 1 ( -n) = 28 바이트, perl one-liner를 실행 -e하려면 5.10을 사용해야하고 사용해야 -E합니다. 동일한 길이 인 을 사용해야합니다 .
Nahuel Fouilleul

$|--대신에 3 바이트를 절약 할 수 있습니다($.^=1)
Nahuel Fouilleul



4

C , 81 55 59 바이트

1 색인.

i,j;f(c){for(i=j=0;i<c;)printf("%d ",i++&1?j+=j+1:(j+=j));}

전체 프로그램, 덜 골프 :

i;j;main(c,v)char**v;{c=atoi(*++v);for(;i<c;i++)printf("%d ",i&1?j+=j+1:(j+=j));}

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

편집 2 : 함수를 생각할 때 함수를 재사용 할 필요가 없다는 가정하에 재사용 할 수 있어야한다는 것은 완벽합니다. : P

편집 : 나는 전체 프로그램을 대답에 포함시켜야한다고 오해하고 있었고, 그것을하는 기능 만 필요하다는 것이 밝혀졌습니다. 좋습니다.

여기저기서 몇 바이트를 줄일 수 있다고 확신합니다. 나는 이미 몇 가지 트릭을 사용했습니다. 프로그램의 큰 덩어리는 인수를 받아서 int로 바꾸는 데 전념합니다. 이것은 나의 첫 번째 코드 골프입니다. 내가 잘못하고 있다면 : P


2
PPCG에 오신 것을 환영합니다! :) 나는 C 사람이 아니지만 Steadybox의 솔루션 에서 힌트를 얻을 수 있습니다 .
얽히고 설킨

이제 더 이해가 되었으니 필요한 모든 것이 함수이고 나머지는 바닥 글로 할 수있을 때 전체 프로그램을 포함 시켰습니다. 나는 이것이 크게 향상 될 수 있다고 생각합니다.
Minerscale

PPCG에 오신 것을 환영합니다! 를 제거 i++하고로 변경 i&1하여 바이트를 저장할 수 있습니다 i++&1. 글로벌 변수로 있지만 또한, i그리고 j처음에 0으로 초기화되기 때문에, 그들은 함수 내에서 초기화 할 필요가 기능 제출 재사용해야 .
Steadybox

1
더 좋은 방법으로 2 바이트를 더 절약 할 수있어 3 진이 완전히 제거됩니다.
user202729

2
50 바이트 : i,j;f(c){for(i=j=0;i<c;)printf("%d ",j+=j+i++%2);} 온라인으로 사용해보십시오!
Steadybox

4

하스켈 , 47 40 53 49 44 40 34 바이트

사용자 덕분에 -4 바이트 202729 Laikoni 덕분에
-6 바이트

(`take`l)
l=0:[2*a+1-a`mod`2|a<-l]

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


otherwise예를 들어 1>0( otherwise == True)
flawr로

더욱 골프를 치기 위해 가드를 사용하여 무언가를 할당 할 수 있습니다.
flawr


1
리스트 의 처음 n 개 요소 를 리턴하는 함수를 작성해야 합니다. 여기서 n 은 인수입니다.
완전 인간

1
예, 정확히 Haskell의 골프 규칙 가이드를 살펴보면 현재 허용되는 것과 그렇지 않은 것에 대한 현재의 합의를 파악하려고합니다.
Laikoni

4

루비 , 26 바이트

->n{(1..n).map{|i|2**i/3}}

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

모든 오래된 루비 답변을 이깁니다.

설명

1/3이진수로 보이는 것처럼 0.01010101..., 2의 거듭 제곱을 곱하면 다음과 같이 됩니다.

n| 2^n/3
-+---------
1|0.1010101...
2|01.010101...
3|010.10101...
4|0101.0101...
5|01010.101...
6|010101.01...

그러나 루비는 int 나누기의 숫자를 계산하여 필요한 시퀀스를 제공합니다.



3

레티 나 , 28 바이트

)K`0
"$+"+¶<`.+
$.(*__2*$-1*

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

0부터 시작하므로 입력 n 은 첫 번째 n + 1 결과를 제공합니다 .

설명

OEIS의 재귀를 사용합니다.

a(n) = a(n-1) + 2*a(n-2) + 1

프로그램을 살펴 봅시다 :

)K`0

이것은 일정한 단계입니다. 입력을 버리고 작업 문자열을 0시퀀스의 초기 값으로 설정합니다. 는 )그룹에서이 단계를 래핑합니다. 이 그룹 자체는 아무 것도 수행하지 않지만 그룹 단계를 포함하여 거의 모든 단계에서 결과 0를 로그에 기록하므로 프로그램이 작동하려면 해당 로그에 두 개의 사본이 필요 합니다.

"$+"+¶<`.+
$.(*__2*$-1*

여기에는 많은 구성이 있습니다. "$+"+스테이지를 루프로 감 쌉니다. 이 "$+"교체로 처리하고, $+프로그램의 입력, 예를 의미 없음 . 이것은 루프가 n 번 실행됨을 의미합니다 .

그런 다음 ¶<각 반복을 출력 스테이지에 랩핑하여 스테이지의 입력 을 후행 줄 바꿈으로 인쇄합니다 (따라서 첫 번째 반복은 0을, 두 번째 반복은 첫 번째 반복의 결과를 인쇄합니다).

스테이지 자체는 전체 작업 문자열을 마지막 행의 대체로 바꿉니다. 반복 연산자에 대해 암시 적 닫는 괄호와 암시 적 인수를 사용 *하므로 실제로는 짧습니다.

$.($&*__2*$-1*_)

괄호 안의 내용은 세 부분으로 나눌 수 있습니다.

  • $&*_: a (n-1) _ 의 문자열을 제공합니다 .
  • _: 하나를 제공합니다 _.
  • 2*$-1*_: 2 * a (n-1) 의 문자열을 제공합니다 _. 은 $-1즉, 마지막 전에 루프 반복 결과 로그의 끝에서 두 번째 결과를 나타냅니다. 그렇기 때문에 로그에 0을 복사 해야하는 이유는 그렇지 않으면 첫 번째 반복에서 프로그램의 입력을 나타냅니다.

그런 다음 $.(…)결과 문자열의 길이를 측정합니다. 다시 말해, 우리는 a(n) = a(n-1) + 1 + 2*a(n-2)단항을 통해 계산 했습니다 (실제로는 : $.(…)게으르지 않고 산술을 통해 결과 길이를 직접 결정할 수 있다면 실제로 내용을 평가하지 않으므로 매우 효율적입니다).

최종 루프 반복 결과 ( 시퀀스 의 n + 1 번째 요소)는 프로그램 종료시 Retina의 암시 적 출력으로 인해 인쇄됩니다.


3

Brain-Flak , 36 바이트

{([()]{}<((({}<>)<>){}([{}]()))>)}<>

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

설명:

순서에서 다음 숫자는 n*2+1또는 로 얻을 수 n*2+0있습니다.

{([()]{}< Loop input times
  (
   (({}<>)<>){} Copy n to other stack; n*2
   ([{}]())  i = 1-i
  ) push n*2 + i
>)} End loop
<> Output other stack


2

> <> , 22 + 3 (-v 플래그) 바이트

0:nao::1+2%++$1-:?!;$!

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

설명

스택은 루프 카운터로 초기화됩니다.

0:nao                  : Push 0 to the stack, duplicate and print with a new line.
                         [7] -> [7, 0]
     ::1+              : Duplicate the stack top twice more then add 1 to it.
                         [7, 0] -> [7, 0, 0, 1]
         2%++          : Mod the stack top by 2 then add all values on the stack bar the loop counter.
                         [7, 0, 0, 1] -> [7, 1]
             $1-:?!;$! : Swap the loop counter to the top, minus 1 from it and check if zero, if zero stop the program else continue.

2

자바 8, 115 81 80 52 바이트

n->{for(int i=2;n-->0;i*=2)System.out.println(i/3);}

@Neil 의 Python 2 답변 포트 .
1 인덱싱 및 출력, 각각의 값은 분리 된 라인에 있습니다.

설명:

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

n->{                           // Method with integer parameter and no return-type
  for(int i=2;                 //  Start integer `i` at 2
      n-->0;                   //  Loop `n` times:
      i*=2)                    //    Multiply `i` by 2 after every iteration
    System.out.println(i/3);}  //   Print `i` integer-divided by 3 and a new-line

이전 80 바이트 답변 :

n->{String t="",r=t;for(Long i=0L;i<n;)r+=i.parseLong(t+=i++%2,2)+" ";return r;}

1 색인 입력 및 공백으로 구분 된 String출력

설명:

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

n->{                             // Method with integer parameter and String return-type
  String t="",r=t;               //  Temp and result-Strings, both starting empty
  for(Long i=0L;i<n;)            //  Loop from 0 to `n` (exclusive)
    r+=                          //   Append the result-String with:
       i.parseLong(        ,2);  //    Binary to integer conversion
                   t+=           //     append the temp-String with:
                      i  %2      //      current index `i` modulo-2
                       ++        //      and increase `i` by one afterwards
       +" ";                     //    + a space
  return r;}                     //  Return the result-String

2

펄 6 ,  35 30 27 25  20 바이트

{[\~](0,+!*...*)[^$_]».&{:2(~$_)}}

사용해보십시오 (35)

{(0,{$_*2+|($+^=1)}…*)[^$_]}

사용해보십시오 (30)

{(⅓X*(2,4,82**$_))».Int}

사용해보십시오 (30)

{(⅔,* *2…*)[^$_]».Int}

사용해보십시오 (27)

{((2 X**1..$_)X/3)».Int}

사용해보십시오 (25)

{(2 X**1..$_)Xdiv 3}

사용해보십시오 (20)

넓히는:

{
 (
  2                  # 2
    X**              # cross to the power of
       1..$_         # Range from 1 to the input (inclusive)
            )

             Xdiv    # cross using integer divide
                  3  # by 3
}


2

C, 47 46 바이트

a;f(n){for(a=0;n--;a+=a-~a%2)printf("%d ",a);}

누산기 a는 0으로 시작합니다. 각 단계에서 우리는 그것을 두 배로 늘리고 ( a+=a) 이전의 최하위 비트가 0 ( !(a%2)또는 동등하게)이면 1을 더 -(~a)%2합니다.

테스트 프로그램

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    while (*++argv) {
        f(atoi(*argv));
        puts("");
    }
}

결과

$ ./153783 1 2 3 4 5 6
0 
0 1 
0 1 2 
0 1 2 5 
0 1 2 5 10 
0 1 2 5 10 21 

2

Japt , 10 9 7 6 바이트

다른 솔루션과는 독립적으로 파생됩니다.

1- 색인.

õ!²mz3

시도 해봐


설명

õ        :[1,input]
 !²      :Raise 2 to the power of each
   m     :Map
    z3   :Floor divide by 3

시도 해봐


7 바이트 버전

õ_ou ì2

시도 해봐

õ            :[1,input]
 _           :Pass each through a function
   o         :[0,current element)
    u        :Modulo 2 on above
      ì2     :Convert above from base-2 array to base-10

9 바이트 버전

õ_îA¤w)n2

시도 해봐

õ            :[1,input]
 _           :Pass each through a function
   A         :10
    ¤        :Convert to binary
     w       :Reverse
  î          :Repeat the above until it's length equals the current element
      )      :Close nested methods
       n2    :Convert from binary to base-10


1

MATL , 7 바이트

:&+oRXB

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

설명:

         % Implicitly grab input, n
:        % Range: 1 2 ... n

 &+      % Add the range to itself, transposed
         % 2 3 4 5 ...
         % 3 4 5 6 ...
         % 4 5 6 7 ...
         % 5 6 7 8 ...

   o     % Parity (or modulus 2)
         % 0 1 0 1 ...
         % 1 0 1 0 ...
         % 0 1 0 1 ...
         % 1 0 1 0 ...

    R    % Upper triangular matrix:
         % 0 1 0 1
         % 0 0 1 0
         % 0 0 0 1
         % 0 0 0 0

    XB   % Convert rows to decimal:
         % [5, 2, 1, 0]
         % Implicitly output

출력이 끝에 추가 0, 1, 2, 5 ...되면 P( flip) 8 바이트가됩니다.


1
좋은 생각&+
Luis Mendo

1

루비 -n ,32 30 + 1 바이트

정확히 한 줄의 입력이 있기 때문에 $.경건하게 편리합니다!

편집 : 나는 나 자신을 outgolf 관리하는 것이 놀라 울뿐입니다하지만, 사용 보인다 -n1로하는 카운트 (의 규칙 2에 의해 기본 특별한 조건 루비가 실행 될 수 있기 때문에, ruby -e 'full program'(따라서 -n1) 모든 경우의 gets단지 수있게되면 사용 이런 식으로 1 문자 아래로 골프를 치십시오. 이것이 루비의 이정표라고 생각합니다. 미래에 반복해서 재사용하기 전에이 생각의 기차에 동의하지 않으면 말하십시오.)

v=0
?1.upto($_){p v=v*2|$.^=1}

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

설명

# while gets(); -- assumed by -n
v=0            # First element of the sequence
?1.upto($_){   # Do from "1" to "$LAST_READ_LINE" aka: Repeat [input] times
  p            # print expression
  v=v*2|$.^=1  # Next element is current element times two
               # bitwise-or 0 or 1 alternating
               # $. = lines of input read so far = 1 (initially)
}
# end           -- assumed by -n

흥미 롭군 그래도 27 바이트로 가능합니다 .
Eric Duminil

1
좋은! 우리 모두는 26b에 의해 outgolfed 것 같습니다.
Unihedron

1

AWK a=0 , 31 바이트

{for(;$1--;a=a*2+1-a%2)print a}

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

이 다른 루비 답변 에서 부끄럽게 도난당한 공식을 사용합니다 .

가진 것은 아니지만 a=0(0으로 "빈"AWK 취급)을 작동시키는 것, 0의 첫 번째 요소는 인쇄 대신 할되지 않습니다 empty그래서 거기에, 나는 유효한 출력 아마 통과하지 것이다 주장하면서 라인을, a=0하는 캔 명령 행 인수로 삽입됩니다.


나는 당신의 공식을 좋아합니다 ^^
Asone Tuhid


1

brainfuck , 40 바이트

,[>.>>[>]<[.->[>]+[<]+<]+<[[-<+>]>-<]<-]

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

인덱스가 0입니다. 문자 코드로 입력하고 일련의 문자 코드 1을 구분하는 null 바이트를 사용하여 단항으로 출력합니다. 255 개 이상을 입력하지 않으려는 경우 8 비트 셀을 가정합니다. 음수 셀을 가정하지만 몇 바이트를 희생하여 고칠 수 있습니다.

이전에는 50 바이트

,[[<]>->>[<-<->>>>-<]<[->>++<<]>>+[-<<+>>]<<.<<+>]

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

문자 코드로 입력하고 문자 코드로 출력합니다. 1- 색인. 아마 약간 골프를 쳤다.

@Unihedron은 이것이 무한 크기의 셀이 필요하다는 것을 지정하는 것을 잊었다 고 지적합니다. 그렇지 않으면 8 번째 숫자에서 끝납니다.


테스트 케이스에서``(0d018)로 실행하면 코드가`* UªUªUªUªUªUª` (0x01 02 05 0a 15 2a 55 aa 55 aa 55 aa 55 aa 55 aa 55 aa 55 aa; 0d001 002 005 010 021 042 085로 인쇄합니다. 170 085 170 085 170 085 170 085 170 085 170) :( tio.run/##SypKzMxLK03O/…
Unihedron

좋아, 그것은 셀 크기 문제 인 것 같습니다. 코드가 큰 정수에 적응해야하거나 코드를 올바르게 실행하는 구현을 지정해야한다고 생각하지만 기본 8 비트 셀로는 충분하지 않습니다.
Unihedron

그것에 대해 잊어 버렸습니다. @Unihedron에게 감사드립니다! 아마도 8 비트 버전에 대해 생각할 것이고 아마도 단항으로 출력 될 것입니다.
Jo King

32 비트 셀과 함께 인터프리터를 사용하면 작동합니다. 주말까지하지 않았다면 나는 bitinteger (8bit) 버전을 시도해 볼 수 있다고 생각하지만 : D
Unihedron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.