Kimberling Dizisi


18

Giriş

Tabii ki, birçok zorluğumuz var, işte bir tane daha.

Kimberling dizisi ( A007063 ) aşağıdaki gibidir:

1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, ...

Bu, normal yinelemenin karıştırılmasıyla üretilir:

[1] 2  3  4  5  6  7  8

Dizinin ilk terimi 1. Bundan sonra, soldaki tüm terimler kullanılana kadar diziyi yeniden karıştırırız. Karıştırmanın deseni vardır right - left - right - left - .... Solunda terim 1bulunmadığından, karıştırma yoktur. Aşağıdakileri alıyoruz:

 2 [3] 4  5  6  7  8  9

İ On inci yineleme, biz i atmak inci madde ve sırayla koymak. Bu 2. iterasyon, bu yüzden 2. maddeyi atıyoruz . Dizisi gibi olur: 1, 3. Bir sonraki yinelememiz için, mevcut yinelemeyi yukarıdaki desenle karıştıracağız. İlk kullanılmamış öğeyi i . Öğenin sağında alırız . Bu olur 4. Bunu yeni yinelememize ekleyeceğiz:

 4

Şimdi ben sol tarafındaki ilk kullanılmayan öğeyi almaya gidiyoruz inci öğe. Bu 2. Bunu yeni yinelememize ekleyeceğiz:

 4  2

İ solunda sol hiçbir öğe olduğundan inci öğe, yaparız yeni yinelemesiyle dizisinin sadece ekleme kalanı:

 4  2 [5] 6  7  8  9  10  11  ...

Bu bizim 3. yinelememiz, bu yüzden 3. öğeyi atacağız, yani 5. Bu, dizimizdeki üçüncü öğedir:

 1, 3, 5

Bir sonraki yinelemeyi elde etmek için işlemi tekrarlayın. Net değilse bir gif yaptım:

resim açıklamasını buraya girin

GIF gerçek gönderiyi yazmaktan daha uzun sürdü

Görev

  • Negatif olmayan bir tamsayı n verildiğinde , dizinin ilk n terimini çıktılar
  • Bir işlev veya program sağlayabilirsiniz
  • Bu , bu yüzden en az bayt ile gönderme kazanır!

Test senaryoları:

Input: 4
Output: 1, 3, 5, 4

Input: 8
Output: 1, 3, 5, 4, 10, 7, 15, 8

Input: 15
Output: 1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28

Not: Çıktıdaki virgüller gerekli değildir. Örneğin, yeni satırlar kullanabilir veya bir liste vb. Çıktı alabilirsiniz.


Yığın döndürme
Cyoce

@ İyi şanslar :)
Adnan

ihtiyacım var gibi görünüyor
15'te Cyoce

Yanıtlar:


3

Pyth, 22 bayt

JS*3QVQ@JN=J.i>JhN_<JN

Çevrimiçi deneyin: Gösteri

Sadece OP'de açıklanan karıştırma tekniğini uygular.

Açıklama:

JS*3QVQ@JN=J.i>JhN_<JN
JS*3Q                    assign the list [1, 2, ..., 3*input-1] to J
     VQ                  for N in range(Q):
       @JN                  print J[N]
            .i              interleave 
              >JhN             J[N+1:] with
                  _<JN         reverse J[:N]
          =J                assign the resulting list to J

6

Julia 78 71 bayt

