Misalkan kita memiliki array dengan panjang dengan pointer yang menunjuk ke beberapa lokasi dalam array: Proses " pointer jumping " akan mengatur setiap pointer ke lokasi pointer menunjuk ke poin.
Untuk tujuan tantangan ini, penunjuk adalah indeks (berbasis nol) dari elemen array, ini menyiratkan bahwa setiap elemen dalam array akan lebih besar atau sama dengan dan kurang dari . Dengan menggunakan notasi ini prosesnya dapat dirumuskan sebagai berikut:
for i = 0..(n-1) {
ps[i] = ps[ps[i]]
}
Ini berarti (untuk tantangan ini) bahwa pointer diperbarui di tempat dalam urutan berurutan (mis. Indeks lebih rendah terlebih dahulu).
Contoh
Mari kita bekerja melalui sebuah contoh, :
Jadi setelah satu iterasi " pointer jumping " kita mendapatkan array .
Tantangan
Diberikan array dengan indeks output array yang diperoleh dengan mengulangi lompatan pointer yang dijelaskan di atas sampai array tidak berubah lagi.
Aturan
Program / fungsi Anda akan mengambil dan mengembalikan / menampilkan jenis yang sama, daftar / vektor / array dll
- dijamin tidak kosong dan
- dijamin hanya mengandung entri .
Varian: Anda dapat memilih
- untuk menggunakan pengindeksan berbasis 1 atau
- gunakan pointer aktual,
namun Anda harus menyebutkan ini dalam kiriman Anda.
Uji kasus
[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
sebagai input tambahan?#[[#]]&~FixedPoint~#&
.Jawaban:
JavaScript, 36 byte
Memodifikasi array input asli.
Cobalah online
sumber
Haskell, 56 byte
Pembaruan Haskell dan di tempat adalah pertandingan yang buruk.
Cobalah online!
sumber
Python 2 , 53 byte
Cobalah online!
-6 terima kasih kepada HyperNeutrino .
Mengubah
l
hasil di tempat.sumber
C ++ 14 (gcc) , 61 byte
Sebagai lambda generik yang tidak disebutkan namanya. Membutuhkan wadah berurutan seperti
std::vector
.Cobalah online!
sumber
Swift ,
6853 byteCobalah online!
Terima kasih kepada BMO
sumber
f=
). Nikmati masa tinggal Anda di sini!map
bukannyaforEach
membuatnya lebih pendek?JavaScript (ES6), 41 byte
Cobalah online!
sumber
05AB1E (warisan) , 8 byte
Cobalah online!
Penjelasan
05AB1E , 14 byte
Cobalah online!
sumber
Japt,
15137 byteMemodifikasi array input asli.
Cobalah (byte tambahan adalah untuk menulis input yang dimodifikasi ke konsol)
sumber
Java 8,
10554 byteMemodifikasi array input alih-alih mengembalikan yang baru untuk menghemat byte.
Cobalah online.
Penjelasan:
sumber
Japt , 17 byte
Coba semua uji kasus
Ini terasa seperti itu harus lebih pendek, tetapi sayangnya pemikiran awal saya
UmgU
tidak berfungsi karena masing-masingg
mengakses yang asliU
daripada mengubahnya pada setiap langkah. Mempertahankan komponen-komponen berbeda dengan tepat membutuhkan biaya beberapa byte juga.Penjelasan:
sumber
C (dentang) , 32-bit,
4944 byteCobalah online!
Menggunakan pointer.
5045 byte dengan integer:Cobalah online!
sumber
Ruby ,
3734 byteCobalah online!
Kembali dengan memodifikasi array input di tempat.
sumber
Merah , 63 byte
Cobalah online!
Memodifikasi array di tempat
sumber
R ,
6058 byte-2 byte terima kasih kepada @digEmAll untuk membaca aturannya.
Cobalah online!
1-diindeks.
n
adalah panjang dari array input.rep(1:n,n)
ulangan1:n
n
kali (misalnyan=3 => 1,2,3,1,2,3,1,2,3
)Loop melalui waktu array
n
. Keadaan mantap akan tercapai pada saat itu pasti, bahkan pada akhir waktu n-1 sampai saya pikir. Buktinya diserahkan kepada pembaca.sumber
+1
dan hanya mengambil input berbasis 1, pos menyatakan: Anda dapat memilih untuk menggunakan pengindeksan berbasis 1scan()
untuk input. Saya selalu merasascan()
solusi saya tidak optimal, jadi awasi cara yang lebih pendek untuk menetapkanx
dann
bersama - sama:n=length(x<-scan());for(i in rep(1:n,n))x[i]=x[x[i]];x
Cobalah secara online!Common Lisp,
5958 byteCobalah online!
sumber
Bersih , 80 byte
Cobalah online!
sumber
Clojure , 136 byte
Cobalah online!
sumber
loop [
tidak bisa menjadiloop[
?Perl 5,
353426 bytemenggunakan fakta bahwa konvergensi mencapai paling banyak untuk jumlah ukuran iterasi
26 byte
34 byte
35 byte
sumber
Clojure , 88 byte
Cobalah online!
sumber
Arang , 16 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sayangnya semua fungsi pemetaan yang biasa hanya beroperasi pada salinan array dengan hasilnya adalah mereka hanya mengijinkan elemen daripada melompat, sehingga kode harus melakukan semuanya secara manual. Penjelasan:
Ulangi loop dalam sekali untuk setiap elemen. Ini hanya memastikan bahwa hasilnya stabil.
Lewati indeks array.
Dapatkan elemen array di indeks saat ini, gunakan itu untuk mengindeks ke dalam array, dan ganti elemen saat ini dengan nilai itu.
Keluarkan elemen ke string dan cetak masing-masing secara tersirat pada baris mereka sendiri.
sumber
F #,
7473 byteTidak ada yang spesial. Menggunakan ide modulus yang terlihat pada jawaban lain.
sumber
K, 27 Bytes
{..}/
berlaku lambda {..} di atas arg (hingga konvergensi)di dalam lambda luar:
{..}/[x;y]
berlaku lambda secara berulang lebih dari x (diperbarui pada setiap iterasi) dan item y (y adalah daftar nilai, dan menggunakan item pada setiap iterasi). Dalam hal ini arg y adalah!#x
(til hitung x, yaitu indeks array)@[x;y;:;x x y]
ubah array x (pada indeks y tetapkan x [x [y]])sumber
APL (Dyalog Unicode) , 26 byte SBCS
Membutuhkan
⎕IO←0
Cobalah online!
sumber