LeetCode 1260. Shift 2D Grid in F#

URL

leetcode.com/problems/shift-2d-grid

Code

github.com/syohex/dotnet-study/blob/master/..

let toOneDimention (grid: int [,]) (cells: int) (cols: int) : int list =
    let rec toOneDimention' i (grid: int [,]) cells cols acc =
        if i = cells then
            acc |> List.rev
        else
            let row = i / cols
            let col = i % cols
            let v = grid.[row, col]
            toOneDimention' (i + 1) grid cells cols (v :: acc)

    toOneDimention' 0 grid cells cols []

let shift (grid1: int list) (k: int) : int list =
    let len = grid1.Length

    (List.skip (len - k) grid1)
    @ (List.take (len - k) grid1)

let shiftGrid (grid: int [,]) (k: int) : int [,] =
    let rec shiftGrid' i cols grid1 (ret: int [,]) =
        match grid1 with
        | [] -> ret
        | h :: t ->
            let row = i / cols
            let col = i % cols
            ret.[row, col] <- h
            shiftGrid' (i + 1) cols t ret

    let rows = Array2D.length1 grid
    let cols = Array2D.length2 grid
    let cells = rows * cols
    let grid1 = toOneDimention grid cells cols
    let grid1' = shift grid1 (k % cells)

    let ret = Array2D.zeroCreate<int> rows cols
    shiftGrid' 0 cols grid1' ret