Puntatore che salta


21

Supponiamo di avere un array di lunghezza con puntatori che indicano una posizione nell'array: il processo di " salto del puntatore " imposterà ogni puntatore sulla posizione a cui punta il puntatore.psn

Ai fini di questa sfida un puntatore è l'indice (a base zero) di un elemento dell'array, ciò implica che ogni elemento dell'array sarà maggiore o uguale a e minore di . Usando questa notazione il processo può essere formulato come segue:0n

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

Ciò significa (per questa sfida) che i puntatori vengono aggiornati sul posto in ordine sequenziale (cioè prima gli indici inferiori).

Esempio

Analizziamo un esempio, :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]

Quindi dopo una ripetizione di " puntatore che salta " otteniamo l'array .[4,1,3,1,1,3]

Sfida

Dato un array con indici in uscita, l'array ottenuto ripetendo il puntatore sopra descritto saltando fino a quando l'array non cambia più.

Regole

Il tuo programma / funzione prenderà e restituirà / emetterà lo stesso tipo, un elenco / vettore / matrice ecc. Quale

  • è garantito per essere non vuoto e
  • è garantito che contenga solo voci .0p<n

Varianti: puoi scegliere

  • per utilizzare l'indicizzazione basata su 1 o
  • utilizzare puntatori effettivi,

tuttavia dovresti menzionarlo nella tua richiesta.

Casi test

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


Ci è permesso di prendere la lunghezza ncome input aggiuntivo?
Kevin Cruijssen,

2
@KevinCruijssen, vedi questa meta discussione .
Shaggy

Peccato che le voci debbano essere aggiornate in sequenza; se potessero essere aggiornati contemporaneamente, Mathematica avrebbe la soluzione a 21 caratteri #[[#]]&~FixedPoint~#&.
Greg Martin,

Risposte:






5

Rapido , 68 53 byte

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

Provalo online!

-15 grazie a BMO


2
Benvenuti in PPCG! Non conosco Swift, ma su codegolf.SE il valore predefinito è accettare funzioni lambda digitate che immagino che una chiusura conterebbe. Quindi questo può essere 53 byte (non è necessario contare f=). Goditi il ​​tuo soggiorno qui!
ბიმო

Grazie per l'accoglienza e i consigli che ho usato per aggiornare la mia risposta.
Sean,

Che ne dici di usare mapinvece di forEachrenderlo più breve?
Jaeyong ha cantato il

4

JavaScript (ES6), 41 byte

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

Provalo online!


Gah! Stavo aspettando che questa sfida fosse pubblicata in modo da poter pubblicare la stessa identica soluzione: \ Accidenti alle tue abilità ninja! : p
Shaggy,

2
@shaggy 🐱‍👤 (dovrebbe essere un Ninja Cat ... ma probabilmente non è supportato ovunque)
Arnauld

4

05AB1E (legacy) , 8 byte

ΔDvDyèNǝ

Provalo online!

Spiegazione

Δ          # apply until the top of the stack stops changing
 D         # duplicate current list
  v        # for each (element y, index N) in the list
   Dyè     # get the element at index y
      Nǝ   # and insert it at index N

05AB1E , 14 byte

[D©vDyèNǝ}D®Q#

Provalo online!


4

Japt, 15 13 7 byte

Modifica l'array di input originale.

££hYXgU

Provalo (byte aggiuntivi devono scrivere l'input modificato sulla console)

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

Modifica l'input-array invece di restituirne uno nuovo per salvare i byte.

length2

Provalo online.

Spiegazione:

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:ß

Prova tutti i casi di test

Sembra che dovrebbe essere più breve, ma sfortunatamente il mio pensiero iniziale UmgUnon funziona perché ognuno gaccede all'originale Upiuttosto che modificarlo ad ogni passaggio. Anche la conservazione di diversi componenti ha un costo adeguato per una manciata di byte.

Spiegazione:

           #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 grazie a @digEmAll per la lettura delle regole.

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

Provalo online!

1-indicizzati.

n è la lunghezza dell'array di input.

rep(1:n,n)replica i 1:n ntempi (ad es. n=3 => 1,2,3,1,2,3,1,2,3)

Passa attraverso i ntempi dell'array . Lo stato stazionario sarà sicuramente raggiunto da allora, in effetti entro la fine della n-1a volta, credo. La prova è lasciata al lettore.


1
Penso che puoi rimuovere +1e prendere semplicemente l'input basato su 1, afferma il post: Puoi scegliere di utilizzare l'indicizzazione basata su 1
digEmAll

-4 passando a scan()per l'ingresso. Ho sempre la sensazione che le mie scan()soluzioni non siano ottimali, quindi tieni d'occhio un modo più breve di assegnare xe ninsieme: n=length(x<-scan());for(i in rep(1:n,n))x[i]=x[x[i]];x provalo online!
CriminalmenteVolgar



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

Provalo online!


Ciao e benvenuto in PPCG. Sarebbe possibile per te fornire un link a un interprete online in modo tale da poter verificare facilmente la tua soluzione? Inoltre, loop [non può diventare loop[?
Jonathan Frech,

1
La modifica più recente dovrebbe correggere gli errori del test. Ci scusiamo per l'inconveniente a tutti.
Ethan McCue,

1

Perl 5, 35 34 26 byte

utilizzando il fatto che la convergenza è al massimo per il numero di dimensioni delle iterazioni

$_=$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

Carbone , 16 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Purtroppo tutte le consuete funzioni di mappatura funzionano solo su una copia dell'array con il risultato che permutano gli elementi invece di saltarli, quindi il codice deve fare tutto manualmente. Spiegazione:

Fθ

Ripeti il ​​ciclo interno una volta per ogni elemento. Questo garantisce solo che il risultato si stabilizzi.

FLθ

Passa sopra gli indici dell'array.

§≔θκ§θ§θκ

Ottieni l'elemento dell'array nell'indice corrente, usalo per indicizzarlo nell'array e sostituisci l'elemento corrente con quel valore.

Iθ

Trasmetti gli elementi in stringa e stampa implicitamente ciascuno sulla propria riga.


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

Niente di speciale. Utilizza l'idea del modulo vista in altre risposte.


1

K, 27 byte

{{@[x;y;:;x x y]}/[x;!#x]}/
  • {..}/ applica lambda {..} su arg (fino alla convergenza)

  • all'interno della lambda esterna:

    • {..}/[x;y]applica lambda in modo iterativo su x (aggiornato ad ogni iterazione) e un elemento di y (y è un elenco di valori e utilizza un elemento ad ogni iterazione). In questo caso arg y è !#x(fino al conteggio x, ovvero gli indici dell'array)

    • @[x;y;:;x x y] modifica array x (all'indice y assegna x [x [y]])


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.