Ardışık eşit ikili rakam içermeyen ilk n sayısı


32

Dizi, formdaki ikili sayıların ondalık gösterimini içerir: ki 10101...burada n. Terim n bitlerine sahiptir.

Dizi, sadece sayıların ikili ve ondalık gösterimleri arasındaki ilişkileri göstererek açıklanması en kolay olanıdır:

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

Meydan okuma:

Bir tamsayı alın n ve sıradaki ilk n sayısını döndürün. Dizinin 0 dizinli veya 1 dizinli olmasını seçebilirsiniz.

Test durumları:

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

Açıklamalar her zaman olduğu gibi teşvik edilir.

Bu OEIS A000975 .


Kendi MATL çözümünüz göz önüne alındığında, sonucun tersi sırayla elde edilmesi kabul edilebilir mi?
Shaggy

Evet, sıralandığı sürece. @Shaggy
Stewie Griffin,

Şansımı buraya itmek, ancak bu çıktı formatı kabul edilebilir [85,[42,[21,[10,[5,[2,[1,0]]]]]]]mi?
Shaggy

Yanıtlar:


66

Python 2,36 bayt

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

Çevrimiçi deneyin! Açıklama: 2'nin ikili gösterimi nedenle, 3 ,uygun bir 2 gücüyle çarpmak ve tamsayı kısmını almak için kalır.230.101010101...


1
Ne yazık ki Ocak 2018, yoksa PPCG 2017'nin En İyisi için En İyi matematiksel görüş için aday gösterirdim . İnşallah
2019'un

@KevinCruijssen bu tüm dışarı gördüğüm en iyisidir codegolf.stackexchange.com/a/51574/17360
qwr

3
@KevinCruijssen unutma!
Bassdrop Cumberwubwubwub

2
@BassdropCumberwubwubwub Hatırlatma için teşekkürler, çünkü gerçekten tamamen unuttum! Adaylara eklendi.
Kevin Cruijssen


9

Jelly , ... 4 bayt

Teşekkür mil için -1 byte!

ḶḂḄƤ

Çevrimiçi deneyin!

Açıklama:

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.

Jöle , 4 bayt

Jonathan Allan'ın versiyonu.

Ḷ€ḂḄ

Çevrimiçi deneyin!

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'in 2/3 numarasına dayalı bir sürüm 5 bayt verir, revizyon geçmişine bakın.


ḶḂḄƤönek hızlı bunun için yapıldı
mil

Hızlı bir önek gerek yok - hatta Ḷ€ḂḄişe yarar.
Jonathan Allan,

5

MATL , 5 bayt

:WI/k

Neil'in cevabına dayanarak .

açıklama

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

Çevrimiçi deneyin!


MATL , 9 bayt

:q"@:oXBs

Çevrimiçi deneyin!

açıklama

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

Python 2 , 45 37 36 bayt

User202729 ile -3 bayt
-1 -1 bayt mathmandan sayesinde

s=0
exec"print s;s+=s+~s%2;"*input()

Çevrimiçi deneyin!


Doubling s, skendine eklemekle aynı , bu yüzden s+=s+~s%2bir bayt kurtarmak için yapabileceğine inanıyorum .
mathmandan

5

Python 3, 68 61 54 48 43 bayt

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

Sayesinde user202729 19 byte ve tasarruf yardım için OVS 6 bayt tasarruf yardım için.

Çevrimiçi Deneyin


-1 bayt için teşekkürler. Ve sanırım ve ile değiştiremezsem?
Manish Kundu,

Tamam, bunu zaten yaptım.
Manish Kundu

2
Çünkü x == 0eşdeğerdir not xeğer xbir tam sayıdır, (yani işlenen takas x if c else y= y if not c else x) biraz daha bayt kurtaracak.
user202729

Ayrıca bırakın i%2ve kullanımı 1-r%2yerine
Rod

1
O zaman takip etmene gerek yok i.
user202729

4

Kabuğu , 7 bayt

mḋḣ↑Θݬ

Çevrimiçi deneyin!

1 tabanlı, yani n girişi ilk n değerini verir. .

açıklama

     ݬ   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 bayt SBCS

Devraldı ⎕IO( Ben nDex Ç rigin) olmak 0üzere birçok sistem üzerine varsayılan olan. Anonim zımni önek işlevi. 1 endeksli.