n->[(i=j=x;while j<2i-3 j=i-(j%2>0?1-j:j+22;i-=1end;i+j-1)for x=1:n]

Bu, bir tamsayıyı kabul eden ve bir tamsayı dizisi döndüren adsız bir işlevdir. Bunu çağırmak için bir değişkene atayın.

Buradaki yaklaşım OEIS'te tarif edilenle aynıdır.

Ungolfed:

# This computes the element of the sequence
function K(x)
    i = j = x
    while j < 2i - 3
        j = i - (j % 2 > 0 ? 1 - j : j + 22
        i -= 1
    end
    return i + j - 1
end

# This gives the first n terms of the sequence
n -> [K(i) for i = 1:n]

Mauris sayesinde 7 bayt tasarruf edildi!


3

Mathematica 130 bayt

(n=0;s={};Nest[(n++;AppendTo[s,z=#[[n]]];Flatten[TakeDrop[#,1+2(n-1)]/.{t___,z,r___}:> 
Riffle[{r},Reverse@{t}]])&,Range[3*#],#];s)&

Bir liste aralığında oluşan başlayan 1üzere 3x, neredexİstenilen Kimberling dizisi terimleri sayısının .

Her adımda, n, TakeDropbir ön liste halinde geçerli liste keser 2n+1(ön liste yeniden işlenmiş, daha sonra birlikte katılacak) (çalışma yapılır) hüküm ve arka listede. Ön liste aşağıdaki desenle eşleşir; {t___,z,r___}burada z, ön listenin ortasındaki Kimberling terimidir. rolduğu Rifflebir ters ile d' tve daha sonra, arka listesi eklenir. zkaldırılır ve AppendTobüyüyen Kimberling sekansına ( ) eklenir .

ntarafından artırılır 1ve geçerli liste aynı işlev tarafındanNest.


Misal

(n=0;s={};Nest[(n++;AppendTo[s,z=#[[n]]];Flatten[TakeDrop[#,1+2(n-1)]/.{t___,z,r___}:> 
Riffle[{r},Reverse@{t}]])&,Range[3*#],#];s)&[100]

{1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, 42, 35, 33, 46, 53, 6, 36, 23, 2 , 55, 62, 59, 76, 65, 54, 11, 34, 48, 70, 79, 99, 95, 44, 97, 58, 84, 25, 13, 122, 83, 26, 115, 82, 91 , 52, 138, 67, 90, 71, 119, 64, 37, 81, 39, 169, 88, 108, 141, 38, 16, 146, 41, 21, 175, 158, 165, 86, 191, 45 198, 216, 166, 124, 128, 204, 160, 12, 232, 126, 208, 114, 161, 156, 151, 249, 236, 263, 243, 101, 121, 72, 120, 47, 229 }


2

Python 2, 76 bayt

for a in range(input()):
 b=a+1
 while-~b<2*a:b=a-(b^b%-2)/2;a-=1
 print a+b

açıklama

Bu, birçok golf-y dönüşümünden sonra OEIS formülüdür! Güzel çalıştı . Orijinal kod

i=b=a+1
while b<2*i-3:b=i-(b+2,1-b)[b%2]/2;i-=1
print i+b-1

Önce kurtuldum, her iyerle değiştirdim a+1ve ifadeleri genişlettim:

b=a+1
while b<2*a-1:b=a+1-(b+2,1-b)[b%2]/2;a-=1
print a+b

Daha sonra, yeniden yazan b<2*a-1olarak -~b<2*aboşluk bir bayt kaydetmek ve hareket için +12 ile, seçim haline bölünmesi, ve olumsuz:

while-~b<2*a:b=a-(b,-b-1)[b%2]/2;a-=1

O zaman, -b-1sadece ~b, bu yüzden yazabiliriz (b,~b)[b%2]. Bu, b^0 if b%2 else b^-1XOR operatörünün kullanılmasına eşdeğerdir veya alternatif olarak b^b%-2.

while-~b<2*a:b=a-(b^b%-2)/2;a-=1

2

Pyth, 29 25 bayt

VQ+.W<hHyN-~tN/x%Z_2Z2hNN

Jakube 4 bayt kurtardı, ancak artık kodu nasıl okuyacağımı bilmiyorum.

İşte eski çözüm:

VQKhNW<hKyN=K-~tN/x%K_2K2)+KN

Python cevabımın çevirisi. Pyth'te çok iyi değilim, bu yüzden belki de bunu kısaltmanın yolları var.

VQ                              for N in range(input()):
  KhN                             K = N+1
     W<hKyN                       while 1+K < 2*N:
           =K-~tN/x%K_2K2)         K = (N--) - (K%-2 xor K) / 2
                          +KN     print K + N

Sen kullanabilirsiniz .W4 bayt kapalı golf: VQ+.W<hHyN-~tN/x%Z_2Z2hNN.
Jakube

Bu harika - kabaca nasıl çalıştığını açıklayabilir misiniz?
Lynn

1
.Wformu vardır: .W<condition><apply><start-value>. Başlangıç ​​değerini kullandığınız hNgibi kullandım KhN. doğru .Wolduğu sürece bu değeri değiştirir <condition>. Seninle aynı durumu kullandım <hHyN. Koşul, parametreyle bir lambda işlevidir H, bu nedenle geçerli değer (kodunuzda K) H. Ve ayrıca aynı kullanıldığı <apply>sen, sadece değiştirilen olarak açıklama Kile Z, çünkü <apply>deyim parametresi olan bir lambda-fonksiyondur Z. Biz göz ardı edebilirsiniz =K, .Wbu işler. Eski değeri hesaplanan değerle değiştirir. Sonunda baskı+...N
Jakube

2

APL, 56 44 bayt

{⍵<⍺+⍺-3:(⍺-1)∇⍺-4÷⍨3+(1+2×⍵)ׯ1*⍵⋄⍺+⍵-1}⍨¨⍳

Bu, sağda bir tamsayıyı kabul eden ve bir dizi döndüren isimsiz bir monadik trendir. Julia'nın cevabıyla kabaca aynı yaklaşım .

En içteki işlev, n'i aynı sol ve sağ argümanlar olarak verilen Kimberling dizisindeki n. Terimi döndüren yinelemeli bir ikili işlevdir .

{⍵<⍺+⍺-3:                                    ⍝ If ⍵ < 2⍺ - 3
         (⍺-1)∇⍺-4÷⍨3+(1+2×⍵)ׯ1*⍵           ⍝ Recurse, incrementing a and setting
                                             ⍝ ⍵ = ⍺ - (3 + (-1)^⍵ * (1 + 2⍵))/4
                                   ⋄⍺+⍵-1}   ⍝ Otherwise return ⍺ + ⍵ - 1

Elimizle, dizinin bireysel terimlerini elde edebiliyoruz. Ancak, sorun o zaman bu bir olduğunu haline diyadik her iki tarafta da argüman gerektirir, yani işlevi. Operatöre girin ! Bir işlevi göz önüne alındığında, fve bir giriş x, f⍨xaynıdır x f x. Yani bizim durumumuzda, yukarıda belirtilen fonksiyona atıfta bulunarak f, aşağıdaki monadik treni inşa edebiliriz:

f⍨¨⍳

Başvuruyoruz f1'den girişe kadar her bir tamsayıya bir dizi .

Dennis sayesinde 12 bayt tasarruf!

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.