Henüz Kullanılmayan Çiftleri


21

Bir pozitif tamsayı dizisi tanımlayalım. Önceki terimin iki katı olacak şekilde çift sayılardaki sırayı tanımlayacağız. Dizinin tek endeksleri, dizide henüz görünmeyen en küçük pozitif tam sayı olacaktır.

İşte ilk çift terimleri.

1,2,3,6,4,8,5,10,7,14,9,18,11,22,12,24,13,26,15,30

Bunu ayrıca , n'in şimdiye kadar en az kullanılmayan pozitif tamsayı olduğu birleştirilmiş çiftlerin (n, 2n) listesi olarak düşünebilirsiniz .

Görev

Bir sayısı göz önüne alındığında , N giriş hesaplamaya olduğu , n , bu sırayla inci terim.

Bu olduğundan kaynak kodunuzun boyutunu bayt olarak ölçtüğünüzde en aza indirmeyi hedeflemelisiniz.

OEIS A036552


Dizinin garip endekslerinin, dizide henüz görünmeyen en küçük pozitif tam sayı olacağı gerçeği . alakasız, değil mi?
Adám

1
Ayrıca, hangi çiftleri ?
Adám

@ Adám Hayır, bu böyle değil. Size bu düşünceyi neyin verdiğinden emin değilim belki de bunu kötü ifade etmişimdir.
Buğday Sihirbazı

1
@ Sıralamayı düşünmenin bir başka yolu, birleştirilmiş çiftlerden oluşması (n,2n)ve her sayının yalnızca bir kez görünmesidir. Her bir çift, ikinci kısıtlamaya bağlı kalarak, mümkün olan en küçük olmak üzere seçilir.
Martin Ender

3
Serinin tek elemanlarının 2-adik değerlemesi daima aynıdır. Birisi için yararlı olabilir.
CalculatorFeline

Yanıtlar:


11

Haskell, 40 bayt

l(a:r)=a:2*a:l[x|x<-r,x/=2*a]
(l[1..]!!)

Sıfır tabanlı. lartımlı olarak, diziyi kalan tamsayıların tembel listesinden oluşturur.


7

JavaScript (ES6), 92 82 69 67 65 bayt

n=>(F=i=>i^n?F(a[b=i&1?2*b:(g=k=>a[k]?g(k+1):k)(1)]=-~i):b)(a={})

Nasıl?

Şunu takip ediyoruz:

  • En son eklenen değer b .
  • Arama tablosunda daha önce karşılaşılan tüm değerler a .

Dahili olarak, 0 tabanlı bir dizin kullanıyoruz i . Garip ve hatta davranışlar bu nedenle ters çevrilir:

  • Tek pozisyonlarda, bir sonraki değer basit 2 * b.

  • Eşit konumlarda, en küçük eşleme değerini tanımlamak için özyinelemeli g () işlevini ve arama tablosunu a kullanırız:

    (g = k => a[k] ? g(k + 1) : k)(1)

Birkaç bayt kaydetmek için ben için başlatılır {}ziyade 0. Bu bizi kullanmaya zorlar:

  • i^nKarşılaştırma i ile n için ({}) ^ n === nise ({}) - ndeğerlendirir için NaN.
  • -~iartırmak için i , çünkü ({}) + 1bir dize oluşturur.

gösteri



5

Python 3 , 80 72 69 bayt

Bay Xcoder sayesinde -7 bayt !

f=lambda n:n and[f(n-1)*2,min({*range(n+1)}-{*map(f,range(n))})][n%2]

Çevrimiçi deneyin!


1
78 baytset(...) için `{* ...} ile tekrar oynayabilirsiniz
Bay Xcoder

@ Zacharý Yorumumu mu okudunuz? Öyleyse, Python 3'te bir küme {*...}yerine olabilir set(...).
Bay Xcoder

Düşünmeden yorum yapıyordum, birkaç dakika sonra {...for...in...}daha fazla bye olacağını fark ettim .
Zacharý

Aslında, 4 byte kazandıracak, çünkü iki kere kullanıyorsunuz
Bay Xcoder





3

PHP, 56 bayt

while($$n=$i++<$argn)for($n*=2;$i&$$k&&$n=++$k;);echo$n;

PHP, 75 72 bayt

for($a=range(1,$argn);$i++<$argn;)$a[~-$n=$i&1?min($a):2*$n]=INF;echo$n;

Çevrimiçi deneyin


3

05AB1E , 16 15 14 bayt

1 endeksli.
Elementlerin sekanstaki tek indekslerdeki ikili gösterimlerinin çift sayılarla bittiği gerçeğini kullanır: A003159 .

Lʒb1¡`gÈ}€x¹<è

