Buat urutan pointer

12

Mari kita tentukan urutan penunjuk menjadi urutan apa pun sehingga a (n) = a ((n-1) - (a (n-1))) forall n lebih besar dari beberapa angka hingga. Misalnya jika urutan kita mulai dengan

3 2 1 

Istilah kita berikutnya adalah 2, karena a (n-1) = 1 , (n-1) -1 = 1 , a (1) = 2 (contoh ini adalah indeks nol namun tidak masalah apa indeks yang Anda gunakan akan dihitung selalu sama.). Jika kita mengulangi prosesnya, kita mendapatkan urutan yang tidak terbatas

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

Tugas

Mengingat beberapa array awal dari bilangan bulat positif menghasilkan urutan pointer dimulai dengan array itu.

Jenis output

Output dimaksudkan untuk menjadi fleksibel, jika Anda memilih untuk menulis fungsi sebagai program Anda dapat kembali, baik daftar bilangan bulat tak terbatas atau fungsi yang mengindeks urutan. Jika Anda memilih untuk menulis program lengkap, Anda dapat menampilkan ketentuan urutan tanpa batas.

Anda juga dapat memilih untuk mengambil dua input, array awal dan indeks. Jika Anda memilih untuk melakukan ini, Anda hanya perlu menampilkan jangka waktu urutan pada indeks itu.


Anda tidak akan pernah diberi urutan yang membutuhkan pengindeksan sebelum awal urutan. Misalnya 3bukan input yang valid karena Anda akan memerlukan persyaratan sebelum 3untuk menyelesaikan istilah berikutnya.

Ini adalah sehingga skor Anda akan menjadi jumlah byte dalam program Anda dengan skor yang lebih rendah lebih baik.

Uji Kasus

test case dipotong untuk kesederhanaan

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 ...
Ad Hoc Garf Hunter
sumber
Apakah diperbolehkan untuk output n hal ekstra selain array input? Atau istilah ke- n yang dimulai setelah yang disediakan sebagai input?
Luis Mendo
@LuisMendo Tentu saja pengindeksan baik-baik saja.
Ad Hoc Garf Hunter

Jawaban:

8

JavaScript (ES6), 25 byte

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

Fungsi anonim yang, ketika dipanggil, membuat fungsi fyang memberikan item pada indeks yang diberikan dalam urutan.

Tolong beri tahu saya jika saya salah mengerti sesuatu ...

Produksi ETH
sumber
Anda menelepon f(n)dari f(n). Saya tidak berpikir itu akan pernah berakhir, tetapi saya tidak tahu JS.
Ad Hoc Garf Hunter
@FunkyComputerMan Ketika nmendapat cukup rendah a[n]akan mengembalikan nilai yang sebenarnya, sehingga ||akan korsleting dan mencegah berulang berulang.
ETHproduksi
Ya saya dapat itu tetapi ntidak mendapatkan yang lebih rendah dengan setiap panggilan. Saya cukup yakin jika nlebih besar dari panjang aAnda tidak akan pernah berhenti.
Ad Hoc Garf Hunter
2
@FunkyComputerMan Ini berjalan mendapatkan lebih rendah dengan masing-masing panggilan, --nmenetapkan nuntuk n-1jadi referensi sebelahnya akan merujuk pada dikurangi n.
Erik the Outgolfer
2
@FunkyComputerMan --ndecrements n, yang artinya f(--n-f(n))sama denganf((n-1)-f(n-1))
ETHproduk
5

Sekam , 7 6 byte

¡S!o_L

Mengembalikan daftar yang tak terbatas. Cobalah online! Perhatikan bahwa perlu beberapa saat bagi TIO untuk memotong dan mencetak hasilnya.

Penjelasan

Operator ¡memiliki beberapa arti. Di sini saya menggunakan "membangun daftar tak terbatas dengan mengulangi fungsi yang menghitung elemen baru dari daftar yang sudah ada". Diberikan daftar panjang N , elemen baru akan memiliki indeks berbasis 1 N + 1 . Yang perlu kita lakukan adalah meniadakan elemen terakhir dari daftar (yang merupakan nilai sebelumnya) dan mengindeks ke dalam daftar menggunakan hasilnya.

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

Haskell , 36 byte

Mengambil daftar dan mengembalikan fungsi yang mengindeks urutan

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

Cobalah online!

Penjelasan

