포인터 점프


21

포인터가 배열의 특정 위치를 가리키는 길이 의 배열 가 있다고 가정 합니다. " 포인터 점프 " 프로세스는 포인터가 가리키는 위치에 모든 포인터를 설정합니다.추신

이 문제를 해결하기 위해 포인터는 배열 요소의 인덱스 (0부터 시작)이며 배열의 모든 요소는 보다 크거나 같고 보다 작습니다 . 이 표기법을 사용하여 다음과 같이 프로세스를 공식화 할 수 있습니다.0

for i = 0..(n-1) {
  ps[i] = ps[ps[i]]
}

이것은 (이 도전 과제에서) 포인터가 순차적으로 순서대로 업데이트된다는 것을 의미합니다 (즉, 먼저 낮은 지수).

예제를 살펴 보겠습니다 .ps = [2,1,4,1,3,2]

나는 = 0:위치에있는 요소 ps [0] = 2 ~에 중점을 두다 4ps = [4,1,4,1,3,2]나는 = 1:위치에있는 요소 ps [1] = 1 ~에 중점을 두다 1ps = [4,1,4,1,3,2]나는 = 2:위치에있는 요소 ps [2] = 4 ~에 중점을 두다 ps = [4,1,3,1,3,2]나는 = 3:위치에있는 요소 ps [3] = 1 ~에 중점을 두다 1ps = [4,1,3,1,3,2]나는 = 4:위치에있는 요소 ps [4] = 3 ~에 중점을 두다 1ps = [4,1,3,1,1,2]나는 = 5:위치에있는 요소 ps [5] = 2 ~에 중점을 두다 ps = [4,1,3,1,1,3]

따라서 " 포인터 점프 "를 한 번 반복 하면 배열을 얻게 됩니다.[4,1,3,1,1,3]

도전

인덱스 출력을 가진 배열이 주어지면 배열이 더 이상 변경되지 않을 때까지 위에서 설명한 포인터 점프를 반복하여 얻은 배열.

규칙

프로그램 / 함수는 동일한 유형, 목록 / 벡터 / 배열 등을 가져 와서 출력합니다.

  • 비어 있지 않은 것으로 보장되고
  • 항목 만 포함하도록 보장됩니다 .0<

변형 : 당신은 선택할 수 있습니다

  • 1 기반 인덱싱을 사용하거나
  • 실제 포인터를 사용하십시오.

그러나 당신은 당신의 제출에 이것을 언급해야합니다.

테스트 사례

[0]  [0]
[1,0]  [0,0]
[1,2,3,4,0]  [2,2,2,2,2]
[0,1,1,1,0,3]  [0,1,1,1,0,1]
[4,1,3,0,3,2]  [3,1,3,3,3,3]
[5,1,2,0,4,5,6]  [5,1,2,5,4,5,6]
[9,9,9,2,5,4,4,5,8,1,0,0]  [1,1,1,1,4,4,4,4,8,1,1,1]


길이 n를 추가 입력으로 사용할 수 있습니까?
Kevin Cruijssen

2
@KevinCruijssen, 이 메타 토론을 참조하십시오 .
얽히고 설킨

항목을 순차적으로 업데이트해야하는 것은 너무 나쁩니다. 이들이 동시에 업데이트 될 수 있다면 Mathematica는 21 자 솔루션을 갖습니다 #[[#]]&~FixedPoint~#&.
그렉 마틴

답변:






5

스위프트 , 68 53 바이트

{a in for _ in a{var i=0;a.forEach{a[i]=a[$0];i+=1}}}

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

BMO 덕분에 -15


2
PPCG에 오신 것을 환영합니다! Swift를 모르지만 codegolf.SE에서 기본값은 클로저가 계산되는 유형의 람다 함수를 허용하는 것입니다. 따라서 이것은 53 바이트 일 수 있습니다 (카운트 할 필요는 없습니다 f=). 당신의 체류를 즐기십시오!
იმო

답변을 업데이트하는 데 사용한 환영과 조언에 감사드립니다.

짧게 만드는 map대신 사용 하는 것은 forEach어떻습니까?
재용은

4

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

f=a=>a+''==a.map((x,i)=>a[i]=a[x])?a:f(a)

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


가! 이 챌린지가 게시되기를 기다리고 있었으므로 정확히 동일한 솔루션을 게시 할 수 있습니다. : p
얽히고 설킨

2
@ shaggy 🐱‍👤 (이것은 닌자 고양이로 추정되지만 ... 아마도 모든 곳에서 지원되지는 않습니다)
Arnauld


4

apt, 15 13 7 바이트

원래 입력 배열을 수정합니다.

££hYXgU

시도해보십시오 (추가 바이트는 수정 된 입력을 콘솔에 쓰는 것입니다)

££hYXgU
£           :Map
 £          :  Map each X at index Y
  hY        :    Replace the element at index Y
    XgU     :    With the element at index X

4

자바 8, 105 54 바이트

