So I have this code that is my attempt at a coding test from Codility. While my code produces correct results according to the requirements, (which unfortunately are copyrighted so I don't think I can reproduce them here), but I feel like it could be better organized, and in some places use a more functional approach to solving the problem.
So the basic idea is that it tests if the string if its properly nested parenthesis, or can be split into 2 halves which are properly nested.
let rec isNested (s : System.String) =
let s = s.ToCharArray()
let s = List.ofArray s
match s with
| [] -> true //if its empty then its properly nested
| _ ->
match s.Length % 2 with
//if its even split the list in to 2 halves and test them
| 0 -> //test form VW
let len = s.Length
let half = len / 2
let mutable firsthalf = []
let mutable secondhalf = []
for i in 0..half - 1 do
firsthalf <- s.[i] :: firsthalf
for i in half..len - 1 do
secondhalf <- s.[i] :: secondhalf
firsthalf <- List.rev firsthalf
secondhalf <- List.rev secondhalf
let VWtest =
isNested (new string(Array.ofList (firsthalf))) && isNested (new string(Array.ofList (secondhalf)))
match VWtest with
| true -> true
| false ->
match (s.[0], s.[s.Length - 1]) with
| ('(', ')') ->
//remove the first and last elements
let sublist =
s.Tail
|> List.rev
|> List.tail
|> List.rev
isNested (new string(Array.ofList (sublist)))
| _ -> false
| _ -> false //not a string with an even number of chars therefore can't be properly nested
let test = isNested >> Console.WriteLine
//let expect (b : bool) = Console.WriteLine(" expected ", b)
test "()" // expect true
test ")(" // expect false
test "(())" // expect true
test "()()" // expect true
test "()(()" // expect false
test "(()())" // expect true