Di sini kita mendefinisikan fungsi !yang mengambil daftar ldan indeks n. Jika nkurang dari panjang lkita index loleh n, kalau tidak kita kembali l!((n-1)-l!(n-1)). Ini mengikuti definisi rekursif dari fungsi yang saya berikan dalam pertanyaan.

Berikut adalah program yang sama tanpa ungolfed.

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

Saya menggunakan e<-n-1bukannya sebaliknya untuk menyimpan byte sementara menugaskan n-1untuk esehingga dapat digunakan kemudian.

Ad Hoc Garf Hunter
sumber
4

MATL , 13 9 byte

:"tt0)_)h

Keluaran istilah awal diikuti oleh n ketentuan tambahan (diizinkan oleh tantangan), di mana n adalah bilangan bulat positif yang diambil sebagai input.

Cobalah online!

Penjelasan

:"      % 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
Luis Mendo
sumber
3

Mathematica, 63 byte

membutuhkan dua input

(Clear@a;(a@#2[[1]]=#)&~MapIndexed~#;a@n_:=a[n-1-a[n-1]];a@#2)&  

Cobalah online!

-3 byte dari Martin Ender

J42161217
sumber
2

R , 55 byte

f=function(a,n)"if"(n<=sum(a|1),a[n],f(a,n-1-f(a,n-1)))

Cobalah online!

Mengambil dua input.

Giuseppe
sumber
2

ML Standar (MLton) , 58 byte

fun a$n=if n<length$then List.nth($,n)else a$(n-1-a$(n-1))

Cobalah online! Fungsi amengambil daftar awal dan indeks dan mengembalikan elemen urutan pada indeks itu. Contoh penggunaan: a [4,3,1] 5hasil 4.

Laikoni
sumber
2

Jelly , 6 byte

NṪịṭµ¡

Mengambil urutan S dan integer k , dan menambahkan k istilah untuk S .

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
1

CJam, 10 byte

{{(_j-j}j}

Untuk CJam, ini sangat baik (Bahkan mengalahkan 05ab1e!).

Ini adalah blok anonim yang mengharapkan input dalam bentuk i ndi stack, di mana iindeks dalam urutan dan nmerupakan array angka awal.

Alasan ini bekerja sangat baik adalah karena joperator, yang menyediakan rekursi memo dari serangkaian nilai awal.

Penjelasan:

{    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
Buah Esolanging
sumber
1

Java (8), 60 byte

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

Mengambil dua input (integer-array adan integer n), dan menampilkan nilai n'urutan.

Penjelasan:

Coba di sini. (Mungkin butuh beberapa detik.)

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
Kevin Cruijssen
sumber
0

Perl, 38 +3 (-anl) byte

{print;push@F,$_=$F[$#F-$F[$#F]];redo}

Cobalah secara Online

Nahuel Fouilleul
sumber
TIO Anda menuju ke program yang berbeda.
Xcali
@Xcali saya memperbaiki tautan tetapi tidak dapat menjalankan karena tidak dapat membuat koneksi dengan server.
Nahuel Fouilleul
0

05AB1E , 20 byte

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

Mengharapkan input sebagai string yang dipisahkan oleh spasi, terus menghasilkan keluaran tanpa batas; implementasi yang cukup mudah

Contoh dijalankan:

$ 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
pengguna4867444
sumber
0

Java (OpenJDK 8) , 95 93 91 90 byte

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;}

Cobalah online!

Roberto Graham
sumber
Tidak b[(j-1)-...]setara dengan b[~-j-...]?
Jonathan Frech
Anda dapat membalikkan terner dari j>=a.lengthke j<a.lengthuntuk menyimpan byte: j<a.length?a[j]:b[~-j-b[j-1]]. Saya juga penasaran: mengapa Anda menggunakan pendekatan loop, ketika pendekatan rekursif yang juga dijelaskan dalam deskripsi tantangan itu sendiri hanya 60 byte?
Kevin Cruijssen
Saya tidak suka menjawab dengan metode dan AFAIK, fungsi referensi-sendiri memerlukan jawaban program lengkap
Roberto Graham
@RobertoGraham Tidak, metode rekursif tidak bisa menjadi lambda, jadi harus metode gaya Java 7. Tapi itu masih diperbolehkan untuk hanya memposting metode (gaya 7 Java) daripada program lengkap.
Kevin Cruijssen
@KevinCruijssen Saya telah membuat jawaban Anda menjadi sebuah BiFunction, Cobalah online! . Itu mungkin, tetapi Anda perlu memposting keseluruhan program karena referensi Utama
Roberto Graham