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) % l
mapea 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 < 0
entonces offset + index + positive length of A
apuntará al desplazamiento inverso.
si offset > 0 and offset < length of A
entonces 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 = 4
y offset = -4
.
Cuándo offset = -4
, y A = [1,2,3,4,5]
, para cada índice, offset + index
hará 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
n
es negativo porque el caso lo es n < 0
. Si el número es mayor que el rango de la matriz, n % A.length
lo mapeará en el rango.
n + A.length
sume ese número para A.length
compensar n la cantidad correcta.
- Sabemos que
n
es negativo porque el caso lo es n < 0
. n + A.length
agrega 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 + index
aumentará 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?