From 249f940f8cd0918dd8f17ebd854ca4eab7ada936 Mon Sep 17 00:00:00 2001 From: MikePuzanov Date: Wed, 6 Apr 2022 11:13:13 +0300 Subject: [PATCH 1/5] add type computer --- LocalNetwork/LocalNetwork.sln | 16 +++++++++++ LocalNetwork/LocalNetwork/LocalNetwork.fs | 28 +++++++++++++++++++ LocalNetwork/LocalNetwork/LocalNetwork.fsproj | 14 ++++++++++ LocalNetwork/LocalNetwork/Program.fs | 3 ++ 4 files changed, 61 insertions(+) create mode 100644 LocalNetwork/LocalNetwork.sln create mode 100644 LocalNetwork/LocalNetwork/LocalNetwork.fs create mode 100644 LocalNetwork/LocalNetwork/LocalNetwork.fsproj create mode 100644 LocalNetwork/LocalNetwork/Program.fs diff --git a/LocalNetwork/LocalNetwork.sln b/LocalNetwork/LocalNetwork.sln new file mode 100644 index 0000000..976347d --- /dev/null +++ b/LocalNetwork/LocalNetwork.sln @@ -0,0 +1,16 @@ + +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 +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 + EndGlobalSection +EndGlobal diff --git a/LocalNetwork/LocalNetwork/LocalNetwork.fs b/LocalNetwork/LocalNetwork/LocalNetwork.fs new file mode 100644 index 0000000..1228628 --- /dev/null +++ b/LocalNetwork/LocalNetwork/LocalNetwork.fs @@ -0,0 +1,28 @@ +module LocalNetwork.LocalNetwork + +open System + +type Computer(id, name, virus, probability : float) = + member val Id = id + member val Name = name + member val Virus = virus with get, set + member val Probability = probability + +type Network (graph : int[,] , virus : int List) = + let goVirus graph virus = + let rec doVirus (graph : int[,]) virus : int List = // обход в ширину для каждого компа с вирусом + match virus with // обход в ширину для вируса с проверкой на вероятность + | h :: tail -> + let (neighbour : Computer List) = (graph |> Array.filter (fun [virus, x] -> x != 0 )) |> Array.toList + let neighbourIndex = graph |> Array.filter + let rec tryVirus (graph : Computer[,]) (neighbour : Computer List) (virus : int List)= + match neighbour with + | h :: tail -> + let random = new Random(float) + let probability = random.NextDouble + if (probability <= h.Probability) then + h.Virus = true + virus |> Array.append + + member this.Graph = graph + member this.Virus = virus \ No newline at end of file diff --git a/LocalNetwork/LocalNetwork/LocalNetwork.fsproj b/LocalNetwork/LocalNetwork/LocalNetwork.fsproj new file mode 100644 index 0000000..e46191d --- /dev/null +++ b/LocalNetwork/LocalNetwork/LocalNetwork.fsproj @@ -0,0 +1,14 @@ + + + + Exe + net6.0 + Windows + + + + + + + + diff --git a/LocalNetwork/LocalNetwork/Program.fs b/LocalNetwork/LocalNetwork/Program.fs new file mode 100644 index 0000000..cf9f7ce --- /dev/null +++ b/LocalNetwork/LocalNetwork/Program.fs @@ -0,0 +1,3 @@ + +// For more information see https://aka.ms/fsharp-console-apps +printfn "Hello from F#" \ No newline at end of file From 2023b214bb9c4a97d98e56c46e657f53bbe510db Mon Sep 17 00:00:00 2001 From: MikePuzanov Date: Thu, 14 Apr 2022 00:38:52 +0300 Subject: [PATCH 2/5] add function --- LocalNetwork/LocalNetwork/LocalNetwork.fs | 65 ++++++++++++++++------- LocalNetwork/LocalNetwork/Program.fs | 2 +- 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/LocalNetwork/LocalNetwork/LocalNetwork.fs b/LocalNetwork/LocalNetwork/LocalNetwork.fs index 1228628..34c3a7d 100644 --- a/LocalNetwork/LocalNetwork/LocalNetwork.fs +++ b/LocalNetwork/LocalNetwork/LocalNetwork.fs @@ -1,28 +1,53 @@ module LocalNetwork.LocalNetwork open System +open System.Collections.Generic -type Computer(id, name, virus, probability : float) = +// виды систем +type OperationSystem = + | Windows + | Linux + | MacOS + +// тип компьютера +type Computer(id : int,name : OperationSystem, virus : bool, probability : float) = member val Id = id - member val Name = name + member val Name = + match name with + | Windows -> "Windows" + | Linux -> "Linux" + | MacOS -> "MacOS" member val Virus = virus with get, set member val Probability = probability - -type Network (graph : int[,] , virus : int List) = - let goVirus graph virus = - let rec doVirus (graph : int[,]) virus : int List = // обход в ширину для каждого компа с вирусом - match virus with // обход в ширину для вируса с проверкой на вероятность - | h :: tail -> - let (neighbour : Computer List) = (graph |> Array.filter (fun [virus, x] -> x != 0 )) |> Array.toList - let neighbourIndex = graph |> Array.filter - let rec tryVirus (graph : Computer[,]) (neighbour : Computer List) (virus : int List)= - match neighbour with - | h :: tail -> - let random = new Random(float) - let probability = random.NextDouble - if (probability <= h.Probability) then - h.Virus = true - virus |> Array.append + +// локальная сеть +type public Network(graph : int [,], computers : List, virus : List) = + let check = + virus.Count = computers.Count + + let random = + let randomDouble = new Random() + randomDouble.NextDouble() - member this.Graph = graph - member this.Virus = virus \ No newline at end of file + let virusNetwork (graph : int [,]) (computers : List) (virus : List) = + for i in 0 .. computers.Count - 1 do + if (computers.Item i).Virus then + for j in 0 .. computers.Count - 1 do + if (graph[i, j] = 1 && not (computers.Item j).Virus) then + if (computers.Item j).Probability <= random then + (computers.Item j).Virus <- true + + let print() = + for i in 0 .. computers.Count - 1 do + let computer = computers.Item i + printfn "Name: %i, OS: %s, is infected: %b" i computer.Name computer.Virus + printfn "\n" + + member val Graph = graph with get, set + member val Computers = computers with get + member val Virus = virus with get,set + + member this.DoAll() = + while not check do + virusNetwork graph computers virus + print() \ No newline at end of file diff --git a/LocalNetwork/LocalNetwork/Program.fs b/LocalNetwork/LocalNetwork/Program.fs index cf9f7ce..5433aa0 100644 --- a/LocalNetwork/LocalNetwork/Program.fs +++ b/LocalNetwork/LocalNetwork/Program.fs @@ -1,3 +1,3 @@ - +module Program // For more information see https://aka.ms/fsharp-console-apps printfn "Hello from F#" \ No newline at end of file From 72c3d63c4363384470d8e56dcbd33d7a753eff01 Mon Sep 17 00:00:00 2001 From: MikePuzanov Date: Mon, 25 Apr 2022 19:00:14 +0300 Subject: [PATCH 3/5] add tests --- LocalNetwork/LocalNetwork.sln | 6 ++ LocalNetwork/LocalNetwork/LocalNetwork.fs | 58 ++++++++++--------- LocalNetwork/LocalNetwork/LocalNetwork.fsproj | 3 +- 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/LocalNetwork/LocalNetwork.sln b/LocalNetwork/LocalNetwork.sln index 976347d..6c28172 100644 --- a/LocalNetwork/LocalNetwork.sln +++ b/LocalNetwork/LocalNetwork.sln @@ -2,6 +2,8 @@ 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 @@ -12,5 +14,9 @@ Global {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 index 34c3a7d..f6c0cd6 100644 --- a/LocalNetwork/LocalNetwork/LocalNetwork.fs +++ b/LocalNetwork/LocalNetwork/LocalNetwork.fs @@ -21,33 +21,35 @@ type Computer(id : int,name : OperationSystem, virus : bool, probability : float member val Probability = probability // локальная сеть -type public Network(graph : int [,], computers : List, virus : List) = - let check = - virus.Count = computers.Count - - let random = - let randomDouble = new Random() - randomDouble.NextDouble() - - let virusNetwork (graph : int [,]) (computers : List) (virus : List) = - for i in 0 .. computers.Count - 1 do - if (computers.Item i).Virus then - for j in 0 .. computers.Count - 1 do - if (graph[i, j] = 1 && not (computers.Item j).Virus) then - if (computers.Item j).Probability <= random then - (computers.Item j).Virus <- true +type public Network(matrix : int [,], computers : Computer[], virus : int list) = + let matrix = matrix + let computers = computers + let mutable state = true + let mutable countOfSteps = 0 + let virusNetwork() = + state <- false + countOfSteps <- countOfSteps + 1 + for i in 0 .. computers.Length - 1 do + if (Array.get computers i).Virus then + for j in 0 .. computers.Length - 1 do + let comp = Array.get computers j + if (Array2D.get matrix i j = 1 && not comp.Virus) then + state <- true + let random = Random().NextDouble() + if comp.Probability >= random then + comp.Virus <- true - let print() = - for i in 0 .. computers.Count - 1 do - let computer = computers.Item i - printfn "Name: %i, OS: %s, is infected: %b" i computer.Name computer.Virus - printfn "\n" - - member val Graph = graph with get, set + let print = + printfn "\n\nStep: %i" countOfSteps + for i in 0 .. computers.Length - 1 do + let computer = Array.get computers i + printfn "\nName: %i, Operation system: %s, is infected: %b" (i + 1) computer.Name computer.Virus + + new (matrix: int[,], computers: Computer[]) = Network(matrix, computers) member val Computers = computers with get - member val Virus = virus with get,set - - member this.DoAll() = - while not check do - virusNetwork graph computers virus - print() \ No newline at end of file + member this.DoOneStep() = + virusNetwork() + member this.DoAll() = + while state do + virusNetwork() + print \ No newline at end of file diff --git a/LocalNetwork/LocalNetwork/LocalNetwork.fsproj b/LocalNetwork/LocalNetwork/LocalNetwork.fsproj index e46191d..aff50b8 100644 --- a/LocalNetwork/LocalNetwork/LocalNetwork.fsproj +++ b/LocalNetwork/LocalNetwork/LocalNetwork.fsproj @@ -1,14 +1,13 @@  - Exe net6.0 Windows - + From a92a6db8ec9d584f6bc4ac5b2eb0c00c4c787a72 Mon Sep 17 00:00:00 2001 From: MikePuzanov Date: Tue, 26 Apr 2022 01:34:17 +0300 Subject: [PATCH 4/5] add test --- .../LocalNetwotk.Test/LocalNetworkTest.fs | 61 +++++++++++++++++++ .../LocalNetwotk.Test.fsproj | 27 ++++++++ LocalNetwork/LocalNetwotk.Test/Program.fs | 4 ++ 3 files changed, 92 insertions(+) create mode 100644 LocalNetwork/LocalNetwotk.Test/LocalNetworkTest.fs create mode 100644 LocalNetwork/LocalNetwotk.Test/LocalNetwotk.Test.fsproj create mode 100644 LocalNetwork/LocalNetwotk.Test/Program.fs diff --git a/LocalNetwork/LocalNetwotk.Test/LocalNetworkTest.fs b/LocalNetwork/LocalNetwotk.Test/LocalNetworkTest.fs new file mode 100644 index 0000000..7a328e3 --- /dev/null +++ b/LocalNetwork/LocalNetwotk.Test/LocalNetworkTest.fs @@ -0,0 +1,61 @@ +module LocalNetwotk.Test + +open System +open LocalNetwork.LocalNetwork +open NUnit.Framework +open FsUnit +open LocalNetwork + +[] +let Setup () = + () + +[] +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 From 05bbbf3310df8766ab4954e527187236bff3a5ca Mon Sep 17 00:00:00 2001 From: MikePuzanov Date: Wed, 1 Jun 2022 18:09:50 +0300 Subject: [PATCH 5/5] fix --- LocalNetwork/LocalNetwork/LocalNetwork.fs | 28 ++++++++----------- .../LocalNetwotk.Test/LocalNetworkTest.fs | 5 ---- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/LocalNetwork/LocalNetwork/LocalNetwork.fs b/LocalNetwork/LocalNetwork/LocalNetwork.fs index f6c0cd6..80c8f6b 100644 --- a/LocalNetwork/LocalNetwork/LocalNetwork.fs +++ b/LocalNetwork/LocalNetwork/LocalNetwork.fs @@ -24,32 +24,28 @@ type Computer(id : int,name : OperationSystem, virus : bool, probability : float type public Network(matrix : int [,], computers : Computer[], virus : int list) = let matrix = matrix let computers = computers - let mutable state = true + let mutable IsAnyInfected = true let mutable countOfSteps = 0 let virusNetwork() = - state <- false - countOfSteps <- countOfSteps + 1 - for i in 0 .. computers.Length - 1 do - if (Array.get computers i).Virus then - for j in 0 .. computers.Length - 1 do + 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 - state <- true - let random = Random().NextDouble() - if comp.Probability >= random then - comp.Virus <- true + IsAnyInfected <- true + if comp.Probability >= Random().NextDouble() then + comp.Virus <- true)) let print = - printfn "\n\nStep: %i" countOfSteps - for i in 0 .. computers.Length - 1 do - let computer = Array.get computers i - printfn "\nName: %i, Operation system: %s, is infected: %b" (i + 1) computer.Name computer.Virus + 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}") - new (matrix: int[,], computers: Computer[]) = Network(matrix, computers) member val Computers = computers with get member this.DoOneStep() = virusNetwork() member this.DoAll() = - while state do + while IsAnyInfected do virusNetwork() print \ No newline at end of file diff --git a/LocalNetwork/LocalNetwotk.Test/LocalNetworkTest.fs b/LocalNetwork/LocalNetwotk.Test/LocalNetworkTest.fs index 7a328e3..9550eec 100644 --- a/LocalNetwork/LocalNetwotk.Test/LocalNetworkTest.fs +++ b/LocalNetwork/LocalNetwotk.Test/LocalNetworkTest.fs @@ -6,10 +6,6 @@ open NUnit.Framework open FsUnit open LocalNetwork -[] -let Setup () = - () - [] let TestWithProbability1 () = let comp1 = Computer(0, OperationSystem.Linux, false, 1.0) @@ -35,7 +31,6 @@ let TestWithProbability0 () = 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)