Предполагая, что пустые списки появляются только в начале и никогда в середине, тогда можно было бы использовать один подход: сначала найти способ сделать один поворот, а затем повторить то же действие n
раз для n
поворотов . Я думаю, мы можем использовать для этой цели mapAccumL
.
m = [[],[1],[2,3],[4,5,6]]
s l = es ++ (rem ++ ls) : lss
where
(rem, (ls:lss)) = mapAccumL shifter [] fs
shifter a bs = ([last bs], a ++ (init bs))
(es,fs) = span (== []) l -- split empties and fulls
λ> s m
[[],[6],[1,2],[3,4,5]]
λ> s [[],[6],[1,2],[3,4,5]] -- carry from previous answer
[[],[5],[6,1],[2,3,4]]
λ> s [[],[5],[6,1],[2,3,4]] -- carry from previous answer
[[],[4],[5,6],[1,2,3]]
Итак ... поскольку вы вообще не показываете никаких попыток, ваш долг - придумать код который вызывает эту функцию (или часть этой функции) n
раз для n
оборотов Подсказка: предпочтительно без объединения пустых.