Çevrimiçi deneyin!

açıklama

L                 # range [1 ... input]
 ʒ      }         # filter, keep only elements whose
  b               # ... binary representation
   1¡             # ... split at 1's
     `gÈ          # ... ends in an even length run
         €x       # push a doubled copy of each element in place
           ¹<è    # get the element at index (input-1)

3

Python 2 , 59 51 49 bayt

f=lambda n,k=2:2/n%-3*(1-k)or f(n+~(k&-k)%-3,k+1)

Çevrimiçi deneyin!

Arka fon

Her pozitif N tamsayıdır benzersiz şekilde ifade edilebilir , n = 2 O (n) C (N) , C, (n) tek bir.

Let ⟨a nn> 0 meydan spec.'den dizisi.

Bütün pozitif tamsayılar için, iddia n , (bir O 2-n-1 ) ve eşitlenir. Yana O (bir 2n ) = O (2a 2-n-1 ) = O, (a 2-n-1 ) + 1 , bu iddia eşdeğerdir o (bir 2n ) tek her zaman açıktır.

İddia yanlıştır kabul edelim ve 2m-1 gibi bu dizinin ilk tek indeksi olarak O (bir 2m-1 ) garip. Bunun 2m'nin , dizinin ilk çift dizini haline gelmesini sağlayın , öyle ki, o ( 2m-1 ) eşit olur.

O (bir 2m-1 ) tek ve 0 yüzden, daha olan bir 2m-1 ile bölünebilen 2 . Tanım olarak, bir 2m-1 olduğu henüz sırayla görünmediğini en küçük pozitif tam sayı , yani bir 2m-1 /2 daha önce ortaya çıkmış gerekir. Let k (ilk) endeks olmak bir 2m-1 /2 de bir .

Yana O (bir k ) = O, (a 2m-1 /2), = O, (a 2m-1 ) - 1 arasında, hatta minimality olup , n anlamına gelir k garip. Buna karşılık, bu araçlarının bir k + 1 = 2a k = bir 2m-1 , tanımını çelişen bir 2m-1 .

Nasıl çalışır

henüz gelmek


3

R , 70 69 65 bayt

function(n){for(i in 2*1:n)F[i-1:0]=which(!1:n%in%F)[1]*1:2
F[n]}

Çevrimiçi deneyin!

Bir argüman alan adsız bir işlev. Fvarsayılan FALSEya da 0çok algoritması doğru bir pozitif tam yapılmamış sırayla olarak değerlendirmektedir olduğu.

Algoritması çiftleri oluşturur for(aşağıdaki şekilde döngü igider 2için 2ngöre 2):

           which(!1:n%in%l)[1]     # the missing value
                              *1:2 # keep one copy the same and double the next
l[i-1:0]=                         # store into l at the indices i-1 and i


2

Perl 6 , 50 bayt

{(1,{@_%2??2*@_[*-1]!!first *∉@_,1..*}...*)[$_]}

Çevrimiçi deneyin!

  • 1, { ... } ... *bir ilkten sonra her terimin ayraçla ayrılmış kod bloğu tarafından sağlandığı, tembel olarak oluşturulmuş bir sonsuz dizidir. Blok @_diziye başvurduğundan , o dizideki tüm geçerli diziyi alır.
  • Elemanların mevcut sayısı (tek ise @_ % 2) bir sonraki eleman şu ana kadar elimizde çift son öğedir yüzden biz, bir çift endeksli eleman üretiyorsun: 2 * @_[*-1].
  • Aksi halde, şu sırayla henüz görünmeyen ilk pozitif tamsayıyı alırız first * ∉ @_, 1..*.
  • $_dış fonksiyonun argümanıdır. Fonksiyonun dönüş değerini vererek sonsuz sekansa endeksler.

1

Mathematica, 82 bayt

(s={};a=1;f=#;While[f>0,If[s~FreeQ~a,s~AppendTo~{a,2a}];a++;f--];Flatten[s][[#]])&

Çevrimiçi deneyin!


Mathematica'da 58 byte (fikir oldukça farklı olduğu için muhtemelen sadece ayrı bir cevap vermeliyim).
notjagan

OEIS bağlantısından kopyaladın mı?
J42161217

Göreve uyacak ve daha çok golf oynayacak şekilde değiştirdim, ama az ya da çok OEIS bağlantısıyla aynı.
notjagan

1
@ eğer yazar ve yazarsanız yeni bir cevap gönderemezsiniz
J42161217


1

C # (Visual C # Etkileşimli Derleyici) , 82 bayt

x=>{int y=1;for(var s="";x>2;x-=2)for(s+=2*y+":";s.Contains(++y+""););return x*y;}

Çevrimiçi deneyin!

@ASCIIOnly sayesinde -6 bayt!


C # 8 şimdilik çevrimiçi tercümanlarda sıkça karşılaşılmayacak kadar yeni olabilir, csi’nin bir Mono olacağı gerçeğine eklenmiş, bu nedenle Mono’nun bunu yapmasını beklemeniz ve sabit bir yapıya eklemeniz gerekir. t))
ASCII-sadece

ne yazık ki o kontrol etmek kolay değildir , bu C #
ASCII yalnızca

Başlamak için bunu kullan? Ama evet, basit bir şey gibi görünmüyor. docs.microsoft.com/en-us/dotnet/api/…
dana

1
86? - :listedeki en büyük sayı olacağından , s gerekli olduğunu düşünmeyin
ASCII

Ayrıca 2.0=>2f
dana

0

Clojure, 102 bayt

#(nth(loop[l[0 1 2 3]i %](if(= i 0)l(recur(conj l(*(last l)2)(nth(remove(set l)(range))0))(dec i))))%)

Diziyi noluşturmak için süreleri tekrar eder ve n1-dizeli , th öğesini döndürür .


0

Ruby, 60 bayt

->n,*a{eval"v+=1while a[v];a[v]=a[2*v]=v+v*n%=2;"*(n/2+v=1)}

0 endeksli. Bu döngü n/2+1süreleri, her iki değerlerinin üretilmesi ve indisleriyle bir dizi doldurma bunları saklar. v+v*n%2çıkış verir, ya da vya da v*2bir parite bağlı olarak n.


0

Ruby , 49 bayt

->n{*s=t=0;s|[t+=1]==s||s<<t<<t*2until s[n];s[n]}

[0] ile başlayın, en az n + 1 elemente sahip olana kadar diziye çift ekleyin, sonra n + 1'i alın (1 tabanlı)

Çevrimiçi deneyin!


0

JavaScript (ES6), 60 65 bayt

Yinelemeli bir çözüm.

n=>eval("for(s={},i=0;n;)s[++i]?0:(s[i+i]=--n)?--n?0:i+i:i")

Daha az golf oynadı

n=>{
  s = {}; //hashtable for used values
  for(i=0; n; )
  {
    if ( ! s[++i] )
    {
      s[i*2] = 1; // remember i*2 is already used
      if (--n)
        if (--n)
          0;
        else
          result = i*2;
      else
        result = i;
    }
  }
  return result;  
}

Ölçek

F=
n=>eval("for(s={},i=0;n;)s[++i]?0:(s[i+i]=--n)?--n?0:i+i:i")

for (a=1; a < 50; a++)
  console.log(a,F(a))


0

Jöle , 13 12 10 bayt

ḤRọ2ḂĠZFị@

Bu Python cevabımdaki gözlemi kullanıyor .

Çevrimiçi deneyin!

Nasıl çalışır

ḤRọ2ḂĠZFị@  Main link. Argument: n

Ḥ           Unhalve; yield 2n.
 R          Range; yield [1, ... , 2n].
  ọ2        Compute the order of 2 in the factorization of each k in [1, ..., 2n].
    Ḃ       Bit; compute the parity of each order.
     G      Group the indices [1, ..., 2n] by the corresponding values.
      Z     Zip/transpose the resulting 2D array, interleaving the indices of 0
            with the indices of 1, as a list of pairs.
       F    Flatten. This yields a prefix of the sequence.
        ị@  Take the item at index n.
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.