Driftsort an array
Ruby, 33
->a{a.any?{a.sort==a.rotate!}&&a}
a.any?
fires up to once for each element in the array, except it stops (and returns true) as soon as the array has been mutated into a sorted state. If this happens, we return the mutated array. Otherwise we return the false value that any?
returns.
Python 2, 51 bytes
lambda l:sorted(l)*(map(cmp,l[-1:]+l,l).count(1)<3)
Doesn't bother rotating. Instead, sorts the list, then sees if the original is drift-sortable by checking if there's at most one decrease among consecutive elements of the cyclified list. The count is <3
because map
pads the shorter list with None
at the end, adding a fake decrease.
Pyth, 9 bytes
*SQ}SQ.:+
Explanation:
- Q = eval(input())
+ - Q+Q
.: - sublists(^)
} - V in ^
SQ - sorted(Q)
*SQ - ^ * sorted(Q) (return sorted(Q) if ^ True)
Try it here!
Or use a test suite!