EDIT ::
Hey, es stellt sich heraus, dass zu viel Iteration passiert. Keine Schleifen, keine Verzweigung.
Funktioniert immer noch mit negativem n für Rechtsdrehung und positivem n für Linksdrehung für jede Größe n, mutationsfrei
function rotate(A,n,l=A.length) {
const offset = (((n % l) + l) %l)
return A.slice(offset).concat(A.slice(0,offset))
}
Hier ist die Code-Golf-Version für Kichern
const r = (A,n,l=A.length,i=((n%l)+l)%l)=>A.slice(i).concat(A.slice(0,i))
EDIT1 :: *
Branchless, mutationsless Implementierung.
Es stellte sich heraus, dass ich einen Zweig hatte, in dem ich ihn nicht brauchte. Hier ist eine funktionierende Lösung. negative num = rechts um | num | drehen positive num = links um num drehen
function r(A,n,l=A.length) {
return A.map((x,i,a) => A[(((n+i)%l) + l) % l])
}
Die Gleichung ((n%l) + l) % lbildet genau positive und negative Zahlen beliebig großer Werte von n ab
ORIGINAL
Nach links und rechts drehen. Mit positiv nach links ndrehen, mit negativ nach rechts drehenn .
Funktioniert für obszön große Eingaben von n .
Kein Mutationsmodus. Zu viele Mutationen in diesen Antworten.
Außerdem weniger Operationen als die meisten Antworten. Kein Pop, kein Push, kein Spleiß, keine Verschiebung.
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]
})
}
oder
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])
})
Erläuterung:
Ordnen Sie jeden Index von A dem Wert am Indexversatz zu. In diesem Fall
offset = num
wenn das offset < 0dannoffset + index + positive length of A auf den inversen Versatz zeigt.
wenn offset > 0 and offset < length of A dann, ordnen Sie einfach den aktuellen Index dem Offset-Index von A zu.
Andernfalls modulo den Versatz und die Länge, um den Versatz in den Grenzen des Arrays abzubilden.
Nehmen Sie zum Beispiel offset = 4und offset = -4.
Wann offset = -4und A = [1,2,3,4,5]für jeden Index offset + indexwird die Größe (oder Math.abs(offset)) kleiner.
Lassen Sie uns zuerst die Berechnung für den Index des negativen n erklären. A[(((n % A.length) + A.length) % A.length)+0]und eingeschüchtert worden. Sei nicht. Ich habe 3 Minuten in einem Repl gebraucht, um das herauszufinden.
- Wir wissen, dass
nes negativ ist, weil der Fall ist n < 0. Wenn die Zahl größer als der Bereich des Arrays ist, n % A.lengthwird sie dem Bereich zugeordnet.
n + A.lengthAddiere diese Zahl zu A.length, um n den richtigen Betrag auszugleichen.
- Wir wissen, dass
nes negativ ist, weil der Fall ist n < 0. n + A.lengthAddiere diese Zahl zu A.length, um n den richtigen Betrag auszugleichen.
Weiter Ordnen Sie es mit Modulo dem Längenbereich von A zu. Das zweite Modul ist erforderlich, um das Ergebnis der Berechnung in einen indizierbaren Bereich abzubilden

Erster Index: -4 + 0 = -4. A. Länge = 5. A. Länge - 4 = 1. A 2 ist 2. Kartenindex 0 bis 2.[2,... ]
- Nächster Index: -4 + 1 = -3. 5 + -3 = 2. A 2 ist 3. Kartenindex 1 bis 3.
[2,3... ]
- Etc.
Der gleiche Prozess gilt für offset = 4. Wann offset = -4und A = [1,2,3,4,5]für jeden Index offset + indexwird die Größe größer.
4 + 0 = 0. Ordnen Sie A [0] dem Wert bei A [4] zu.[5...]
4 + 1 = 5, 5 ist beim Indizieren außerhalb der Grenzen, also ordne A 2 dem Wert am Rest von zu 5 / 5, der 0 ist. A 2 = Wert bei A [0].[5,1...]
- wiederholen.
months[new Date().getMonth()], um den Namen des aktuellen Monats abzurufen?