anchor.diff:  
   let public foldi fold first source  =
           source 
  -        |> Array.fold(fun (prev,i) c -> (fold i prev c,i + 1)) (first,0)
  +        |> List.fold(fun (prev,i) c -> (fold i prev c,i + 1)) (first,0)
           |> fst
  +
  +let rotate (arr: 'T[,]) =
  +  Array2D.init (Array2D.length2 arr) (Array2D.length1 arr) (fun x y -> arr.[y,x]) 
   
   let convertPatternToResult grid :CellResult[,] =
     Array2D.map (fun v ->
  
positive.code: module gchq
  
  open System
  
  type group = int list
  type groupsIntermediate = { FinishedGroups : group list; CurrentGroup : group}
  type CellResult = Unknown | Black | White
  type TestResult = Indeterminate | Pass | Fail
  
  let row i (arr: 'T[,]) = arr.[i..i, *] |> Seq.cast<'T> |> Seq.toArray
  let column i (arr: 'T[,]) = arr.[*, i..i] |> Seq.cast<'T> |> Seq.toArray
  
  let rows (arr: 'T[,]) = 
    [ 0.. Array2D.length1 arr - 1 ] |> List.map (fun i -> row i arr)
  
negative.code:     | _ -> Unknown
      ) grid
  
  let printRow output row =
    for i in row do
      match i with
      | Unknown -> fprintf output "?"
      | Black -> fprintf output "1"
      | White -> fprintf output "0"
  
  let getGroups (axis) =
    foldi (fun index acc elem -> 
  