編集::
ねえ、繰り返しが多すぎることがわかりました。ループも分岐もありません。
任意のサイズ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 :: *
ブランチレス、ミューテーションレスの実装。
だからねえ、私はそれを必要としないブランチを持っていたことがわかりました。これが実用的な解決策です。負の数=右回転| num | 正のnum = numだけ左回転
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
次に、現在のインデックスを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]
とおびえています。しないでください。Replでそれを解決するのに3分かかりました。
n
ケースがであるため、ネガティブであることがわかりn < 0
ます。数値が配列の範囲よりも大きい場合は、範囲にn % A.length
マップされます。
n + A.length
その数をA.length
に追加して、nを正しい量オフセットします。
n
ケースがであるため、ネガティブであることがわかりn < 0
ます。n + A.length
その数をA.length
に追加して、nを正しい量オフセットします。
次に、モジュロを使用してAの長さの範囲にマップします。計算結果をインデックス可能な範囲にマッピングするには、2番目のモジュールが必要です
最初のインデックス:-4 + 0 = -4。A.length =5。A.length-4=1。A2は2です。インデックス0を2にマップします。[2,... ]
- 次のインデックス、-4 + 1 = -3。5 + -3 = 2 A 2が3 3.マップインデックス1です。
[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
索引付けは、そうAマッピングする場合、5が範囲外である2の残りの部分で値5 / 5
0 Aであり、2 Aの値= [0]。[5,1...]
- 繰り返す。
months[new Date().getMonth()]
今月の名前を取得するためだけに使用してみませんか?