From 1ecd612d345cbb02cbb1288d052952d919706550 Mon Sep 17 00:00:00 2001 From: IgnatSergeev Date: Fri, 31 May 2024 17:17:29 +0300 Subject: [PATCH] Finished --- .../BracketSequence.Test.fsproj | 29 ++++++++++++ .../BracketSequenceTest.fs | 40 +++++++++++++++++ F#/BracketSequence/BracketSequence.fs | 44 +++++++++++++++++++ F#/BracketSequence/BracketSequence.fsproj | 12 +++++ F#/forSpbu.sln | 12 +++++ 5 files changed, 137 insertions(+) create mode 100644 F#/BracketSequence.Test/BracketSequence.Test.fsproj create mode 100644 F#/BracketSequence.Test/BracketSequenceTest.fs create mode 100644 F#/BracketSequence/BracketSequence.fs create mode 100644 F#/BracketSequence/BracketSequence.fsproj diff --git a/F#/BracketSequence.Test/BracketSequence.Test.fsproj b/F#/BracketSequence.Test/BracketSequence.Test.fsproj new file mode 100644 index 0000000..fe2ef9a --- /dev/null +++ b/F#/BracketSequence.Test/BracketSequence.Test.fsproj @@ -0,0 +1,29 @@ + + + + net8.0 + + false + true + true + + + + + + + + + + + + + + + + + + + + + diff --git a/F#/BracketSequence.Test/BracketSequenceTest.fs b/F#/BracketSequence.Test/BracketSequenceTest.fs new file mode 100644 index 0000000..e9d4e7b --- /dev/null +++ b/F#/BracketSequence.Test/BracketSequenceTest.fs @@ -0,0 +1,40 @@ +module BracketSequence.Test + +open NUnit.Framework +open FsUnit + +[] +let emptyTest () = + "" |> checkBracketSequence |> should equal true + +[] +let roundTest () = + "()" |> checkBracketSequence |> should equal true + +[] +let roundIncorrectTest () = + "(()" |> checkBracketSequence |> should equal false + +[] +let squareTest () = + "[]" |> checkBracketSequence |> should equal true + +[] +let squareIncorrectTest () = + "[[]" |> checkBracketSequence |> should equal false + +[] +let curlyTest () = + "{}" |> checkBracketSequence |> should equal true + +[] +let curlyIncorrectTest () = + "{{}" |> checkBracketSequence |> should equal false + +[] +let complicatedTest () = + "[({}){}[]]" |> checkBracketSequence |> should equal true + +[] +let complicateIncorrectTest () = + "({[}){]}" |> checkBracketSequence |> should equal false diff --git a/F#/BracketSequence/BracketSequence.fs b/F#/BracketSequence/BracketSequence.fs new file mode 100644 index 0000000..e6572f3 --- /dev/null +++ b/F#/BracketSequence/BracketSequence.fs @@ -0,0 +1,44 @@ +module BracketSequence + +/// +/// Get corresponding opened bracket +/// +/// Char to check +/// If given char is any braket, returns corresponding opened bracket, None otherwise +let bracketGetOpened str = + match str with + | '(' | ')' -> Some('(') + | '{' | '}' -> Some('{') + | '[' | ']' -> Some('[') + | _ -> None + +/// +/// Checks if string is correct bracket sequence +/// +/// String to check +/// If given bracket string is correct, true, false otherwise +let rec checkBracketSequence str = + let rec bracketHelper list (openedStack: List) = + match list with + | [] -> openedStack.IsEmpty + | head::tail -> + let opened = bracketGetOpened head + match opened with + | Some (a) -> + let isOpened = a.Equals(head) + match openedStack with + | openedHead::openedTail -> + if isOpened then + bracketHelper tail (a::openedStack) + else if a.Equals(openedHead) then + bracketHelper tail openedTail + else + false + | [] -> + if isOpened then + bracketHelper tail [ a ] + else + false + | _ -> false + bracketHelper (Seq.toList str) List.empty + diff --git a/F#/BracketSequence/BracketSequence.fsproj b/F#/BracketSequence/BracketSequence.fsproj new file mode 100644 index 0000000..b0d2e87 --- /dev/null +++ b/F#/BracketSequence/BracketSequence.fsproj @@ -0,0 +1,12 @@ + + + + net8.0 + true + + + + + + + diff --git a/F#/forSpbu.sln b/F#/forSpbu.sln index 9d54d03..e67474a 100644 --- a/F#/forSpbu.sln +++ b/F#/forSpbu.sln @@ -21,6 +21,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "07.03", "07.03", "{5CA9053B EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Homework1", "Homework1\Homework1.fsproj", "{04B15EE4-079A-42ED-ACC8-E2DCD25281C6}" EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "BracketSequence", "BracketSequence\BracketSequence.fsproj", "{0D046BAA-DC97-4DED-8E10-9BF0D583988A}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "BracketSequence.Test", "BracketSequence.Test\BracketSequence.Test.fsproj", "{3198CB45-D4CF-4CFF-943C-4AB43E89B832}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -58,6 +62,14 @@ Global {89A935E8-B5F3-435D-ACC3-A99DD7C66178}.Debug|Any CPU.Build.0 = Debug|Any CPU {89A935E8-B5F3-435D-ACC3-A99DD7C66178}.Release|Any CPU.ActiveCfg = Release|Any CPU {89A935E8-B5F3-435D-ACC3-A99DD7C66178}.Release|Any CPU.Build.0 = Release|Any CPU + {0D046BAA-DC97-4DED-8E10-9BF0D583988A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D046BAA-DC97-4DED-8E10-9BF0D583988A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D046BAA-DC97-4DED-8E10-9BF0D583988A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D046BAA-DC97-4DED-8E10-9BF0D583988A}.Release|Any CPU.Build.0 = Release|Any CPU + {3198CB45-D4CF-4CFF-943C-4AB43E89B832}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3198CB45-D4CF-4CFF-943C-4AB43E89B832}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3198CB45-D4CF-4CFF-943C-4AB43E89B832}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3198CB45-D4CF-4CFF-943C-4AB43E89B832}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {7937CDA8-8285-4E23-AD1A-FC0F04FEEFE6} = {91E3BDA2-0836-46C2-95F0-02513FD7F13F}