diff --git a/LocalNetwork/LocalNetwork.sln b/LocalNetwork/LocalNetwork.sln new file mode 100644 index 0000000..6c28172 --- /dev/null +++ b/LocalNetwork/LocalNetwork.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "LocalNetwork", "LocalNetwork\LocalNetwork.fsproj", "{61970833-AC88-4081-B541-26C330049AFC}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "LocalNetwotk.Test", "LocalNetwotk.Test\LocalNetwotk.Test.fsproj", "{4BC2F556-89CD-4EDA-9E60-7DD6165C7E5E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {61970833-AC88-4081-B541-26C330049AFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {61970833-AC88-4081-B541-26C330049AFC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {61970833-AC88-4081-B541-26C330049AFC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {61970833-AC88-4081-B541-26C330049AFC}.Release|Any CPU.Build.0 = Release|Any CPU + {4BC2F556-89CD-4EDA-9E60-7DD6165C7E5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4BC2F556-89CD-4EDA-9E60-7DD6165C7E5E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4BC2F556-89CD-4EDA-9E60-7DD6165C7E5E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4BC2F556-89CD-4EDA-9E60-7DD6165C7E5E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/LocalNetwork/LocalNetwork/LocalNetwork.fs b/LocalNetwork/LocalNetwork/LocalNetwork.fs new file mode 100644 index 0000000..80c8f6b --- /dev/null +++ b/LocalNetwork/LocalNetwork/LocalNetwork.fs @@ -0,0 +1,51 @@ +module LocalNetwork.LocalNetwork + +open System +open System.Collections.Generic + +// виды систем +type OperationSystem = + | Windows + | Linux + | MacOS + +// тип компьютера +type Computer(id : int,name : OperationSystem, virus : bool, probability : float) = + member val Id = id + member val Name = + match name with + | Windows -> "Windows" + | Linux -> "Linux" + | MacOS -> "MacOS" + member val Virus = virus with get, set + member val Probability = probability + +// локальная сеть +type public Network(matrix : int [,], computers : Computer[], virus : int list) = + let matrix = matrix + let computers = computers + let mutable IsAnyInfected = true + let mutable countOfSteps = 0 + let virusNetwork() = + IsAnyInfected <- false + countOfSteps <- countOfSteps + 1 + computers |> Array.iteri(fun i computer -> + if computer.Virus then + computers |> Array.iteri(fun j computer -> + let comp = Array.get computers j + if (Array2D.get matrix i j = 1 && not comp.Virus) then + IsAnyInfected <- true + if comp.Probability >= Random().NextDouble() then + comp.Virus <- true)) + + let print = + printfn "\n\nStep: %i" countOfSteps + computers |> Array.iteri(fun i computer -> printfn $"\nName: %i{i + 1}, Operation system: %s{computer.Name}, is infected: %b{computer.Virus}") + + member val Computers = computers with get + member this.DoOneStep() = + virusNetwork() + member this.DoAll() = + while IsAnyInfected do + virusNetwork() + print \ No newline at end of file diff --git a/LocalNetwork/LocalNetwork/LocalNetwork.fsproj b/LocalNetwork/LocalNetwork/LocalNetwork.fsproj new file mode 100644 index 0000000..aff50b8 --- /dev/null +++ b/LocalNetwork/LocalNetwork/LocalNetwork.fsproj @@ -0,0 +1,13 @@ + + + + net6.0 + Windows + + + + + + + + diff --git a/LocalNetwork/LocalNetwork/Program.fs b/LocalNetwork/LocalNetwork/Program.fs new file mode 100644 index 0000000..5433aa0 --- /dev/null +++ b/LocalNetwork/LocalNetwork/Program.fs @@ -0,0 +1,3 @@ +module Program +// For more information see https://aka.ms/fsharp-console-apps +printfn "Hello from F#" \ No newline at end of file diff --git a/LocalNetwork/LocalNetwotk.Test/LocalNetworkTest.fs b/LocalNetwork/LocalNetwotk.Test/LocalNetworkTest.fs new file mode 100644 index 0000000..9550eec --- /dev/null +++ b/LocalNetwork/LocalNetwotk.Test/LocalNetworkTest.fs @@ -0,0 +1,56 @@ +module LocalNetwotk.Test + +open System +open LocalNetwork.LocalNetwork +open NUnit.Framework +open FsUnit +open LocalNetwork + +[] +let TestWithProbability1 () = + let comp1 = Computer(0, OperationSystem.Linux, false, 1.0) + let comp2 = Computer(0, OperationSystem.Windows, true, 1.0) + + let comp3 = Computer(0, OperationSystem.MacOS, false, 1.0) + let matrix = [ [1; 1; 0]; [1; 1; 1]; [0; 1; 0] ] + let network = Network(array2D matrix, [| comp1; comp2; comp3|], [1]) + network.DoAll() + for comp in network.Computers do + comp.Virus |> should equal true + +[] +let TestWithProbability0 () = + let comp1 = Computer(0, OperationSystem.Linux, false, 0.0) + let comp2 = Computer(0, OperationSystem.Windows, false, 0.0) + + let comp3 = Computer(0, OperationSystem.MacOS, false, 0.0) + let matrix = [ [1; 1; 0]; [1; 1; 1]; [0; 1; 0] ] + let network = Network(array2D matrix, [| comp1; comp2; comp3|], [1]) + network.DoAll() + for comp in network.Computers do + comp.Virus |> should equal false + +[] +let TestWithDifferentProbability () = + let comp1 = Computer(0, OperationSystem.Linux, true, 0.3) + let comp2 = Computer(0, OperationSystem.Windows, false, 0.3) + + let comp3 = Computer(0, OperationSystem.MacOS, false, 0.7) + let matrix = [ [1; 1; 0]; [1; 1; 1]; [0; 1; 0] ] + let network = Network(array2D matrix, [| comp1; comp2; comp3|], [1]) + network.DoAll() + for comp in network.Computers do + comp.Virus |> should equal true + +[] +let TestWithWhenNotAllBecomeVirus () = + let comp1 = Computer(0, OperationSystem.Linux, true, 0.5) + let comp2 = Computer(0, OperationSystem.Windows, false, 0.8) + + let comp3 = Computer(0, OperationSystem.MacOS, false, 0.7) + let matrix = [ [1; 1; 0]; [1; 1; 0]; [0; 0; 0] ] + let network = Network(array2D matrix, [| comp1; comp2; comp3|], [1]) + network.DoAll() + comp1.Virus |> should equal true + comp2.Virus |> should equal true + comp3.Virus |> should equal false \ No newline at end of file diff --git a/LocalNetwork/LocalNetwotk.Test/LocalNetwotk.Test.fsproj b/LocalNetwork/LocalNetwotk.Test/LocalNetwotk.Test.fsproj new file mode 100644 index 0000000..62fe7ff --- /dev/null +++ b/LocalNetwork/LocalNetwotk.Test/LocalNetwotk.Test.fsproj @@ -0,0 +1,27 @@ + + + + net6.0 + + false + false + + + + + + + + + + + + + + + + + + + + diff --git a/LocalNetwork/LocalNetwotk.Test/Program.fs b/LocalNetwork/LocalNetwotk.Test/Program.fs new file mode 100644 index 0000000..176a7b6 --- /dev/null +++ b/LocalNetwork/LocalNetwotk.Test/Program.fs @@ -0,0 +1,4 @@ +module Program = + + [] + let main _ = 0