Skip to content

Instantly share code, notes, and snippets.

@firejox
Created December 5, 2019 16:39
Show Gist options
  • Save firejox/e657a3c214eda56690d5d05aa9f90d9f to your computer and use it in GitHub Desktop.
Save firejox/e657a3c214eda56690d5d05aa9f90d9f to your computer and use it in GitHub Desktop.
another array rotaion
class Array
def new_rotate!(n = 1)
return self if empty?
sz = @size
n %= sz
return self if n == 0
st = to_unsafe
ed = st + sz
while (sz > 1 && n != 0)
if n <= (sz // 2)
p = st
q = p + n
while q != ed
q.value, p.value = p.value, q.value
p += 1
q += 1
end
st = p
sz, n = n, -sz % n
else
p = st + n - 1
q = ed - 1
while st <= p
q.value, p.value = p.value, q.value
p -= 1
q -= 1
end
ed = q + 1
n = sz - n
sz, n = n, sz % n
end
end
self
end
end
pp (0...144).to_a.new_rotate!(55)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment