Tạo một chuỗi con trỏ


12

Cho phép xác định một chuỗi con trỏ đến được bất kỳ chuỗi như vậy mà một (n) = a ((n-1) - (a (n-1))) forall n lớn hơn một số số hữu hạn. Ví dụ: nếu chuỗi của chúng tôi bắt đầu với

3 2 1 

Thuật ngữ tiếp theo của chúng tôi sẽ là 2, bởi vì a (n-1) = 1 , (n-1) -1 = 1 , a (1) = 2 (ví dụ này là chỉ số bằng 0 tuy nhiên việc bạn sử dụng chỉ số nào sẽ không quan trọng luôn luôn như vậy.). Nếu chúng ta lặp lại quá trình, chúng ta sẽ có được chuỗi vô hạn

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

Bài tập

Cho một số mảng ban đầu của số nguyên dương xuất ra chuỗi con trỏ bắt đầu với mảng đó.

Các loại đầu ra

Đầu ra được dự định là linh hoạt, nếu bạn chọn viết một hàm vì chương trình của bạn có thể trả về, đó là một danh sách vô hạn các số nguyên hoặc một hàm lập chỉ mục chuỗi. Nếu bạn chọn viết một chương trình đầy đủ, bạn có thể xuất các thuật ngữ của chuỗi vô thời hạn.

Bạn cũng có thể chọn lấy hai đầu vào, mảng bắt đầu và một chỉ mục. Nếu bạn chọn làm điều này, bạn chỉ cần xuất thuật ngữ của chuỗi tại chỉ mục đó.


Bạn sẽ không bao giờ được cung cấp một chuỗi yêu cầu lập chỉ mục trước khi bắt đầu trình tự. Ví dụ: 3không phải là một đầu vào hợp lệ bởi vì bạn sẽ cần các điều khoản trước khi 3giải quyết các điều khoản tiếp theo.

Đây là vì vậy điểm của bạn sẽ là số byte trong chương trình của bạn với điểm thấp hơn sẽ tốt hơn.

Các trường hợp thử nghiệm

trường hợp thử nghiệm được cắt ngắn để đơn giản

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 ...

Được phép xuất ra n điều khoản bổ sung ngoài mảng đầu vào? Hoặc thuật ngữ thứ n bắt đầu sau khi được cung cấp làm đầu vào?
Luis Mendo

@LuisMendo Chắc chắn mọi chỉ số đều ổn.
Đăng Rock Garf Hunter

Câu trả lời:


8

JavaScript (ES6), 25 byte

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

Một hàm ẩn danh, khi được gọi, sẽ tạo ra một hàm fcung cấp vật phẩm tại một chỉ mục nhất định trong chuỗi.

Xin vui lòng cho tôi biết nếu tôi hiểu nhầm bất cứ điều gì ...


Bạn gọi f(n)từ trong f(n). Tôi không nghĩ điều đó sẽ chấm dứt, nhưng tôi không biết về JS.
Đăng Rock Garf Hunter

@FunkyComputerMan Khi nđủ thấp, a[n]nó sẽ trả về giá trị trung thực, do đó, ||sẽ ngắn mạch và ngăn không cho nó tái diễn vô hạn.
Sản xuất ETH

Vâng, tôi đã nhận được nhưng nkhông nhận được bất kỳ thấp hơn với mỗi cuộc gọi. Tôi khá chắc chắn nếu nlớn hơn chiều dài của abạn sẽ không bao giờ dừng lại.
Đăng Rock Garf Hunter

2
@FunkyComputerMan Nó trở nên thấp hơn với mỗi cuộc gọi, được --ngán ncho n-1vì vậy tham chiếu tiếp theo của nó sẽ đề cập đến việc giảm dần n.
Erik the Outgolfer

2
@FunkyComputerMan --ngiảm n, có nghĩa f(--n-f(n))là tương tự nhưf((n-1)-f(n-1))
ETHproductions

5

Husk , 7 6 byte

¡S!o_L

Trả về một danh sách vô hạn. Hãy thử trực tuyến! Lưu ý rằng phải mất một thời gian để TIO cắt ngắn và in kết quả.

