İşaretçi sırası oluşturma


12

Öyle ki herhangi bir sekans için bir işaretçiyi dizisini tanımlamak sağlar bir (n) = a ((n-1) - (A (n-1))) forall'dır N sonlu bir sayısından daha fazla. Örneğin, dizimiz

3 2 1 

Bir sonraki terimimiz olacaktır 2, çünkü a (n-1) = 1 , (n-1) -1 = 1 , a (1) = 2 (bu örnek sıfır endeksidir, ancak hesaplamayı hangi dizini kullandığınız önemli değildir hep aynı olsun.). İşlemi tekrarlarsak sonsuz diziyi elde ederiz

3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2

Görev

Bazı pozitif tamsayı dizileri verildiğinde, o diziden başlayarak işaretçi dizisi çıktısı verilir.

Çıktı türleri

Çıktının esnek olması amaçlanmıştır, eğer programınız olarak bir işlev yazmayı seçerseniz, sonsuz bir tam sayı listesi veya diziyi indeksleyen bir işlev olabilir. Tam bir program yazmayı seçerseniz, dizinin koşullarını süresiz olarak çıktılayabilirsiniz.

Ayrıca, başlangıç ​​dizisi ve bir dizin olmak üzere iki giriş almayı da seçebilirsiniz. Bunu yapmayı seçerseniz, yalnızca dizindeki dizinin terimini çıkarmanız gerekir.


Size, dizinin başlangıcından önce dizine eklenmesini gerektiren bir dizi verilmez. Örneğin 3geçerli bir girdi değildir, çünkü 3sonraki terimi çözmek için önce terimlere ihtiyacınız vardır .

Bu bu nedenle puanınız programınızdaki bayt sayısı daha düşük bir puan daha iyi olacak.

Test Durumları

test senaryoları basitlik açısından kısaltılmıştır

2 1   -> 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 ...
2 3 1 -> 2 3 1 3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 ...
3 3 1 -> 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 ...
4 3 1 -> 4 3 1 3 4 4 3 3 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 ...

Giriş dizisine ek olarak n ekstra terim çıkarmasına izin veriliyor mu? Veya girdi olarak sağlananlardan sonra başlayan n. Terim?
Luis Mendo

@LuisMendo Elbette herhangi bir indeksleme iyi.
Ad Hoc Garf Hunter

Yanıtlar:


8

JavaScript (ES6), 25 bayt

a=>f=n=>a[n]||f(--n-f(n))

Çağrıldığında, fbelirli bir dizindeki öğeyi sırayla veren bir işlev oluşturan anonim bir işlev .

Bir şeyi yanlış anladıysam lütfen bana bildirin ...


Sen buna f(n)gelen f(n). Bunun hiç bitmeyeceğini sanmıyorum, ama JS bilmiyorum.
Ad Hoc Garf Hunter

@FunkyComputerMan nYeterince a[n]alçaldığında, gerçek bir değer döndürür, bu nedenle ||kısa devre yapar ve sonsuz tekrarlama yapmasını önler.
ETHproductions

Evet, anladım ama nher çağrıda daha aşağıya inmiyor. Eminim ki nuzunluğunuzdan büyükse aasla durmayacak.
Ad Hoc Garf Hunter

2
@FunkyComputerMan Her çağrıda daha aşağı iner, --natayın n, n-1böylece bir sonraki referans azalanlara atıfta bulunacaktır n.
Outgolfer Erik

2
@FunkyComputerMan --nbir azalır naraçlar f(--n-f(n))ile aynıdırf((n-1)-f(n-1))
ETHproductions

5

Kabuk , 7 6 bayt

¡S!o_L

Sonsuz bir liste döndürür. Çevrimiçi deneyin! TIO'nun sonucu kısaltması ve yazdırması biraz zaman alabilir.

açıklama

Operatörün ¡birkaç anlamı vardır. Burada "varolanlar listesinden yeni bir öğe hesaplayan bir işlevi yineleyerek sonsuz liste oluşturmak" kullanıyorum. N uzunluğunun bir listesi verildiğinde , yeni öğenin 1 tabanlı dizini N + 1 olacaktır . Tek yapmamız gereken, listenin son öğesini (önceki değer olan) reddetmek ve sonucu kullanarak listeye indekslemektir.

¡S!o_L  Implicit input.
¡       Construct infinite list by iterating this function on input:
 S!      Element at index
    →    last element
  o_     negated.

4

Haskell , 36 bayt

Bir liste alır ve diziyi indeksleyen bir işlev döndürür

l!n|n<length l=l!!n|e<-n-1=l!(e-l!e)

Çevrimiçi deneyin!

açıklama

Burada !bir liste lve bir indeks alan bir fonksiyon tanımlamaktayız n. Eğer nuzunluğundan daha azdır lbiz endeksi lile n, aksi takdirde biz dönmek l!((n-1)-l!(n-1)). Bu, soruda verdiğim işlevin özyinelemeli tanımını izler.

İşte aynı program ungolfed.

a l n
 |n<length l = l!!n
 |otherwise = (a l) ((n-1) - (a l) (n-1))

Daha sonra kullanılabilmesi için e<-n-1atama sırasında baytları kaydetmek yerine başka türlü kullanıyorum .n-1e


4

MATL , 13 9 bayt

