Eğimli İkili Sayılar


15

Bir tamsayı verildi n , ilk neğimli ikili sayıları (0- veya 1 dizinli) çıktılayın. Nasıl üretildikleri için bunlara denir:

Sayıları ikili olarak birbirinin altına yazın (sağa yaslanmış):

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

Daha sonra, her bir diyagonali soldan sağa ve sağa doğru almanız gerekir, böylece her son rakam bir diyagonalin son hanesi olur. İşte x's ile işaretlenmiş dördüncü köşegen (sıfır dizinli) 100:

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

Yukarı doğru eğimli çaprazlar sırasıyla:

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

Ardından, ondalık sayıya dönüştürün 0, 3, 6, 5, 4, 15, 10, ...

OEIS A102370

Bu , bu nedenle bayttaki en kısa kod kazanır.


12
Bu şartnamenin çok net olduğunu düşünmüyorum. Burada ne sorulduğunu anlamadan önce çok fazla harici okuma yapmak zorunda kaldım.
Rock Garf Hunter Post

1
İşte bir görselleştirme, eğer yardımcı olursa. "Ovalleri" yukarıdan aşağıya ve ovalin içinde soldan sağa doğru okuyun. Bunlar size ondalık sayıya dönüştürmeniz gereken ikili sayıları verir.
Pavel

Ne demek " 0- ya da 1-endeksli "? Birinin ilkini nya da ilkinin+1 sayıları ?
smls

4
Ben sadece n'th değerini döndürmek zorunda olsaydı, bu daha ilginç cevaplara izin vermiş olabilir düşünüyorum.
xnor

1
@PatrickRoberts Kaç tane üreteceğime asla bir sınır koymadım. Basitçe "ikili sayıları yaz ..." dedim. İhtiyacınız olduğu kadar çok üretiyorsunuz.
mbomb007

Yanıtlar:


3

Jöle, 11 bayt

ḤḶBUz0ŒDUḄḣ

Çevrimiçi deneyin!

açıklama

ḤḶ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.

Geçiş, yerleşik diyagonallerin çalışması için diziyi doldurmanın en basit yoludur. Sonra her şeyi doğru sırayla almak için tersine çevirmeler eklenir.


Jelly'de OEIS formülünün uygulanması da çok kısa olabilir.
Yytsi

@TuukkaX Olabilir. Toplam için bir üst limit seçmeye yetecek kadar yoruldum.
PurkkaKoodari

@TuukkaX Denedim, ama olduğunu görmüyorum. Eminim Dennis & co bunu 5 baytta uygulayacak.
PurkkaKoodari


7

JavaScript (ES6), 53 bayt

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

0 endeksli. Genellikle bir parametre olarak özyinelemeli bir işlev kullanmak olsun değil map.


4

Mathematica, 46 bayt

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

Adsız işlev #, girdi olarak negatif olmayan bir tamsayı alır ve 0-dizin dizisini #terime döndürür . Eğimli ikili sayıları BitAnd(bitwise "ve") kullanarak uygun 2 güç ile oluşturur.


2

Python3, 63 61 bayt

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

OEIS formülünü kullanır.

Luis Mendo sayesinde -2 bayt ! i+1->i


Bu Sum_{ k >= 1 such that n + k == 0 mod 2^k } 2^kbasit bitsel formüle nasıl gittiğinizi açıklayabilir misiniz ?
smls

@smls Sadece yukarı doğru köşegenleri doğrudan hesaplar. Aslında diğer formdan daha açık olduğunu düşündüm.
Neil

1

PHP, 68 bayt

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

Komut satırı bağımsız değişkeninden girdi alır, alt çizgi ile ayrılmış sayıları yazdırır. İle çalıştırın -r.


1

MATL , 18 17 bayt

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

Çevrimiçi deneyin!

Bu OEIS formülünü kullanır:

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

Kod:

: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 bayt

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

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

OESIS sayfasındaki formülü kullanır.
Güncelleme: TuukkaX'in Python cevabından bitsel ve tabanlı formüle geçildi .

Perl 6 , 67 bayt

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

Saf bir çözelti.
Köşegenin bir kısmını sayıları tabana 2 dönüştürür, her birinin doğru hanesini alır ve sonucu tekrar tabana 10 dönüştürür.



0

R, 66 bayt

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

İkili olarak temsil edilen uzunluğunu hesaplamak ve daha sonra OEIS formüllerinden birini kullanarak paketin binişlevini kullanan adsız işlev .miscFuncsn

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.