EDITAR ::
Oye, resulta que hay demasiada iteración. Sin bucles, sin ramificaciones.
Todavía funciona con n negativo para la rotación a la derecha y n positivo para la rotación a la izquierda para cualquier tamaño n, sin mutaciones
function rotate(A,n,l=A.length) {
const offset = (((n % l) + l) %l)
return A.slice(offset).concat(A.slice(0,offset))
}
Aquí está la versión de código de golf para risitas
const r = (A,n,l=A.length,i=((n%l)+l)%l)=>A.slice(i).concat(A.slice(0,i))
EDIT1 :: *
Implementación sin ramificaciones, sin mutaciones.
Bueno, resulta que tenía una sucursal donde no la necesitaba. Aquí hay una solución funcional. num negativo = girar a la derecha por | num | num positivo = izquierda rota en num
function r(A,n,l=A.length) {
return A.map((x,i,a) => A[(((n+i)%l) + l) % l])
}
La ecuación ((n%l) + l) % lmapea exactamente números positivos y negativos de cualquier valor arbitrariamente grande de n
ORIGINAL
Gire a la izquierda y a la derecha. Gire a la izquierda con positivo n, gire a la derecha con negativo n.
Funciona para entradas obscenamente grandes de n.
Sin modo de mutación. Demasiada mutación en estas respuestas.
Además, menos operaciones que la mayoría de las respuestas. Sin pop, sin empuje, sin empalmes, sin cambios.
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])
})
Explicación:
mapee cada índice de A al valor en el desplazamiento del índice. En este caso
offset = num
si el offset < 0entonces offset + index + positive length of Aapuntará al desplazamiento inverso.
si offset > 0 and offset < length of Aentonces simplemente mapee el índice actual al índice de desplazamiento de A.
De lo contrario, module el desplazamiento y la longitud para asignar el desplazamiento en los límites de la matriz.
Tomemos, por ejemplo, offset = 4y offset = -4.
Cuándo offset = -4, y A = [1,2,3,4,5], para cada índice, offset + indexhará que la magnitud (o Math.abs(offset)) sea menor.
Primero expliquemos el cálculo del índice de n negativo. A[(((n % A.length) + A.length) % A.length)+0]y ha sido intimidado. No lo estés. Me tomó 3 minutos en una respuesta para resolverlo.
- Sabemos que
nes negativo porque el caso lo es n < 0. Si el número es mayor que el rango de la matriz, n % A.lengthlo mapeará en el rango.
n + A.lengthsume ese número para A.lengthcompensar n la cantidad correcta.
- Sabemos que
nes negativo porque el caso lo es n < 0. n + A.lengthagrega ese número aA.length compensar n la cantidad correcta.
Siguiente Asignelo al rango de la longitud de A usando módulo. El segundo módulo es necesario para mapear el resultado del cálculo en un rango indexable

Primer índice: -4 + 0 = -4. A.length = 5. A.length - 4 = 1. A 2 es 2. Índice de mapa de 0 a 2.[2,... ]
- Siguiente índice, -4 + 1 = -3. 5 + -3 = 2. A 2 es 3. Mapa del índice 1 a 3.
[2,3... ]
- Etc.
El mismo proceso se aplica a offset = 4. Cuándo offset = -4, y A = [1,2,3,4,5], para cada índice, offset + indexaumentará la magnitud.
4 + 0 = 0. Asigne A [0] al valor en A [4].[5...]
4 + 1 = 5, 5 está fuera de los límites al indexar, por lo tanto, asigne A 2 al valor en el resto de 5 / 5, que es 0. A 2 = valor en A [0].[5,1...]
- repetir.
months[new Date().getMonth()]para obtener el nombre del mes actual?