Con trỏ nhảy


21

Giả sử chúng ta có một mảng có độ dài với các con trỏ trỏ đến một số vị trí trong mảng: Quá trình " nhảy con trỏ " sẽ đặt mọi con trỏ tới vị trí mà con trỏ trỏ tới.psn

Với mục đích của thử thách này, một con trỏ là chỉ số (dựa trên zero) của một phần tử của mảng, điều này ngụ ý rằng mọi phần tử trong mảng sẽ lớn hơn hoặc bằng và nhỏ hơn . Sử dụng ký hiệu này, quy trình có thể được xây dựng như sau:0n

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

Điều này có nghĩa (đối với thách thức này) rằng các con trỏ được cập nhật tại chỗ theo thứ tự liên tiếp (nghĩa là các chỉ số thấp hơn trước).

Thí dụ

Chúng ta hãy làm việc qua một ví dụ, :ps = [2,1,4,1,3,2]

i = 0:the element at position ps[0] = 2 points to 4ps = [4,1,4,1,3,2]i = 1:the element at position ps[1] = 1 points to 1ps = [4,1,4,1,3,2]i = 2:the element at position ps[2] = 4 points to 3ps = [4,1,3,1,3,2]i = 3:the element at position ps[3] = 1 points to 1ps = [4,1,3,1,3,2]i = 4:the element at position ps[4] = 3 points to 1ps = [4,1,3,1,1,2]i = 5:the element at position ps[5] = 2 points to 3ps = [4,1,3,1,1,3]

Vì vậy, sau một lần lặp lại " nhảy con trỏ ", chúng ta sẽ nhận được mảng .[4,1,3,1,1,3]

Thử thách

Đưa ra một mảng với các chỉ số đầu ra, mảng thu được bằng cách lặp lại bước nhảy được mô tả ở trên cho đến khi mảng không thay đổi nữa.

Quy tắc

Chương trình / hàm của bạn sẽ lấy và trả về / xuất cùng loại, một danh sách / vector / mảng, v.v.

  • được đảm bảo không trống và
  • được đảm bảo chỉ chứa các mục .0p<n

Các biến thể: Bạn có thể chọn

  • để sử dụng lập chỉ mục dựa trên 1 hoặc
  • sử dụng con trỏ thực tế,

tuy nhiên bạn nên đề cập đến điều này trong bài nộp của bạn.

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

[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]


Chúng tôi có được phép lấy chiều dài nlàm đầu vào bổ sung không?
Kevin Cruijssen

2
@KevinCruijssen, xem thảo luận meta này .
Xù xì

Thật tệ khi các mục cần được cập nhật liên tục; nếu chúng có thể được cập nhật đồng thời, Mathematica sẽ có giải pháp 21 ký tự #[[#]]&~FixedPoint~#&.
Greg Martin

Câu trả lời:






5

Swift , 68 53 byte

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

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

-15 cảm ơn BMO


2
Chào mừng đến với PPCG! Tôi không biết Swift, nhưng trên codegolf. Mặc định là chấp nhận các hàm lambda đã nhập mà tôi đoán rằng một bao đóng sẽ được tính là. Vì vậy, đây có thể là 53 byte (bạn không cần phải đếm f=). Tận hưởng kì nghỉ của bạn ở đây!
ბიმო

Cảm ơn bạn đã chào đón và lời khuyên mà tôi đã sử dụng để cập nhật câu trả lời của tôi.
Sean

Làm thế nào về việc sử dụng mapthay vì forEachđể làm cho nó ngắn hơn?
jaeyong hát

4

JavaScript (ES6), 41 byte

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

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


Trời ạ! Tôi đã chờ đợi thử thách này được đăng lên để tôi có thể đăng chính xác giải pháp tương tự: \ Chết tiệt kỹ năng ninja của bạn! : p
Xù xì

2
@shaggy (đây được cho là Ninja Ninja ... nhưng có lẽ nó không được hỗ trợ ở mọi nơi)
Arnauld


4

Japt, 15 13 7 byte

Sửa đổi mảng đầu vào ban đầu.

££hYXgU

Hãy thử nó (các byte bổ sung là để ghi đầu vào đã sửa đổi vào bàn điều khiển)

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

4

Java 8, 105 54 byte

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

Sửa đổi mảng đầu vào thay vì trả về một mảng mới để lưu byte.

