Haskell повернуть список списков - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь реализовать следующую функцию в Haskell, это рекурсивный обход, который получает Int и список списков [[Int]] и сдвигает элементы внутренних списков вправо без изменения размера списков. Мне удалось получить список с номерами в правильном порядке, но я не смог вставить их обратно в соответствующие подсписки.

shift_right::Int->[[Int]]->[[Int]]

пример № 1:

shift_right 1 [[1,2,3],[4,5,6]] => [[6,1,2],[3,4,5]]

пример # 2:

shift_right 3 [[],[1],[2,3],[4,5,6]] => [[],[4],[5,6],[1,2,3]]

1 Ответ

1 голос
/ 05 мая 2020

Предполагая, что пустые списки появляются только в начале и никогда в середине, тогда можно было бы использовать один подход: сначала найти способ сделать один поворот, а затем повторить то же действие 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 оборотов Подсказка: предпочтительно без объединения пустых.

...