a->{for(int l=a.length,i=0;i<l*l;)a[i%l]=a[a[i++%l]];}

바이트를 절약하기 위해 새로운 것을 반환하는 대신 입력 배열을 수정합니다.

이자형h2

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

설명:

a->{                // Method with integer-array parameter and no return-type
  int l=a.length,   //  Length of the input-array
  i=0;i<l*l;)       //  Loop `i` in the range [0, length squared):
    a[i%l]=         //   Set the (`i` modulo-length)'th item in the array to:
      a[            //    The `p`'th value of the input-array,
        a[i++%l]];} //    where `p` is the (`i` modulo-length)'th value of the array

3

Japt , 17 바이트


®
£hYUgX
eV ?U:ß

모든 테스트 사례를 시도하십시오

이것은 더 짧아야하는 것처럼 느껴지지만 불행히도 각 단계마다 원본을 수정하지 않고 원본에 액세스 UmgU하기 때문에 초기 생각이 작동하지 않습니다 . 다른 구성 요소를 적절하게 유지하려면 몇 바이트의 비용이 필요합니다.gU

설명:

           #Blank line preserves input in U long enough for the next line

®          #Copy U into V to preserve its original value

£hY        #Modify U in-place by replacing each element X with...
   UgX     #The value from the current U at the index X

eV ?U      #If the modified U is identical to the copy V, output it
     :ß    #Otherwise start again with the modified U as the new input




2

R , 60 58 바이트

규칙을 읽는 @digEmAll 덕분에 -2 바이트.

function(x,n=sum(x|1)){for(i in rep(1:n,n))x[i]=x[x[i]];x}

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

1- 색인.

n 입력 배열의 길이입니다.

rep(1:n,n)복제 된 1:n n시간 (예를 들어 n=3 => 1,2,3,1,2,3,1,2,3)

배열 n시간을 반복합니다. 그때까지 확실히 n-1 시간이 끝날 때까지 꾸준한 상태가 달성 될 것입니다. 증거는 독자에게 맡겨져 있습니다.


1
난 당신이를 제거 할 수 있다고 생각 +1하고 단순히 1 기반 입력 후 상태를 가지고 : 당신은 1 기반 색인을 사용하도록 선택할 수 있습니다
digEmAll

scan()입력 으로 전환하여 -4 저는 항상 scan()솔루션이 차선책이라고 생각 하므로 할당 x하고 n함께 더 짧은 방법을 찾아 n=length(x<-scan());for(i in rep(1:n,n))x[i]=x[x[i]];x 보십시오. 온라인으로 사용해보십시오!
CriminallyVulgar



2

클로저 , 136 바이트

(defn j[a](let[f(fn[a](loop[i 0 a a](if(= i(count a))a(recur(inc i)(assoc a i(a(a i)))))))](loop[p nil a a](if(= p a)a(recur a(f a))))))

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


PPCG에 오신 것을 환영합니다. 솔루션을 쉽게 확인할 수 있도록 온라인 통역사와의 링크를 제공 할 수 있습니까? 또한, 될 수 loop [없습니다 loop[?
Jonathan Frech

1
가장 최근의 편집 테스트 실패를 수정 해야합니다 . 불편을 드려 죄송합니다.
Ethan McCue



1

, 16 바이트

FθFLθ§≔θκ§θ§θκIθ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 슬프게도 모든 일반적인 매핑 함수는 배열의 복사본에서만 작동하므로 결과적으로 요소를 뛰어 넘기지 않고 그대로 퍼뜨 리므로 코드가 모든 것을 수동으로 수행해야합니다. 설명:

Fθ

각 요소에 대해 내부 루프를 한 번 반복하십시오. 이렇게하면 결과가 안정화됩니다.

FLθ

배열 인덱스를 반복합니다.

§≔θκ§θ§θκ

현재 색인에서 배열 요소를 가져 와서 배열로 색인화하고 현재 요소를 해당 값으로 바꿉니다.

Iθ

요소를 문자열로 캐스트하고 각 행을 내재적으로 인쇄하십시오.


1

F #, 74 73 바이트

fun(c:'a[])->let l=c.Length in(for i in 0..l*l do c.[i%l]<-c.[c.[i%l]]);c

특별한 것은 없습니다. 다른 답변에서 볼 수있는 계수 아이디어를 사용합니다.


1

K, 27 바이트

{{@[x;y;:;x x y]}/[x;!#x]}/
  • {..}/ arg에 람다 {..} 적용 (수렴까지)

  • 외부 람다 내부 :

    • {..}/[x;y]x (각 반복에서 업데이트 됨) 및 y 항목 (y는 값 목록이며 각 반복에서 항목을 사용함)에 대해 람다를 반복적으로 적용합니다. 이 경우 arg y는 !#x(카운트 x, 즉 배열의 인덱스까지)

    • @[x;y;:;x x y] 배열 x 수정 (인덱스 y에서 x [x [y]] 할당)


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