İşaretçi atlama


21

Biz dizi olduğunu varsayalım uzunluğu "süreci: dizideki bir konuma işaret işaretçilerle işaretçi atlama konuma için noktalarına işaretçi her işaretçi ayarlayacaktır".psn

Bu zorluğun amacı için bir işaretçi, dizinin bir elemanının (sıfır temelli) dizinidir; bu, dizideki her elemanın eşit veya daha büyük ve küçük olacağı anlamına gelir . Bu gösterim kullanılarak işlem şu şekilde formüle edilebilir:0n

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

Bu, (bu zorluk için) işaretçilerin sırayla yerinde (yani ilk önce düşük endekslerde) güncellendiği anlamına gelir.

Örnek

Bir örnek üzerinde çalışalım, :ps = [2,1,4,1,3,2]

i = 0:pozisyondaki eleman ps [0] = 2 noktalar 4ps = [4,1,4,1,3,2]i = 1:pozisyondaki eleman ps [1] = 1 noktalar 1ps = [4,1,4,1,3,2]i = 2:pozisyondaki eleman ps [2] = 4 noktalar 3ps = [4,1,3,1,3,2]i = 3:pozisyondaki eleman ps [3] = 1 noktalar 1ps = [4,1,3,1,3,2]i = 4:pozisyondaki eleman ps [4] = 3 noktalar 1ps = [4,1,3,1,1,2]i = 5:pozisyondaki eleman ps [5] = 2 noktalar 3ps = [4,1,3,1,1,3]

Böylece bir " işaretçi atlama " yinelemesinden sonra dizisini .[4,1,3,1,1,3]

Meydan okuma

İndeksleri olan bir dizi göz önüne alındığında, dizi artık değişmeyene kadar yukarıda açıklanan işaretçi zıplamasını yineleyerek elde edilen dizi.

kurallar

Programınız / fonksiyonunuz aynı tip bir liste / vektör / dizi vb. Alır ve verir / verir.

  • boş olmadığı garantilidir ve
  • sadece girişleri içerdiği garanti edilir .0p<n

Çeşitler: seçebilirsiniz

  • 1 tabanlı dizinlemeyi kullanmak veya
  • Gerçek işaretçiler kullanmak,

bununla birlikte gönderiminizde bunu belirtmelisiniz.

Test durumları

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


Uzunluğu nek girdi olarak kabul etmemize izin var mı?
Kevin Cruijssen

2
@KevinCruijssen, bu meta tartışmaya bakın .
Shaggy,

Girişlerin sırayla güncellenmesi gerekmesi çok kötü; Aynı anda güncellenebilselerdi, Mathematica 21 karakterlik bir çözüme sahip olacaktı #[[#]]&~FixedPoint~#&.
Greg Martin

Yanıtlar:



6

Haskell, 56 bayt

