anchor.diff:  module gchq
   
   open System
  +open System.IO
  +open System.Text
  +open System.Threading
   
   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 row i (arr: 'T[,]) = arr.[i..i, *] |> Seq.cast<'T> |> Seq.toList
  +let column i (arr: 'T[,]) = arr.[*, i..i] |> Seq.cast<'T> |> Seq.toList
   
   let rows (arr: 'T[,]) = 
     [ 0.. Array2D.length1 arr - 1 ] |> List.map (fun i -> row i arr)
  
positive.code:     | _ -> Unknown
      ) grid
  
  let printRow (row) =
    for i in row do
      match i with
      | Unknown -> printf "?"
      | Black -> printf "1"
      | White -> printf "0"
  
  let printGrid grid =
    let maxY = (Array2D.length1 grid) - 1
    
    for i in 0 .. maxY do
      let row = row i grid
      printRow row
      printfn ""
      
  let printGridRotated grid =
    let maxX = (Array2D.length2 grid) - 1
    
    for i in 0 .. maxX do
      let row = column i grid
      printRow row
      printfn ""
  
  let getGroups (axis) =
    foldi (fun index acc elem -> 
  
negative.code: 
  let public foldi fold first source  =
          source 
          |> 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 ->
  