From 3952b7800692e636edbda3feb8268fd1313f909c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Sun, 29 Sep 2024 22:29:49 -0700 Subject: [PATCH] Add `strain` --- config.json | 8 + .../practice/strain/.docs/instructions.md | 29 ++++ exercises/practice/strain/.meta/config.json | 19 +++ exercises/practice/strain/.meta/example.jl | 14 ++ exercises/practice/strain/.meta/tests.toml | 52 +++++++ exercises/practice/strain/runtests.jl | 146 ++++++++++++++++++ exercises/practice/strain/strain.jl | 7 + 7 files changed, 275 insertions(+) create mode 100644 exercises/practice/strain/.docs/instructions.md create mode 100644 exercises/practice/strain/.meta/config.json create mode 100644 exercises/practice/strain/.meta/example.jl create mode 100644 exercises/practice/strain/.meta/tests.toml create mode 100644 exercises/practice/strain/runtests.jl create mode 100644 exercises/practice/strain/strain.jl diff --git a/config.json b/config.json index 607c6432..088d565c 100644 --- a/config.json +++ b/config.json @@ -525,6 +525,14 @@ "math" ] }, + { + "slug": "strain", + "name": "Strain", + "uuid": "b16f98d5-60af-4f03-922a-ff2a98fd5c2b", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "protein-translation", "name": "Protein Translation", diff --git a/exercises/practice/strain/.docs/instructions.md b/exercises/practice/strain/.docs/instructions.md new file mode 100644 index 00000000..3469ae65 --- /dev/null +++ b/exercises/practice/strain/.docs/instructions.md @@ -0,0 +1,29 @@ +# Instructions + +Implement the `keep` and `discard` operation on collections. +Given a collection and a predicate on the collection's elements, `keep` returns a new collection containing those elements where the predicate is true, while `discard` returns a new collection containing those elements where the predicate is false. + +For example, given the collection of numbers: + +- 1, 2, 3, 4, 5 + +And the predicate: + +- is the number even? + +Then your keep operation should produce: + +- 2, 4 + +While your discard operation should produce: + +- 1, 3, 5 + +Note that the union of keep and discard is all the elements. + +The functions may be called `keep` and `discard`, or they may need different names in order to not clash with existing functions or concepts in your language. + +## Restrictions + +Keep your hands off that filter/reject/whatchamacallit functionality provided by your standard library! +Solve this one yourself using other basic tools instead. diff --git a/exercises/practice/strain/.meta/config.json b/exercises/practice/strain/.meta/config.json new file mode 100644 index 00000000..954fe391 --- /dev/null +++ b/exercises/practice/strain/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "strain.jl" + ], + "test": [ + "runtests.jl" + ], + "example": [ + ".meta/example.jl" + ] + }, + "blurb": "Implement the `keep` and `discard` operation on collections.", + "source": "Conversation with James Edward Gray II", + "source_url": "http://graysoftinc.com/" +} diff --git a/exercises/practice/strain/.meta/example.jl b/exercises/practice/strain/.meta/example.jl new file mode 100644 index 00000000..ec7f7002 --- /dev/null +++ b/exercises/practice/strain/.meta/example.jl @@ -0,0 +1,14 @@ +function keep(values, predicate) + results = [] + for value in values + if predicate(value) + push!(results, value) + end + end + + results +end + +function discard(values, predicate) + keep(values, x -> !predicate(x)) +end diff --git a/exercises/practice/strain/.meta/tests.toml b/exercises/practice/strain/.meta/tests.toml new file mode 100644 index 00000000..3a617b4a --- /dev/null +++ b/exercises/practice/strain/.meta/tests.toml @@ -0,0 +1,52 @@ +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[26af8c32-ba6a-4eb3-aa0a-ebd8f136e003] +description = "keep on empty list returns empty list" + +[f535cb4d-e99b-472a-bd52-9fa0ffccf454] +description = "keeps everything" + +[950b8e8e-f628-42a8-85e2-9b30f09cde38] +description = "keeps nothing" + +[92694259-6e76-470c-af87-156bdf75018a] +description = "keeps first and last" + +[938f7867-bfc7-449e-a21b-7b00cbb56994] +description = "keeps neither first nor last" + +[8908e351-4437-4d2b-a0f7-770811e48816] +description = "keeps strings" + +[2728036b-102a-4f1e-a3ef-eac6160d876a] +description = "keeps lists" + +[ef16beb9-8d84-451a-996a-14e80607fce6] +description = "discard on empty list returns empty list" + +[2f42f9bc-8e06-4afe-a222-051b5d8cd12a] +description = "discards everything" + +[ca990fdd-08c2-4f95-aa50-e0f5e1d6802b] +description = "discards nothing" + +[71595dae-d283-48ca-a52b-45fa96819d2f] +description = "discards first and last" + +[ae141f79-f86d-4567-b407-919eaca0f3dd] +description = "discards neither first nor last" + +[daf25b36-a59f-4f29-bcfe-302eb4e43609] +description = "discards strings" + +[a38d03f9-95ad-4459-80d1-48e937e4acaf] +description = "discards lists" diff --git a/exercises/practice/strain/runtests.jl b/exercises/practice/strain/runtests.jl new file mode 100644 index 00000000..56d4fb16 --- /dev/null +++ b/exercises/practice/strain/runtests.jl @@ -0,0 +1,146 @@ +using Test + +include("strain.jl") + +@testset verbose = true "tests" begin + @testset "keep" begin + @testset "keep on empty list returns empty list" begin + values = [] + predicate = x -> true + result = keep(values, predicate) + expected = [] + @test result == expected + end + + @testset "keeps everything" begin + values = [1, 3, 5] + predicate = x -> true + result = keep(values, predicate) + expected = [1, 3, 5] + @test result == expected + end + + @testset "keeps nothing" begin + values = [1, 3, 5] + predicate = x -> false + result = keep(values, predicate) + expected = [] + @test result == expected + end + + @testset "keeps first and last" begin + values = [1, 2, 3] + predicate = x -> x % 2 == 1 + result = keep(values, predicate) + expected = [1, 3] + @test result == expected + end + + @testset "keeps neither first nor last" begin + values = [1, 2, 3] + predicate = x -> x % 2 == 0 + result = keep(values, predicate) + expected = [2] + @test result == expected + end + + @testset "keeps strings" begin + values = ["apple", "zebra", "banana", "zombies", "cherimoya", "zealot"] + predicate = x -> startswith(x, 'z') + result = keep(values, predicate) + expected = ["zebra", "zombies", "zealot"] + @test result == expected + end + + @testset "keeps lists" begin + values = [ + [1, 2, 3], + [5, 5, 5], + [5, 1, 2], + [2, 1, 2], + [1, 5, 2], + [2, 2, 1], + [1, 2, 5] + ] + predicate = x -> in(5, x) + result = keep(values, predicate) + expected = [ + [5, 5, 5], + [5, 1, 2], + [1, 5, 2], + [1, 2, 5] + ] + @test result == expected + end + end + + @testset "discard" begin + @testset "discard on empty list returns empty list" begin + values = [] + predicate = x -> true + result = discard(values, predicate) + expected = [] + @test result == expected + end + + @testset "discards everything" begin + values = [1, 3, 5] + predicate = x -> true + result = discard(values, predicate) + expected = [] + @test result == expected + end + + @testset "discards nothing" begin + values = [1, 3, 5] + predicate = x -> false + result = discard(values, predicate) + expected = [1, 3, 5] + @test result == expected + end + + @testset "discards first and last" begin + values = [1, 2, 3] + predicate = x -> x % 2 == 1 + result = discard(values, predicate) + expected = [2] + @test result == expected + end + + @testset "discards neither first nor last" begin + values = [1, 2, 3] + predicate = x -> x % 2 == 0 + result = discard(values, predicate) + expected = [1, 3] + @test result == expected + end + + @testset "discards strings" begin + values = ["apple", "zebra", "banana", "zombies", "cherimoya", "zealot"] + predicate = x -> startswith(x, 'z') + result = discard(values, predicate) + expected = ["apple", "banana", "cherimoya"] + @test result == expected + end + + @testset "discards lists" begin + values = [ + [1, 2, 3], + [5, 5, 5], + [5, 1, 2], + [2, 1, 2], + [1, 5, 2], + [2, 2, 1], + [1, 2, 5] + ] + predicate = x -> in(5, x) + result = discard(values, predicate) + expected = [ + [1, 2, 3], + [2, 1, 2], + [2, 2, 1] + ] + @test result == expected + end + end +end diff --git a/exercises/practice/strain/strain.jl b/exercises/practice/strain/strain.jl new file mode 100644 index 00000000..d52d580f --- /dev/null +++ b/exercises/practice/strain/strain.jl @@ -0,0 +1,7 @@ +function keep(values, predicate) + +end + +function discard(values, predicate) + +end