length2

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

Giải trình:

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 byte


®
£hYUgX
eV ?U:ß

Hãy thử tất cả các trường hợp thử nghiệm

Điều này cảm thấy như nó nên ngắn hơn, nhưng thật không may, suy nghĩ ban đầu của UmgUtôi không hoạt động vì mỗi lần gtruy cập vào bản gốc Uthay vì sửa đổi nó ở mỗi bước. Việc bảo quản các thành phần khác nhau cũng tốn một số byte.

Giải trình:

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

-2 byte nhờ @digEmAll để đọc các quy tắc.

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

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

1 chỉ mục.

n là chiều dài của mảng đầu vào.

rep(1:n,n)nhân rộng 1:n nthời gian (ví dụ n=3 => 1,2,3,1,2,3,1,2,3)

Lặp lại qua các nlần mảng . Tôi chắc chắn sẽ đạt được trạng thái ổn định vào lúc đó, thực tế là vào cuối lần thứ n thông qua tôi nghĩ. Bằng chứng được để lại cho người đọc.


1
Tôi nghĩ rằng bạn có thể xóa +1và chỉ cần lấy đầu vào dựa trên 1, trạng thái bài đăng: Bạn có thể chọn sử dụng lập chỉ mục dựa trên 1
digEmAll

-4 bằng cách chuyển sang scan()đầu vào. Tôi luôn cảm thấy scan()các giải pháp của mình là tối ưu, vì vậy hãy theo dõi một cách ngắn hơn để phân công xncùng nhau: n=length(x<-scan());for(i in rep(1:n,n))x[i]=x[x[i]];x Hãy thử trực tuyến!
CriminallyVulgar



2

Clojure , 136 byte

(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))))))

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


Xin chào và chào mừng đến với PPCG. Bạn có thể cung cấp một liên kết đến một thông dịch viên trực tuyến để người ta có thể dễ dàng xác minh giải pháp của bạn không? Hơn nữa, loop [không thể trở thành loop[?
Jonathan Frech

1
Bản chỉnh sửa gần đây nhất sẽ sửa các lỗi kiểm tra. Xin lỗi vì sự bất tiện của mọi người.
Ethan McCue

1

Perl 5, 35 34 26 byte

sử dụng thực tế là sự hội tụ đạt được nhiều nhất cho số lần lặp kích thước

$_=$F[$_]for@F x@F;$_="@F"

26 byte

$_=$F[$_]for@F;/@F/ or$_="@F",redo

34 byte

$_=$F[$_]for@F;$_="@F",redo if!/@F/

35 byte



1

Than , 16 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Đáng buồn thay, tất cả các hàm ánh xạ thông thường chỉ hoạt động trên một bản sao của mảng với kết quả là chúng chỉ hoán vị các phần tử chứ không phải nhảy chúng, vì vậy mã phải làm mọi thứ bằng tay. Giải trình:

Fθ

Lặp lại vòng lặp bên trong một lần cho mỗi phần tử. Điều này chỉ đảm bảo rằng kết quả ổn định.

FLθ

Lặp lại các chỉ số mảng.

§≔θκ§θ§θκ

Lấy phần tử mảng tại chỉ mục hiện tại, sử dụng phần tử đó để lập chỉ mục vào mảng và thay thế phần tử hiện tại bằng giá trị đó.

Iθ

Truyền các phần tử thành chuỗi và in ngầm từng dòng trên dòng riêng của chúng.


1

F #, 74 73 byte

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

Không có gì đặc biệt. Sử dụng ý tưởng mô-đun nhìn thấy trong các câu trả lời khác.


1

K, 27 byte

{{@[x;y;:;x x y]}/[x;!#x]}/
  • {..}/ áp dụng lambda {..} trên arg (cho đến khi hội tụ)

  • bên trong lambda bên ngoài:

    • {..}/[x;y]áp dụng lambda lặp đi lặp lại trên x (được cập nhật ở mỗi lần lặp) và một mục của y (y là danh sách các giá trị và sử dụng một mục ở mỗi lần lặp). Trong trường hợp này arg y là !#x(til Count x, nghĩa là các chỉ mục của mảng)

    • @[x;y;:;x x y] sửa đổi mảng x (tại chỉ mục y gán x [x [y]])


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.