EDIT ::
Hey quindi risulta che ci sono troppe iterazioni in corso. Nessun loop, nessuna diramazione.
Funziona ancora con n negativo per rotazione a destra e n positivo per rotazione a sinistra per qualsiasi dimensione n, senza mutazione
function rotate(A,n,l=A.length) {
const offset = (((n % l) + l) %l)
return A.slice(offset).concat(A.slice(0,offset))
}
Ecco la versione da golf in codice per le risatine
const r = (A,n,l=A.length,i=((n%l)+l)%l)=>A.slice(i).concat(A.slice(0,i))
EDIT1 :: *
Implementazione senza rami e senza mutazioni.
Quindi hey, risulta che avevo un ramo in cui non ne avevo bisogno. Ecco una soluzione funzionante. num negativo = ruota a destra di | num | num positivo = rotazione a sinistra di num
function r(A,n,l=A.length) {
return A.map((x,i,a) => A[(((n+i)%l) + l) % l])
}
L'equazione ((n%l) + l) % l
mappa esattamente numeri positivi e negativi di qualsiasi valore arbitrariamente grande di n
ORIGINALE
Ruota a sinistra ea destra. Ruota a sinistra con il positivo n
, ruota a destra con il negativo n
.
Funziona per input oscenamente grandi di n
.
Nessuna modalità di mutazione. Troppa mutazione in queste risposte.
Inoltre, meno operazioni rispetto alla maggior parte delle risposte. Nessun pop, nessuna spinta, nessuna giunzione, nessuno spostamento.
const rotate = (A, num ) => {
return A.map((x,i,a) => {
const n = num + i
return n < 0
? A[(((n % A.length) + A.length) % A.length)]
: n < A.length
? A[n]
: A[n % A.length]
})
}
o
const rotate = (A, num) => A.map((x,i,a, n = num + i) =>
n < 0
? A[(((n % A.length) + A.length) % A.length)]
: n < A.length
? A[n]
: A[n % A.length])
rotate([...Array(5000).keys()],4101)
rotate([...Array(5000).keys()],-4101000)
[...Array(5000).keys()].forEach((x,i,a) => {
console.log(rotate(a,-i)[0])
})
[...Array(5000).keys()].forEach((x,i,a) => {
console.log(rotate(a,i*2)[0])
})
Spiegazione:
mappare ogni indice di A al valore all'offset dell'indice. In questo caso
offset = num
se offset < 0
allora offset + index + positive length of A
punterà all'offset inverso.
se offset > 0 and offset < length of A
quindi mappare semplicemente l'indice corrente all'indice di offset di A.
Altrimenti, modulo l'offset e la lunghezza per mappare l'offset nei limiti dell'array.
Prendiamo ad esempio offset = 4
e offset = -4
.
Quando offset = -4
, e A = [1,2,3,4,5]
, per ogni indice, offset + index
ridurranno la grandezza (o Math.abs(offset)
).
Spieghiamo prima il calcolo per l'indice di n negativo. A[(((n % A.length) + A.length) % A.length)+0]
e sono stato intimidito. Non esserlo. Mi ci sono voluti 3 minuti in una replica per risolverlo.
- Sappiamo che
n
è negativo perché il caso lo è n < 0
. Se il numero è maggiore dell'intervallo dell'array, n % A.length
lo mapperà nell'intervallo.
n + A.length
aggiungere quel numero a A.length
per compensare n l'importo corretto.
- Sappiamo che
n
è negativo perché il caso lo è n < 0
. n + A.length
aggiungere quel numero a A.length
per compensare n l'importo corretto.
Avanti Mappalo all'intervallo della lunghezza di A usando modulo. Il secondo modulo è necessario per mappare il risultato del calcolo in un intervallo indicizzabile
Primo indice: -4 + 0 = -4. A.length = 5. A.length - 4 = 1. A 2 è 2. Indice mappa da 0 a 2.[2,... ]
- Indice successivo, -4 + 1 = -3. 5 + -3 = 2. A 2 è 3. Indice mappa da 1 a 3.
[2,3... ]
- Eccetera.
Lo stesso processo si applica a offset = 4
. Quando offset = -4
e A = [1,2,3,4,5]
, per ogni indice, offset + index
aumenteranno la grandezza.
4 + 0 = 0
. Associare A [0] al valore in A [4].[5...]
4 + 1 = 5
, 5 è fuori dai limiti durante l'indicizzazione, quindi mappare A 2 al valore al resto di 5 / 5
, che è 0. A 2 = valore in A [0].[5,1...]
- ripetere.
months[new Date().getMonth()]
per ottenere il nome del mese corrente?