경 사진 이진수


15

integer가 주어지면 n첫 번째 n경 사진 이진수 (0 또는 1 색인)를 출력하십시오 . 생성 방식으로 인해 다음과 같이 불립니다.

서로 이진수로 숫자를 씁니다 (오른쪽 정렬).

........0
........1
.......10
.......11
......100
......101
......110
......111
.....1000
.........

그런 다음 각 마지막 자리가 대각선의 마지막 자리가되도록 각 대각선을 왼쪽 아래에서 오른쪽 위로 가져와야합니다. 여기에의로 표시된 네 번째 대각선 (0으로 색인화 됨) x이 있습니다 100.

........0
........1
.......10
.......11
......10x
......1x1
......x10
......111
.....1000
.........

상향 경사 대각선은 다음과 같습니다.

0
11
110
101
100
1111
1010
.......

그런 다음 십진수로 변환하여 0, 3, 6, 5, 4, 15, 10, ...

OEIS A102370

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.


12
이 사양이 매우 명확하지 않다고 생각합니다. 나는 여기에서 무엇을 요청했는지 이해하기 전에 많은 외부 독서를해야했다.
Post Rock Garf Hunter

1
여기에 도움이된다면 ', 시각화이야. "ovals"를 위에서 아래로, 타원 내에서 왼쪽 아래에서 오른쪽 위를 읽습니다. 그것들은 십진수로 변환 해야하는 이진수를 제공합니다.
Pavel

" 0 또는 1- 인덱스 " 는 무엇을 의미 합니까? 첫 번째 n또는 첫 번째 n+1숫자를 출력 할 수 있습니까?
smls

4
n 번째 값을 반환하면 더 흥미로운 답변을 얻을 수 있다고 생각합니다.
xnor

1
@ PatrickRoberts 나는 얼마나 많은 수를 생성하는 데 제한을 두지 않았습니다. 나는 단순히 "이진수로 숫자 쓰기 ..."라고 말했다. 필요한만큼 생성합니다.
mbomb007

답변:


3

젤리, 11 바이트

ḤḶBUz0ŒDUḄḣ

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

설명

ḤḶBUz0ŒDUḄḣ    Main link. Argument: n
Ḥ              Double the argument. This ensures there are enough
               rows, since n + log2(n) <= 2n.
 Ḷ             Get range [0 .. 2n-1].
  B            Convert each number to binary.
   U           Reverse each list of digits. 
    z0         Transpose, padding with zeroes to a rectangle.
      ŒD       Get the diagonals of the rectangle, starting from the
               main diagonal. This gets the desired numbers, reversed,
               in binary, with some extras that'll get dropped.
        U      Reverse each diagonal.
         Ḅ     Convert each diagonal from binary to a number.
          ḣ    Take the first n numbers.

조옮김은 내장 된 대각선이 작동하도록 배열을 채우는 가장 간단한 방법입니다. 그런 다음 모든 것을 올바른 순서로 얻기 위해 반전이 추가됩니다.


OEIS 공식의 구현은 Jelly에서 실제로 짧을 수도 있습니다.
Yytsi

@TuukkaX 수도 있습니다. 나는 합계의 상한을 고르는 것을 충분히 피곤합니다.
PurkkaKoodari

@TuukkaX 나는 그것을 시도했지만 그 일이 일어나지 않는 것을 보았습니다. Dennis & co가 5 바이트 정도에 구현 할 것이라고 확신합니다.
PurkkaKoodari


7

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

n=>[...Array(n)].map(g=(j=1,i)=>j>i?0:j&i|g(j+j,i+1))

인덱스가 0입니다. 종종 재귀 함수를 매개 변수로 사용하지는 않습니다 map.


4

수학, 46 바이트

Plus@@@Table[BitAnd[n+k,2^k],{n,0,#},{k,0,n}]&

명명되지 않은 함수는 음수가 아닌 정수 #를 입력으로 취하여 0까지의 색인을 최대 항까지 반환합니다 #. BitAnd적절한 2의 거듭 제곱으로 (비트 단위 "and")를 사용하여 경 사진 이진수를 구성합니다 .


2

Python3, 63 61 바이트

lambda i:[sum(n+k&2**k for k in range(n+1))for n in range(i)]

OEIS의 공식을 사용합니다.

Luis Mendo 덕분에 -2 바이트 ! i+1->i


Sum_{ k >= 1 such that n + k == 0 mod 2^k } 2^k더 간단한 비트 단위 수식으로 어떻게 이동했는지 설명 할 수 있습니까 ?
smls December

@smls 위쪽 대각선을 직접 계산합니다. 실제로 다른 형식보다 더 명확하다고 생각했습니다.
Neil

1

PHP, 68 바이트

for(;$n++<$argv[1];print$s._)for($s=$i=0;$i<$n;)$s|=$n+$i-1&1<<$i++;

명령 줄 인수에서 입력을 받고 밑줄로 구분 된 숫자를 인쇄합니다. 로 실행하십시오 -r.


1

MATL , 18 17 바이트

:q"@tt:+5MW\~fWs+

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

이것은 OEIS의 공식을 사용합니다.

a(n) = n + Sum_{ k in [1 2... n] such that n + k == 0 mod 2^k } 2^k

암호:

:q"     % For k in [0 1 2 ...n-1], where n is implicit input
  @     %   Push k
  tt    %   Push two copies
  :     %   Range [1 2 ... k]
  +     %   Add. Gives [n+1 n+2 ... n+k]
  5M    %   Push [1 2... k] again
  W     %   2 raised to that
  \     %   Modulo
  ~f    %   Indices of zero entries
  W     %   2 raised to that
  s     %   Sum of array
  +     %   Add
        % End implicitly. Display implicitly

0

펄 6 , 59 43 바이트

{map ->\n{n+sum map {2**$_ if 0==(n+$_)%(2**$_)},1..n},^$_}

{map {sum map {($_+$^k)+&2**$k},0..$_},^$_}

OESIS 페이지의 수식을 사용합니다.
업데이트 : TuukkaX의 Python answer 에서 비트 및 기반 수식으로 전환했습니다 .

펄 6 , 67 바이트

{map {:2(flip [~] map {.base(2).flip.comb[$++]//""},$_..2*$_)},^$_}

순진한 솔루션.
대각선의 일부인 숫자를 밑수 2로 변환하고 각각의 정확한 숫자를 취한 다음 결과를 밑수 10으로 다시 변환합니다.



0

R, 66 바이트

function(n,k=0:length(miscFuncs::bin(n-1)))sum(bitwAnd(k+n-1,2^k))

용도 명명 함수 bin로부터 함수를 miscFuncs패키지의 길이를 계산하는 nOEIS 수식 중 하나를 이용하여 이진 표현하고있다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.