foldr(\_->([]#))=<<id
x#a@(b:c)=(x++[(x++a)!!b])#c
x#_=x

Haskell ve yerinde güncellemeler kötü bir eşleşmedir.

Çevrimiçi deneyin!




5

Swift , 68 53 bayt

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

Çevrimiçi deneyin!

-15 BMO sayesinde


2
PPCG'ye Hoşgeldiniz! Swift'i bilmiyorum, ama codegolf'da. Yani bu 53 bayt olabilir (saymaya gerek yok f=). Burada kaldınız!
ბიმო

Cevabımı güncellemek için kullandığım karşılama ve tavsiyeler için teşekkür ederiz.
Sean

Kısaltmak mapyerine kullanmaya ne dersiniz forEach?
jaeyong

4

JavaScript (ES6), 41 bayt

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

Çevrimiçi deneyin!


Gah! Bu zorluğun gönderilmesini bekliyordum, böylece aynı çözümü sunabiliyorum: \ Ninja becerilerini becer! : p
Shaggy

2
@ shaggy 🐱‍👤 (bunun bir Ninja Kedisi olması bekleniyor ... ama muhtemelen her yerde desteklenmiyor)
Arnauld


4

Japt, 15 13 7 bayt

Orijinal giriş dizisini değiştirir.

££hYXgU

Deneyin (değiştirilen girişi konsola yazmak için ek baytlar)

££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 bayt

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

Girdileri kaydetmek için yenisini döndürmek yerine girdi dizisini değiştirir.

length2

Çevrimiçi deneyin.

Açıklama:

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 bayt


®
£hYUgX
eV ?U:ß

Tüm test durumlarını deneyin

Bu, daha kısa olması gerektiğini hissediyor, ancak ne yazık ki, benim ilk düşüncem UmgUişe yaramadı çünkü her biri , her adımda değiştirmek yerine gorijinali görüyor U. Farklı bileşenlerin uygun bir şekilde korunması, bir avuç bayt için de maliyetlidir.

Açıklama:

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

Kuralları okumak için @digEmAll sayesinde -2 bayt.

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

Çevrimiçi deneyin!

1 endeksli.

n Giriş dizisinin uzunluğu.

rep(1:n,n)1:n nzamanları çoğaltır (örn. n=3 => 1,2,3,1,2,3,1,2,3)

Dizi nzamanları arasında dolaşın . Kararlı durum o zamana kadar kesin olarak sağlanacaktır, aslında n-1'inin sonunda sanırım. Prova okuyucuya bırakılmıştır.


1
+11-tabanlı girdiyi kaldırabileceğinizi ve basitçe alabileceğinizi düşünüyorum , post durumları: 1-tabanlı indekslemeyi kullanmayı seçebilirsiniz
digEmAll

-4 scan()girişi için geçiş yaparak . scan()Çözümlerimin kalitesiz olduğunu her zaman hissediyorum , bu yüzden atamak xve nbirlikte çalışmak için daha kısa bir yoldan uzak durun : n=length(x<-scan());for(i in rep(1:n,n))x[i]=x[x[i]];x Çevrimiçi deneyin!
CriminallyVulgar



2

Clojure , 136 bayt

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

Çevrimiçi deneyin!


Merhaba ve PPCG'ye hoş geldiniz. Çözümünüzü kolayca doğrulayabilmeniz için bir çevrimiçi tercümana bağlantı vermeniz mümkün mü? Ayrıca, olabilir loop [olmazlar loop[?
Jonathan Frech

1
En son düzenleme gerektiğini Test hatalarını düzeltmek. Rahatsızlıktan dolayı üzgünüm millet.
Ethan McCue

1

Perl 5, 35 34 26 bayt

yakınsaklığın en fazla sayıdaki yineleme sayısı için erişilebileceği gerçeğini kullanarak

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

26 bayt

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

34 bayt

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

35 bayt



1

Kömür , 16 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Maalesef, tüm normal haritalama işlevleri sadece dizinin bir kopyası üzerinde çalışır, sonuçta sadece öğeleri atlamak yerine öğelere izin verirler, bu nedenle kodun her şeyi manuel olarak yapması gerekir. Açıklama:

Fθ

Her bir eleman için iç çevrimi bir kez tekrarlayın. Bu sadece sonucun stabilize olmasını sağlar.

FLθ

Dizi endeksleri üzerinden döngü.

§≔θκ§θ§θκ

Dizi öğesini geçerli dizinde bulun, diziyi dizine eklemek için kullanın ve geçerli öğeyi bu değerle değiştirin.

Iθ

Öğeleri dizeye dönüştürün ve her birini kendi satırlarına örtülü olarak yazdırın.


1

F #, 74 73 bayt

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

Özel birşey yok. Diğer cevaplarda görülen modül fikrini kullanır.


1

K, 27 Bayt

{{@[x;y;:;x x y]}/[x;!#x]}/
  • {..}/ lambda {..} 'ı arg üzerinde uygular (yakınsamaya kadar)

  • dış lambda içinde:

    • {..}/[x;y]lambda'yı yinelemeli x üzerine uygular (her yinelemede güncellenir) ve y öğesi (y bir değer listesidir ve her yinelemede bir öğe kullanır). Bu durumda arg y 'dır !#x(til sayısı x, yani dizinin indeksleridir).

    • @[x;y;:;x x y] x dizisini değiştir (y dizininde x [x [y]] ata)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.