เลขฐานสองแบบลาด


15

รับจำนวนเต็มnส่งออกnเลขฐานสองแบบลาดตัวแรกทั้ง 0- หรือ 1-indexed พวกเขาถูกเรียกสิ่งนี้เนื่องจากวิธีการสร้าง:

เขียนตัวเลขเป็นเลขฐานสองภายใต้กันและกัน (ปรับชิดขวา):

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

จากนั้นคุณจะต้องใช้เส้นทแยงมุมแต่ละเส้นจากล่างซ้ายไปขวาบนเช่นว่าตัวเลขสุดท้ายแต่ละตัวคือตัวเลขสุดท้ายของเส้นทแยงมุม นี่คือเส้นทแยงมุมที่สี่ (ดัชนีเป็นศูนย์) ที่ทำเครื่องหมายด้วยx's ซึ่งคือ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
ฉันไม่คิดว่าคุณสมบัตินี้ชัดเจนมาก ฉันต้องอ่านนอกเรื่องก่อนจึงจะเข้าใจสิ่งที่ถูกถามที่นี่
โพสต์ Rock Garf Hunter

1
นี่คือการสร้างภาพถ้ามันช่วย อ่าน "วงรี" จากบนลงล่างและภายในวงรีจากล่างซ้ายไปขวาบน สิ่งเหล่านี้ให้เลขฐานสองที่คุณต้องการแปลงเป็นทศนิยม
พาเวล

คุณหมายถึง " ทั้ง 0- หรือ 1-indexed " คุณหมายถึงว่าหนึ่งอาจส่งออกทั้งหมายเลขแรกnหรือn+1หมายเลขแรก?
smls

4
ฉันคิดว่านี่อาจช่วยให้ได้คำตอบที่น่าสนใจมากขึ้นถ้าคุณแค่คืนค่า n'th
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.

ไขว้เป็นวิธีที่ง่ายที่สุดในการใส่อาเรย์เพื่อให้ diagonals ในตัวทำงาน จากนั้นมีการเพิ่มการกลับรายการเพื่อให้ได้ทุกอย่างตามลำดับที่ถูกต้อง


การดำเนินการตามสูตร OEIS อาจสั้นมากในเยลลี่
Yytsi

@ TuukkaX อาจเป็นได้ ฉันเหนื่อยพอที่จะหาข้อ จำกัด สูงสุดสำหรับผลรวมที่ยาก
PurkkaKoodari

@ TuukkaX ฉันลองแล้ว แต่ฉันไม่เห็นมันเกิดขึ้น ฉันแน่ใจว่า Dennis & co จะนำไปใช้ใน 5 ไบต์หรือมากกว่านั้น
PurkkaKoodari


7

JavaScript (ES6), 53 ไบต์

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

0 การจัดทำดัชนี mapมันไม่บ่อยครั้งที่ฉันได้รับที่จะใช้ฟังก์ชันเวียนเป็นพารามิเตอร์ไป


4

Mathematica ขนาด 46 ไบต์

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

ฟังก์ชั่นที่ไม่ได้ตั้งชื่อจะใช้จำนวนเต็มที่ไม่ใช่ค่าลบ#เป็นอินพุตและส่งกลับลำดับ 0 ดัชนีจนถึง#เทอมที่ สร้างเลขฐานสองที่ลาดโดยใช้BitAnd(bitwise "และ") ด้วยกำลังที่เหมาะสม 2


2

Python3, 63 61 ไบต์

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

ใช้สูตรจาก OEIS

-2 ไบต์ขอบคุณLuis Mendo ! i+1->i


คุณช่วยอธิบายว่าคุณไปจากSum_{ k >= 1 such that n + k == 0 mod 2^k } 2^kสูตร bitwise ที่ง่ายกว่านี้ได้อย่างไร
smls

@smls เพียงคำนวณ diagonals ขึ้นโดยตรง จริง ๆ แล้วฉันคิดว่ามันชัดเจนกว่าแบบอื่น ๆ
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

Perl 6 , 59 43 ไบต์

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

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

ใช้สูตรจากหน้า OESIS
ปรับปรุง: Switched สูตรบิตและตามจากTuukkaX คำตอบของงูหลาม

Perl 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แพ็คเกจเพื่อคำนวณความยาวของการnแทนค่าในไบนารีแล้วใช้หนึ่งในสูตร OEIS

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