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) % lmappa 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 < 0allora offset + index + positive length of Apunterà all'offset inverso.
se offset > 0 and offset < length of Aquindi 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 = 4e offset = -4.
Quando offset = -4, e A = [1,2,3,4,5], per ogni indice, offset + indexridurranno 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.lengthlo mapperà nell'intervallo.
n + A.lengthaggiungere quel numero a A.lengthper compensare n l'importo corretto.
- Sappiamo che
nè negativo perché il caso lo è n < 0. n + A.lengthaggiungere quel numero a A.lengthper 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 = -4e A = [1,2,3,4,5], per ogni indice, offset + indexaumenteranno 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?