EDIT ::
Гей, виявляється, що відбувається занадто багато ітерацій. Ні петель, ні розгалужень.
Досі працює з негативним n для обертання вправо та позитивним n для обертання ліворуч для будь-якого розміру n, без мутації
function rotate(A,n,l=A.length) {
const offset = (((n % l) + l) %l)
return A.slice(offset).concat(A.slice(0,offset))
}
Ось кодова версія гольфу для хихикання
const r = (A,n,l=A.length,i=((n%l)+l)%l)=>A.slice(i).concat(A.slice(0,i))
EDIT1 :: *
Впровадження без розгалуження, без мутацій.
Отже, привіт, виявляється, у мене була гілка, де вона мені не потрібна. Ось робоче рішення. від’ємне число = повернути вправо на | число | додатне число = повернути ліворуч на число
function r(A,n,l=A.length) {
return A.map((x,i,a) => A[(((n+i)%l) + l) % l])
}
Рівняння ((n%l) + l) % l
відображає точно позитивні та негативні числа будь-яких довільно великих значень n
ОРИГІНАЛ
Поворот вліво та вправо. Поверніть ліворуч з позитивним n
, поверніть праворуч з негативним n
.
Працює для нецензурно великих входів n
.
Відсутність режиму мутації. Занадто багато мутацій у цих відповідях.
Крім того, менше операцій, ніж більшість відповідей. Ні поп, ні натиск, ні зрощення, ні зсув.
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]
})
}
або
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])
})
Пояснення:
зіставити кожен індекс A зі значенням зі зміщенням індексу. В цьому випадку
offset = num
якщо offset < 0
тоді offset + index + positive length of A
вкаже на зворотне зміщення.
якщо offset > 0 and offset < length of A
тоді просто відобразити поточний індекс на індекс зміщення А.
В іншому випадку модулюйте зміщення та довжину, щоб відобразити зміщення в межах масиву.
Візьмемо для прикладу offset = 4
і offset = -4
.
Коли offset = -4
, і A = [1,2,3,4,5]
для кожного індексу offset + index
зменшить величину (або Math.abs(offset)
).
Поясніть спочатку розрахунок для індексу від’ємного n. A[(((n % A.length) + A.length) % A.length)+0]
і був заляканий. Не бути. Мені знадобилося 3 хвилини в Repl, щоб це розробити.
- Ми знаємо, що
n
це негативно, тому що справа є n < 0
. Якщо число більше, ніж діапазон масиву, n % A.length
відобразить його в діапазон.
n + A.length
додайте це число, щоб A.length
компенсувати n правильну суму.
- Ми знаємо, що
n
це негативно, тому що справа є n < 0
. n + A.length
додайте це число, щоб A.length
компенсувати n правильну суму.
Далі Покладіть його на діапазон довжини A, використовуючи модуль. Другий модуль необхідний для відображення результату обчислення в індексуваний діапазон
Перший індекс: -4 + 0 = -4. А. довжина = 5. А. довжина - 4 = 1. А 2 дорівнює 2. Індекс карти 0 до 2.[2,... ]
- Наступний індекс, -4 + 1 = -3. 5 + -3 = 2. А 2 - це 3. Індекс карти від 1 до 3.
[2,3... ]
- І т.д.
Той самий процес стосується offset = 4
. Коли offset = -4
, і A = [1,2,3,4,5]
для кожного індексу offset + index
збільшить величину.
4 + 0 = 0
. Зіставте A [0] зі значенням в A [4].[5...]
4 + 1 = 5
, 5 не виходить за межі при індексації, тому відобразіть A 2 до значення в решті 5 / 5
, яке дорівнює 0. A 2 = значення в A [0].[5,1...]
- повторити.
months[new Date().getMonth()]
назву поточного місяця?