| module KindergartenGarden | |||||
| open System | |||||
| type Plant = | |||||
| | Grass | |||||
| | Clover | |||||
| | Radishes | |||||
| | Violets | |||||
| let getNumFromName (student: string) = int (student.[0]) - int ('A') | |||||
| let getPlantChars (row: string) num = | |||||
| [ for c in (row.[(num * 2)..(num * 2 + 1)]) -> c ] | |||||
| let plants (diagram: string) (student: string) = | |||||
| diagram.Split [| '\n' |] // Split the rows up | |||||
| |> Seq.map (fun i -> (getPlantChars i (getNumFromName student))) // Go over each row getting the child's plants | |||||
| |> Seq.reduce List.append // This flattens the list becuase before this it looks like [['a', 'b']['c', 'd']] and we want ['a', 'b', 'c', 'd'] | |||||
| |> List.map (fun i -> // Now for each plant character return the relavant plant type | |||||
| match i with | |||||
| | 'G' -> Grass | |||||
| | 'C' -> Clover | |||||
| | 'R' -> Radishes | |||||
| | _ -> Violets) |
| <Project Sdk="Microsoft.NET.Sdk"> | |||||
| <PropertyGroup> | |||||
| <TargetFramework>netcoreapp3.0</TargetFramework> | |||||
| <IsPackable>false</IsPackable> | |||||
| </PropertyGroup> | |||||
| <ItemGroup> | |||||
| <Compile Include="KindergartenGarden.fs" /> | |||||
| <Compile Include="KindergartenGardenTests.fs" /> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" /> | |||||
| <PackageReference Include="xunit" Version="2.4.1" /> | |||||
| <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" /> | |||||
| <PackageReference Include="FsUnit.xUnit" Version="3.8.1" /> | |||||
| </ItemGroup> | |||||
| </Project> |
| // This file was auto-generated based on version 1.1.1 of the canonical data. | |||||
| module KindergartenGardenTests | |||||
| open FsUnit.Xunit | |||||
| open Xunit | |||||
| open KindergartenGarden | |||||
| [<Fact>] | |||||
| let ``Partial garden - garden with single student`` () = | |||||
| let student = "Alice" | |||||
| let diagram = "RC\nGG" | |||||
| let expected = [Plant.Radishes; Plant.Clover; Plant.Grass; Plant.Grass] | |||||
| plants diagram student |> should equal expected | |||||
| [<Fact>] | |||||
| let ``Partial garden - different garden with single student`` () = | |||||
| let student = "Alice" | |||||
| let diagram = "VC\nRC" | |||||
| let expected = [Plant.Violets; Plant.Clover; Plant.Radishes; Plant.Clover] | |||||
| plants diagram student |> should equal expected | |||||
| [<Fact>] | |||||
| let ``Partial garden - garden with two students`` () = | |||||
| let student = "Bob" | |||||
| let diagram = "VVCG\nVVRC" | |||||
| let expected = [Plant.Clover; Plant.Grass; Plant.Radishes; Plant.Clover] | |||||
| plants diagram student |> should equal expected | |||||
| [<Fact>] | |||||
| let ``Partial garden - multiple students for the same garden with three students - second student's garden`` () = | |||||
| let student = "Bob" | |||||
| let diagram = "VVCCGG\nVVCCGG" | |||||
| let expected = [Plant.Clover; Plant.Clover; Plant.Clover; Plant.Clover] | |||||
| plants diagram student |> should equal expected | |||||
| [<Fact>] | |||||
| let ``Partial garden - multiple students for the same garden with three students - third student's garden`` () = | |||||
| let student = "Charlie" | |||||
| let diagram = "VVCCGG\nVVCCGG" | |||||
| let expected = [Plant.Grass; Plant.Grass; Plant.Grass; Plant.Grass] | |||||
| plants diagram student |> should equal expected | |||||
| [<Fact>] | |||||
| let ``Full garden - first student's garden`` () = | |||||
| let student = "Alice" | |||||
| let diagram = "VRCGVVRVCGGCCGVRGCVCGCGV\nVRCCCGCRRGVCGCRVVCVGCGCV" | |||||
| let expected = [Plant.Violets; Plant.Radishes; Plant.Violets; Plant.Radishes] | |||||
| plants diagram student |> should equal expected | |||||
| [<Fact>] | |||||
| let ``Full garden - second student's garden`` () = | |||||
| let student = "Bob" | |||||
| let diagram = "VRCGVVRVCGGCCGVRGCVCGCGV\nVRCCCGCRRGVCGCRVVCVGCGCV" | |||||
| let expected = [Plant.Clover; Plant.Grass; Plant.Clover; Plant.Clover] | |||||
| plants diagram student |> should equal expected | |||||
| [<Fact>] | |||||
| let ``Full garden - second to last student's garden`` () = | |||||
| let student = "Kincaid" | |||||
| let diagram = "VRCGVVRVCGGCCGVRGCVCGCGV\nVRCCCGCRRGVCGCRVVCVGCGCV" | |||||
| let expected = [Plant.Grass; Plant.Clover; Plant.Clover; Plant.Grass] | |||||
| plants diagram student |> should equal expected | |||||
| [<Fact>] | |||||
| let ``Full garden - last student's garden`` () = | |||||
| let student = "Larry" | |||||
| let diagram = "VRCGVVRVCGGCCGVRGCVCGCGV\nVRCCCGCRRGVCGCRVVCVGCGCV" | |||||
| let expected = [Plant.Grass; Plant.Violets; Plant.Clover; Plant.Violets] | |||||
| plants diagram student |> should equal expected | |||||
| # Kindergarten Garden | |||||
| Given a diagram, determine which plants each child in the kindergarten class is | |||||
| responsible for. | |||||
| The kindergarten class is learning about growing plants. The teacher | |||||
| thought it would be a good idea to give them actual seeds, plant them in | |||||
| actual dirt, and grow actual plants. | |||||
| They've chosen to grow grass, clover, radishes, and violets. | |||||
| To this end, the children have put little cups along the window sills, and | |||||
| planted one type of plant in each cup, choosing randomly from the available | |||||
| types of seeds. | |||||
| ```text | |||||
| [window][window][window] | |||||
| ........................ # each dot represents a cup | |||||
| ........................ | |||||
| ``` | |||||
| There are 12 children in the class: | |||||
| - Alice, Bob, Charlie, David, | |||||
| - Eve, Fred, Ginny, Harriet, | |||||
| - Ileana, Joseph, Kincaid, and Larry. | |||||
| Each child gets 4 cups, two on each row. Their teacher assigns cups to | |||||
| the children alphabetically by their names. | |||||
| The following diagram represents Alice's plants: | |||||
| ```text | |||||
| [window][window][window] | |||||
| VR...................... | |||||
| RG...................... | |||||
| ``` | |||||
| In the first row, nearest the windows, she has a violet and a radish. In the | |||||
| second row she has a radish and some grass. | |||||
| Your program will be given the plants from left-to-right starting with | |||||
| the row nearest the windows. From this, it should be able to determine | |||||
| which plants belong to each student. | |||||
| For example, if it's told that the garden looks like so: | |||||
| ```text | |||||
| [window][window][window] | |||||
| VRCGVVRVCGGCCGVRGCVCGCGV | |||||
| VRCCCGCRRGVCGCRVVCVGCGCV | |||||
| ``` | |||||
| Then if asked for Alice's plants, it should provide: | |||||
| - Violets, radishes, violets, radishes | |||||
| While asking for Bob's plants would yield: | |||||
| - Clover, grass, clover, clover | |||||
| ## Running the tests | |||||
| To run the tests, run the command `dotnet test` from within the exercise directory. | |||||
| ## Autoformatting the code | |||||
| F# source code can be formatted with the [Fantomas](https://github.com/fsprojects/fantomas) tool. | |||||
| After installing it with `dotnet tool restore`, run `dotnet fantomas .` to format code within the current directory. | |||||
| ## Further information | |||||
| For more detailed information about the F# track, including how to get help if | |||||
| you're having trouble, please visit the exercism.io [F# language page](http://exercism.io/languages/fsharp/resources). | |||||
| ## Source | |||||
| Random musings during airplane trip. [http://jumpstartlab.com](http://jumpstartlab.com) | |||||