(2⊥⍴∘1 0)¨⍳

Çevrimiçi deneyin!

Bölüm 0… n − 1

( Her birine aşağıdaki zımni işlevi uygulayın

⍴∘1 0 listeyi [1,0]bu uzunluğa döngüsel olarak yeniden şekillendir

2⊥ base-2'den (ikili) normal sayıya dönüştür


4

Perlv5.10 -n , 24 + 1 bayt

Nahuel Fouilleul sayesinde -3 bayt !

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

Çevrimiçi deneyin!

Ruby versiyonumla aynı mantık var fakat perl daha kısa olduğu için daha kısa. Bazı garip nedenle, printbir ayırıcı (kahrolası!) Yapmazdım, ben kullanmak zorunda saydanv5.10; şimdilik dışarı gidiyorum bu yüzden, ben emin nasıl bu puanı değilim vadede bunun için sırayla ?. ..

açıklama

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

puanlama için şunu söyleyebilirim: 27 + 1 ( -n) = 28 bayt, çünkü bir perl bir liner çalıştırmak için, bir tane kullanmalı -eve 5,10 kullanmalısınız -E, sadece aynı uzunlukta olan kullanmanız gerekir
Nahuel Fouilleul

$|--yerine 3 bayt kaydedebilirsiniz($.^=1)
Nahuel Fouilleul



4

C , 81 55 59 bayt

1 endekslendi.

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

Tam program, daha az golf oynadı:

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

Çevrimiçi deneyin!

EDIT 2: Düşündüğümde, fonksiyonların tekrar kullanılabilir olması gerekmediği varsayımı altındaydım, tekrar kullanılabilir olmaları mükemmel bir anlam ifade ediyor: P

EDIT: Tüm programı cevaba dahil etmek zorunda olduğum yanılgısı altındaydım, sadece bunu yapan fonksiyona ihtiyacım olduğunu ortaya koydu. Bu iyi.

Burada ve orada birkaç byte'ı tıraş edebileceğime eminim. Zaten birkaç numara kullandım. Programın büyük bir bölümü, tartışmayı almak ve onu bir int haline getirmek için çalışmaktadır. Bu benim ilk golf kodum. Yanlış bir şey yapıyorum, söyle bana: P


2
PPCG'ye Hoşgeldiniz! :) Ben C bir adam değilim ama Steadybox'ın çözümünden bazı ipuçları toplayabilirsiniz .
Shaggy

Tamam, şimdi daha mantıklı, tüm ihtiyacım olan bir işlev olduğunda geri kalanı bir altbilgiyle yapılabildiğinde tüm programı dahil ettim. Sanırım bu daha sonra geliştirilebilir.
Minerscale

PPCG'ye Hoşgeldiniz! Sen kaldırarak bir bayt kaydedebilir i++ve değişen i&1için i++&1. Ayrıca, küresel değişkenler olarak ive jbaşlangıçta sıfıra başlatılmış olmalarına rağmen , işlev gönderimlerinin yeniden başlatılması gerektiğinden, işlev içinde başlatılmaları gerekir .
Steadybox,

1
Daha da iyisi, üçlüyü tamamen elimine ederek 2 bayt daha tasarruf etmek mümkün.
user202729

2
50 bayt: i,j;f(c){for(i=j=0;i<c;)printf("%d ",j+=j+i++%2);} Çevrimiçi deneyin!
Steadybox,

4

Haskell , 47 40 53 49 44 40 34 bayt

Userikon ile -4 bayt202729-Laikoni
sayesinde 6 bayt

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

Çevrimiçi deneyin!


Sen yerini alabilir otherwisemesela ile 1>0( otherwise == True)
flawr

Daha fazla golf oynamak için, korumayı bir şey atamak için kullanabilirsiniz, örneğin, şunun gibi: Çevrimiçi deneyin!
kusur,

1
Not: Ayrıca , haskell'de golf oynamak için ipuçlarına ve ayrıca monadların ve erkeklerin haskell sohbet odasına da göz atın .
kusur,

1
Sen bir işlev yapmak gerektiğini döner birinci n listenin elemanlarını n argümandır.
Tamamen insani

1
Evet kesinlikle. Haskell'deki Golf Kuralları Kılavuzumuza bir göz atmayı önerebilirim .
Laikoni

4

Ruby , 26 bayt

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

Çevrimiçi deneyin!

Tüm eski yakut cevaplarını atar.

açıklama

1/3İkili gibi görünüyor 0.01010101..., bu yüzden iki güç ile çarpın, alırsınız:

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

Ancak Ruby, int bölümündeki sayıları yerleştirerek bana ihtiyacım olan diziyi verdi.


4

J , 9 bayt

[:#.\2|i.

Nasıl çalışır?

i. - liste 0..n-1

2| - mod 2 liste öğeleri

\ - tüm önekler

#. - ondalık

[: - çatalı kapatır (eşit sayıda fiil (4) bulunduğundan)

Çevrimiçi deneyin!


3

Retina , 28 bayt

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

Çevrimiçi deneyin!

0 tabanlıdır, bu nedenle n girişi ilk n + 1 sonucunu verir .

açıklama

OEIS'ten özyinelemeyi kullanır:

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

Programdan geçelim:

)K`0

Bu sabit bir aşamadır: girişi atar ve çalışma dizesini 0dizinin ilk değeri olarak ayarlar . )Bir grup bu aşamaya sarar. Bu grubun kendisi hiçbir şey yapmaz, ancak hemen hemen her aşama (grup aşamaları dahil) sonucunu bir kütüğe kaydeder 0ve programın çalışması için o kütüğün iki kopyasına ihtiyacımız olacaktır.

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

Burada bir sürü konfigürasyon var: "$+"+sahneyi bir döngüye sokuyor. Bu "$+"bir ikame $+olarak değerlendirilir ve programın girişine, yani n'ye atıfta bulunur . Bu döngü n çalıştırıldığı anlamına gelir kere .

Sonra ¶<her yinelemeyi, çıktının basımını saran, çıktısını alır. girişini izleyen satır besleme ile sarın (böylece ilk yineleme sıfırı, ikinci yineleme ilk yinelemenin sonucunu vb. Yazdırır).

Sahnenin kendisi, tüm çalışma dizgesini, son satırdaki yer değiştirmeyle değiştirir. Bu, kapalı bir parantez ve tekrarlama işleci için kapalı argümanlar kullanır *, bu yüzden aslında kısadır:

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

Parantez içindeki eşyalar üç bölüme ayrılabilir:

  • $&*_: bir (n-1) _ s dizesini verir .
  • _: bir tek verir _.
  • 2*$-1*_: 2 * a (n-1) değerinde bir dizi verir _. $-1Yani önce son döngünün, sonuç günlüğüne sondan bir önceki sonucu belirtir. Bu yüzden başlamak için kayıt defterinde sıfırın kopyalarını almamız gerekiyordu, aksi takdirde bu programın ilk yinelemedeki girdisine işaret eder.

Sonra $.(…)ortaya çıkan dizenin uzunluğunu ölçer. Başka bir deyişle, a(n) = a(n-1) + 1 + 2*a(n-2)tekdüze geçerek hesapladık (gerçekte olmasa da: $.(…)tembel ve sonuçta elde edilen uzunluğu doğrudan aritmetik ile belirleyebiliyorsa, içeriğini gerçekten değerlendirmiyor, bu yüzden bu oldukça verimli).

Son döngü yinelemesinin sonucu ( dizinin n + 1. elemanı), programın sonunda Retina'nın örtük çıktısı nedeniyle yazdırılır.


3

Brain-Flak , 36 bayt

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

Çevrimiçi deneyin!

Açıklama:

Sıradaki bir sonraki sayı n*2+1veya ile elde edilir 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 bayrağı) bayt

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

Çevrimiçi deneyin!

açıklama

Yığın döngü sayacı ile başlatıldı.

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

Java 8, 115 81 80 52 bayt

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

Port @Neil 'in Python 2 cevap .
1 indeksli ve doğrudan çıktı, her biri ayrı bir satırda.

Açıklama:

Çevrimiçi deneyin.

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

Eski 80 baytlık cevap:

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

1 indeksli giriş ve alanla ayrılmış Stringçıktı

Açıklama:

Çevrimiçi deneyin.

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

Perl 6 ,  35 30 27 25  20 bayt

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

Deneyin (35)

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

Deneyin (30)

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

Deneyin (30)

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

Deneyin (27)

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

Deneyin (25)

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

Deneyin (20)

Expanded:

{
 (
  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 bayt

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

Akümülatör asıfır ile başlar. Her adımda, onu iki katına çıkarırız ( a+=a) ve önceki en az anlamlı bit sıfır ( !(a%2)veya eşit olarak -(~a)%2) ise bir tane ekleriz .

Test programı

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

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

Sonuçlar

$ ./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 bayt

Hepsi diğer çözümlerden bağımsız olarak türetilmiştir.

1 endeksli.

õ!²mz3

Dene


açıklama

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

Dene


7 bayt sürümü

õ_ou ì2

Dene

õ            :[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 byte sürümü

õ_îA¤w)n2

Dene

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

:&+oRXB

Çevrimiçi deneyin!

Açıklama:

         % 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

Çıkış olur 0, 1, 2, 5 ...ise Puç (ilave edildi flipbu 8 bayt yapım).


1
İyi fikir,&+
Luis Mendo

1

Yakut -n ,32 30 + 1 bayt

Tam olarak 1 satırlık bir girdi elde ettiğimiz için $.tanrısaldır!

EDIT: Kendimi aşmayı başardığıma şaşırdım, ancak Ruby'nin çalıştırılabildiği (bu nedenle 1'dir) -nolduğu için 1'i (kural 2'ye göre varsayılan özel koşullarda ) kullandığı görünüyor. bu şekilde 1 char golf oynayın; bunun yakut için bir dönüm noktası olduğuna inanıyorum, lütfen gelecekte tekrar tekrar kullanmadan önce bu düşünce trenine katılmıyorsanız konuşun.ruby -e 'full program'-ngets

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

Çevrimiçi deneyin!

açıklama

# 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

İlginç. Yine de 27 baytta mümkün .
Eric Duminil

1
Güzel! Görünüşe göre hepimiz 26b tarafından aşıldık.
Unihedron

1

AWK a=0 , 31 bayt

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

Çevrimiçi deneyin!

Utanmadan başka bir Ruby cevabından çalınan formülü kullanır .

Sahip olmasa da a=0(0 olarak "boş" awk davranır) çalışacak, 0 ilk öğesi, bir baskılı ve bunun yerine olmak almazsınız emptybu yüzden var, ben geçerli bir çıkış muhtemelen kalkmayacak olduğunu iddia ediyorum iken hattı,a=0 hangi kutu komut satırı argümanı olarak eklenebilir.




1

brainfuck , 40 bayt

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

Çevrimiçi deneyin!

0 endeksli. Char kodu olarak giriş yapın, char karakterleri 1s dizisini ayıran boş bayt ile unary olarak çıkın. 255'in üzerinde giriş yapmak istemediğiniz sürece 8 bitlik hücreleri varsayar. Negatif hücreleri varsayar, ancak bu birkaç bayt pahasına giderilebilir.

Daha önce, 50 bayt

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

Çevrimiçi deneyin!

Char kodu olarak giriş yapar, char kodu olarak çıkar. 1 endeksli. Muhtemelen biraz golf oynayabilirdi.

@ Unniron, bunun sonsuz büyüklükteki hücrelere ihtiyaç duyduğunu belirtmeyi unuttuğumu belirtiyor, aksi halde 8. sayıya çıkıyor.


Test durumu için `(0d018) ile çalıştırdığımda, kodunuz` * 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 ile yazdırır. 170 085 170 085 170 085 170 085 170 085 170) :( tio.run/##SypKzMxLK03O/…
Unihedron

Tamam, öyle görünüyor ki bir hücre boyutu problemi. Kodunuzun büyük tam sayılara uyum sağlaması gerektiğini veya kodunuzu doğru şekilde çalıştıracak uygulamayı belirtmeniz gerektiğini düşünüyorum, ancak 8 bit hücrelerin varsayılan değerleri yeterli değil
Unihedron

Unut gitsin, @Unihedron! Muhtemelen unary çıktısı olan 8 bit sürümü hakkında bir fikrim var.
Jo King,

32 bit hücreli tercüman kullanarak çalışır. Her ne kadar hafta sonu gelmediyse kendim bir bitinteger (8bit) sürümünde bir deneyim olabileceğini düşünüyorum: D
Unihedron
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.