DÜZENLEME ::
Hey, çok fazla yineleme oluyor. Döngü yok, dallanma yok.
Hala herhangi bir n boyutu için sağ dönüş için negatif n ve sol dönüş için pozitif n ile çalışır
function rotate(A,n,l=A.length) {
const offset = (((n % l) + l) %l)
return A.slice(offset).concat(A.slice(0,offset))
}
İşte kıkırdamalar için kod golf versiyonu
const r = (A,n,l=A.length,i=((n%l)+l)%l)=>A.slice(i).concat(A.slice(0,i))
EDIT1 :: * Dalsız
, mutasyonsuz uygulama.
Öyleyse hey, ihtiyacım olmayan bir şubem olduğu ortaya çıktı. İşte çalışan bir çözüm. negatif num = sağa döndür | num | pozitif num = num ile sola döndür
function r(A,n,l=A.length) {
return A.map((x,i,a) => A[(((n+i)%l) + l) % l])
}
Denklem ((n%l) + l) % l, herhangi bir keyfi büyük n değerinin tam olarak pozitif ve negatif sayılarını eşler
ORİJİNAL
Sola ve sağa döndürün. Pozitif ile sola n, negatif ile sağa döndürün n.
Müstehcen büyük girdiler için çalışıyor n.
Mutasyon modu yok. Bu cevaplarda çok fazla mutasyon var.
Ayrıca, çoğu yanıttan daha az işlem. Pop yok, itme yok, ekleme yok, vardiya yok.
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]
})
}
veya
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çıklama:
her bir A dizinini, dizin ofsetindeki değerle eşleyin. Bu durumda
offset = num
eğer o offset < 0zaman offset + index + positive length of Aters ofseti gösterecektir.
eğer offset > 0 and offset < length of Ao zaman mevcut dizini A'nın ofset indeksiyle eşleştirin.
Aksi takdirde, ofseti dizinin sınırları içinde eşlemek için ofseti ve uzunluğu modüle edin.
Örneğin al offset = 4ve offset = -4.
Ne zaman offset = -4ve A = [1,2,3,4,5], her indeks offset + indexiçin, büyüklüğü (veya Math.abs(offset)) küçültecek.
Önce negatif n indeksi için hesaplamayı açıklayalım. A[(((n % A.length) + A.length) % A.length)+0]ve sindirildi. Olma. Anlamak için bir Repl'de 3 dakikamı aldı.
nOlumsuz olduğunu biliyoruz çünkü durum öyle n < 0. Sayı, Dizi'nin aralığından büyükse, n % A.lengthonu aralık ile eşler.
n + A.lengthA.lengthdoğru miktarda denkleştirmek için bu sayıyı ekleyin .
nOlumsuz olduğunu biliyoruz çünkü durum öyle n < 0. doğru miktarda denkleştirmek n + A.lengthiçin bu sayıyı ekleyin A.length.
Sonraki Modulo kullanarak bunu A uzunluğu aralığına eşleyin. İkinci değişken, hesaplamanın sonucunu indekslenebilir bir aralıkla eşlemek için gereklidir

İlk indeks: -4 + 0 = -4. A. uzunluk = 5. A. uzunluk - 4 = 1. A 2 , 2. Harita indeksi 0 - 2.[2,... ]
- Sonraki dizin, -4 + 1 = -3. 5 + -3 = 2. A 2 , 3. Harita indeksi 1 - 3.
[2,3... ]
- Vb.
Aynı süreç için de geçerlidir offset = 4. Ne zaman offset = -4ve A = [1,2,3,4,5]her indeks offset + indexiçin büyüklüğü büyütür.
4 + 0 = 0. A [0] 'ı A [4]' daki değere eşleyin.[5...]
4 + 1 = 5, 5, indeksleme sırasında sınırların dışındadır, bu nedenle A 2'yi kalanındaki değerle eşleyin 5 / 5, bu değer 0'dır. A 2 = A [0] 'daki değer.[5,1...]
- tekrar et.
months[new Date().getMonth()]içinde bulunduğunuz ayın adını almak için kullanmıyorsunuz ?