포인터 시퀀스 생성


12

그런 어떤 순서로 포인터의 시퀀스를 정의 할 수 A (n은) = A ((N-1) - (a (N-1))) FORALL N 일부 제한된 수 이상. 예를 들어 시퀀스가 ​​시작되면

3 2 1 

우리의 다음 용어는 것 2때문에 A (N-1) = 1 , (N-1) -1 = 1 , A (1) = 2 (이 예제는 당신이 할 계산 문제가되지 사용합니까 어떤 인덱스 그러나 제로 인덱스 항상 동일합니다.). 프로세스를 반복하면 무한 시퀀스를 얻습니다.

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

직무

양의 정수의 초기 배열이 주어진 경우 해당 배열로 시작하는 포인터 시퀀스가 ​​출력됩니다.

출력 유형

프로그램이 함수를 함수로 작성하도록 선택하면 무한 정수 목록 또는 시퀀스를 색인화하는 함수로 출력을 유연하게 만들 수 있습니다. 전체 프로그램을 작성하기로 선택하면 시퀀스의 항을 무기한으로 출력 할 수 있습니다.

시작 배열과 색인의 두 가지 입력을 선택할 수도 있습니다. 이 작업을 선택하면 해당 인덱스의 시퀀스 항만 출력하면됩니다.


시퀀스 시작 전에 인덱싱이 필요한 시퀀스는 제공되지 않습니다. 예를 들어 , 다음 항을 해결 3하려면 항이 필요하기 때문에 유효한 입력이 아닙니다 3.

이것은 이므로 점수가 낮을수록 프로그램의 바이트 수가됩니다.

테스트 사례

단순성을 위해 테스트 사례가 잘립니다.

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

입력 배열 외에 n 개의 추가 항 을 출력 할 수 있습니까? 아니면 입력으로 제공된 용어 다음에 시작 하는 n 번째 용어입니까?
Luis Mendo

@LuisMendo 물론 인덱싱은 괜찮습니다.
Ad Hoc Garf Hunter

답변:


8

자바 스크립트 (ES6), 25 바이트

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

호출 될 때 f시퀀스의 지정된 색인에 항목을 제공 하는 함수 를 작성하는 익명 함수입니다 .

오해가 있으면 알려주세요.


f(n)에서 전화 를 겁니다 f(n). 나는 그것이 끝날 것이라고 생각하지 않지만 JS를 모른다.
애드혹 가프 헌터

@FunkyComputerMan n충분히 낮아지면 a[n]올바른 값을 반환하므로 ||의지가 단락 되어 무한히 재귀하는 것을 방지합니다.
ETHproductions

그래, 나는 그것을 얻었지만 n매번 더 낮아지지는 않는다. 나는 확신하는 경우 해요 n의 길이보다 더 큰 a당신이 중단하지 않습니다.
Ad Hoc Garf Hunter

2
그것은 각 호출로 낮은 얻을 간다 @FunkyComputerMan --n할당 nn-1그것 다음 참조 감소 참고하여주십시오 있도록 n.
Outgolfer Erik

2
@FunkyComputerMan --n감소 n, 이는 f(--n-f(n))다음과 동일 함을 의미합니다.f((n-1)-f(n-1))
ETHproductions

5

껍질 , 7 6 바이트

¡S!o_L

무한리스트를 돌려줍니다. 온라인으로 사용해보십시오! TIO가 결과를 자르고 인쇄하는 데 시간이 걸립니다.

설명

연산자 ¡에는 몇 가지 의미가 있습니다. 여기서는 "기존 요소 목록에서 새 요소를 계산하는 함수를 반복하여 무한 목록 구성"을 사용하고 있습니다. 길이 N 의 목록이 주어지면 새 요소에는 1 기반 인덱스 N + 1이 있습니다. 목록의 마지막 요소 (이전 값)를 무효화하고 결과를 사용하여 목록에 색인을 작성하기 만하면됩니다.

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

4

하스켈 , 36 바이트

리스트를 가져 와서 시퀀스를 인덱스하는 함수를 반환

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

온라인으로 사용해보십시오!

설명

여기서 우리는 !리스트 l와 인덱스 를 취하는 함수 를 정의하고 있습니다 n. 로 색인을 생성 한 n길이보다 작 으면를 반환 합니다. 이것은 내가 질문에서 준 함수의 재귀 적 정의를 따릅니다.llnl!((n-1)-l!(n-1))

동일한 프로그램이 ungolfed입니다.

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

내가 사용하는 e<-n-1할당하는 동안 바이트를 저장하는 대신에, 그렇지 않으면의 n-1e나중에 사용할 수 있도록.


4

MATL , 13 9 바이트

:"tt0)_)h

초기 항과 n 개의 추가 항 (도전이 허용됨) 을 출력합니다. 여기서 n 은 입력으로 사용되는 양의 정수입니다.

온라인으로 사용해보십시오!

설명

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

젤리 , 6 바이트

NṪịṭµ¡

시퀀스 S 와 정수 k를 취하고 k 항을 S에 추가합니다 .

온라인으로 사용해보십시오!

작동 원리

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 바이트

{{(_j-j}j}

CJam의 경우 이것은 매우 잘 수행됩니다 (05ab1e를 능가합니다!).

이것은 i n스택 의 형식 으로 입력을 예상하는 익명 블록입니다 . 여기서 i순서의 색인 n은 시작 번호의 배열입니다.

이것이 잘 작동하는 이유 j는 일련의 시작 값에서 메모 된 재귀를 제공 하는 연산자 때문입니다 .

설명:

{    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

자바 (8), 60 바이트

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

두 개의 입력 (정수 배열 a및 정수 n)을 n취하여 시퀀스 의 '번째 값을 출력합니다 .

설명:

여기에서 시도하십시오. (몇 초가 걸릴 수 있습니다.)

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 바이트

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

입력을 공백으로 구분 된 문자열로 예상하고 무기한 출력을 유지합니다. 매우 간단한 구현

예제 실행 :

$ 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 바이트

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

온라인으로 사용해보십시오!


b[(j-1)-...]와 같지 b[~-j-...]않습니까?
Jonathan Frech

에서 당신은 삼항을 취소 할 수 있습니다 j>=a.lengthj<a.length바이트를 저장 : j<a.length?a[j]:b[~-j-b[j-1]]. 또한 궁금합니다. 챌린지 설명 자체에 설명 된 재귀 적 접근 방식 이 60 바이트 일 때 왜 루프 접근 방식 을 사용 했습니까?
Kevin Cruijssen

나는 메소드와 AFAIK로 대답하고 싶지 않다. 자기 참조 기능은 완전한 프로그램 응답이 필요하다
Roberto Graham

@RobertoGraham 아니요, 재귀 메서드는 람다가 될 수 없으므로 Java 7 스타일 메서드 여야합니다. 그러나 여전히 전체 프로그램 대신 (자바 7 스타일) 메소드를 게시 할 수 있습니다.
Kevin Cruijssen

@KevinCruijssen 나는 BiFunction에 당신의 답변을 만들었습니다, 온라인으로보십시오! . 가능하지만 Main
Roberto Graham

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.