Giải trình

Toán tử ¡có một số ý nghĩa. Ở đây tôi đang sử dụng "xây dựng danh sách vô hạn bằng cách lặp lại một hàm tính toán một phần tử mới từ danh sách các phần tử hiện có". Đưa ra một danh sách độ dài N , phần tử mới sẽ có chỉ số dựa trên 1 N + 1 . Tất cả những gì chúng ta cần làm là phủ định phần tử cuối cùng của danh sách (là giá trị trước đó) và lập chỉ mục vào danh sách bằng kết quả.

¡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 byte

Đưa ra một danh sách và trả về một hàm lập chỉ mục chuỗi

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

Hãy thử trực tuyến!

Giải trình

Ở đây chúng tôi đang xác định một chức năng !có một danh sách lvà một chỉ mục n. Nếu nít hơn độ dài của lchúng tôi chỉ lbởi n, nếu không chúng tôi quay trở lại l!((n-1)-l!(n-1)). Điều này tuân theo định nghĩa đệ quy của hàm tôi đã đưa ra trong câu hỏi.

Đây là chương trình tương tự vô căn cứ.

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

Tôi sử dụng e<-n-1thay vì khác để lưu byte trong khi gán n-1cho enó có thể được sử dụng sau này.


4

MATL , 13 9 byte

:"tt0)_)h

Xuất ra các điều khoản ban đầu theo sau là n điều khoản bổ sung (được cho phép bởi thử thách), trong đó n là số nguyên dương được lấy làm đầu vào.

Hãy thử trực tuyến!

Giải trình

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

Thạch , 6 byte

NṪịṭµ¡

Mất một chuỗi S và một số nguyên k , và cho biết thêm k điều kiện để S .

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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 byte

{{(_j-j}j}

Đối với CJam, điều này làm rất tốt (Nó thậm chí còn đánh bại 05ab1e!).

Đây là một khối ẩn danh dự kiến ​​đầu vào ở dạng i ntrên ngăn xếp, trong đó ichỉ mục trong chuỗi và nlà một mảng các số bắt đầu.

Lý do điều này hoạt động tốt là vì jtoán tử, cung cấp đệ quy ghi nhớ từ một tập hợp các giá trị bắt đầu.

Giải trình:

{    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 byte

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

Có hai đầu vào (mảng asố nguyên và số nguyênn ) và xuất ngiá trị thứ 'của chuỗi.

Giải trình:

Hãy thử nó ở đây. (Có thể mất vài giây.)

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 byte

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

Yêu cầu đầu vào dưới dạng một chuỗi được phân tách bằng dấu cách, tiếp tục xuất ra vô thời hạn; thực hiện khá đơn giản

Chạy ví dụ:

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

Hãy thử trực tuyến!


Không b[(j-1)-...]tương đương với b[~-j-...]?
Jonathan Frech

Bạn có thể đảo ngược ternary từ j>=a.lengthđể j<a.lengthtiết kiệm một byte: j<a.length?a[j]:b[~-j-b[j-1]]. Ngoài ra tôi cũng tò mò: tại sao bạn lại đi theo cách tiếp cận vòng lặp, khi cách tiếp cận đệ quy cũng được giải thích trong bản mô tả thử thách chỉ là 60 byte?
Kevin Cruijssen

Tôi không muốn trả lời bằng các phương pháp và AFAIK Chức năng tự tham chiếu cần một câu trả lời đầy đủ của chương trình
Roberto Graham

@RobertoGraham Không, một phương thức đệ quy không thể là lambda, do đó phải là một phương thức kiểu Java 7. Nhưng nó vẫn được phép đăng một phương thức (kiểu Java 7) thay vì chương trình đầy đủ.
Kevin Cruijssen

@KevinCruijssen Tôi đã đưa câu trả lời của bạn vào một BiFactor, hãy thử trực tuyến! . Điều đó là có thể nhưng bạn cần đăng toàn bộ chương trình vì nó tham khảo Chính
Roberto Graham

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.