:"tt0)_)h

Başlangıç ​​terimlerini ve ardından n ek terim (sınama tarafından izin verilir) verir, burada n girdi olarak alınan pozitif bir tamsayıdır.

Çevrimiçi deneyin!

açıklama

:"      % Implicitly input n. Do the following n times
  tt    %    Duplicate the sequence so far, twice. In the first iteration this
        %    implicitly inputs the array of initial terms
  0)    %    Get value of the last entry, say m
  _)    %    Get value of the entry which is m positions back from the last
  h     %    Append. This extends the array with the new entry
        % Implicit end. Implicitly display




2

Jöle , 6 bayt

NṪịṭµ¡

S dizisini ve k tamsayısını alır ve S'ye k terimleri ekler .

Çevrimiçi deneyin!

Nasıl çalışır

NṪịṭµ¡  Main link. Left argument: S (sequence). Right argument: k (integer)

    µ¡  Combine the links to the left into a (variadic) chain and call it k times.
        The new chain started by µ is monadic, so the chain to the left will be
        called monadically.
N           Negate; multiply all elements in S by -1.
 Ṫ          Tail; retrieve the last element, i.e., -a(n-1).
  ị         At-index; retrieve the element of S at index -a(n-1).
            Since indexing is modular and the last element has indices n-1 and 0,
            this computes a( (n-1) - a(n-1) ).
   ṭ        Tack; append the result to S.


1

CJam, 10 bayt

{{(_j-j}j}

CJam için, bu çok iyi (05ab1e bile yener!).

Bu biçimde giriş bekler anonim blok i nistifi üzerinde isırayla endekstir ve nbaşlangıç sayıları bir dizidir.

Bunun çok iyi çalışmasının nedeni, jbir dizi başlangıç ​​değerinden kaydedilmiş özyineleme sağlayan operatörden kaynaklanmaktadır.

Açıklama:

{    Function j(n) with [j(0), j(1), j(2)] = [4, 3, 1], return j(6):
 (    Decrement:    5
 _    Duplicate:    5 5
 j    j(5):
  (    Decrement:   5 4
  _    Duplicate:   5 4 4
  j    j(4):
   (    Decrement:  5 4 3
   _    Duplicate:  5 4 3 3
   j    j(3):
    (    Decrement: 5 4 3 2
    _    Duplicate: 5 4 3 2 2
    j    j(2) = 1:  5 4 3 2 1
    -    Subtract:  5 4 3 1
    j    j(1) = 3:  5 4 3 3
   -    Subtract:   5 4 0
   j    j(0) = 4:   5 4 4
  -    Subtract:    5 0
  j    j(0) = 4:    5 4
 -    Subtract:     1
 j    j(1) = 3:     3
}j   End:           3

1

Java (8), 60 bayt

int a(int[]a,int n){return n<a.length?a[n]:a(a,--n-a(a,n));}

İki giriş (tamsayı-dizi ave tamsayı n) alır ven 'inci değerini verir.

Açıklama:

Burada deneyin. (Birkaç saniye sürebilir.)

int a(int[]a,int n){        // Method with int[] and int parameters and int return-type
  return n<a.length?        //  If input `n` is smaller than the length of the array:
          a[n]              //   Output the `n`'th item of the array
         :                  //  Else:
          a(a,--n-a(a,n));  //   Recursive call with `n-1-a(n-1)`
}                           // End of method


0

05AB1E , 20 bayt

#`r[=ˆŽ¼}[¯¾¯¾è-è=ˆ¼

Girişi boşlukla ayrılmış bir dize olarak bekler, çıktıyı süresiz olarak tutar; oldukça basit uygulama

Örnek çalışma:

$ 05ab1e -e '#`r[=ˆŽ¼}[¯¾¯¾è-è=ˆ¼' <<< '3 2 1'
3
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2

0

Java (OpenJDK 8) , 95 93 91 90 bayt

a->i->{int j=0,b[]=new int[++i];for(;j<i;j++)b[j]=j<a.length?a[j]:b[~-j-b[j-1]];return b;}

Çevrimiçi deneyin!


b[(j-1)-...]Eşdeğer değil b[~-j-...]mi?
Jonathan Frech

Dan Sen ve üçlü tersine çevirebilir j>=a.lengthiçin j<a.lengthbir byte kaydetmek için: j<a.length?a[j]:b[~-j-b[j-1]]. Ayrıca merak ediyorum: meydan okuma açıklamasında da açıklanan özyinelemeli yaklaşım sadece 60 bayt olduğunda neden bir döngü yaklaşımıyla gittiniz ?
Kevin Cruijssen

Metodlarla cevap vermeyi sevmiyorum ve AFAIK kendini referanslayan bir fonksiyonun tam bir program cevabı gerektiriyor
Roberto Graham

@RobertoGraham Hayır, özyinelemeli bir yöntem lambda olamaz, bu nedenle Java 7 stili bir yöntem olmalıdır. Ancak yine de tam program yerine bir (Java 7 stili) yöntemi yayınlamasına izin verilir.
Kevin Cruijssen

@KevinCruijssen Cevabınızı BiFunction'a verdim, çevrimiçi deneyin! . Bu mümkün, ancak tüm programı yayınlamanız gerekiyor çünkü Main
Roberto Graham'a

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.