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) % l
bildet genau positive und negative Zahlen beliebig großer Werte von n ab
ORIGINAL
Nach links und rechts drehen. Mit positiv nach links n
drehen, 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 < 0
dannoffset + 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 = 4
und offset = -4
.
Wann offset = -4
und A = [1,2,3,4,5]
für jeden Index offset + index
wird 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
n
es negativ ist, weil der Fall ist n < 0
. Wenn die Zahl größer als der Bereich des Arrays ist, n % A.length
wird sie dem Bereich zugeordnet.
n + A.length
Addiere diese Zahl zu A.length
, um n den richtigen Betrag auszugleichen.
- Wir wissen, dass
n
es negativ ist, weil der Fall ist n < 0
. n + A.length
Addiere 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 = -4
und A = [1,2,3,4,5]
für jeden Index offset + index
wird 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?