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 < 0
zaman offset + index + positive length of A
ters ofseti gösterecektir.
eğer offset > 0 and offset < length of A
o 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 = 4
ve offset = -4
.
Ne zaman offset = -4
ve A = [1,2,3,4,5]
, her indeks offset + index
iç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ı.
n
Olumsuz olduğunu biliyoruz çünkü durum öyle n < 0
. Sayı, Dizi'nin aralığından büyükse, n % A.length
onu aralık ile eşler.
n + A.length
A.length
doğru miktarda denkleştirmek için bu sayıyı ekleyin .
n
Olumsuz olduğunu biliyoruz çünkü durum öyle n < 0
. doğru miktarda denkleştirmek n + A.length
iç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 = -4
ve A = [1,2,3,4,5]
her indeks offset + index
iç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 ?