Skip to content

Commit

Permalink
Implement exercise 'strain'
Browse files Browse the repository at this point in the history
  • Loading branch information
ingydotnet committed Oct 10, 2024
1 parent 27d1be6 commit e88788a
Show file tree
Hide file tree
Showing 15 changed files with 591 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,14 @@
"prerequisites": [],
"difficulty": 2
},
{
"slug": "strain",
"name": "Strain",
"uuid": "1306a71c-5ddb-4421-a119-c4b5f2f38efe",
"practices": [],
"prerequisites": [],
"difficulty": 2
},
{
"slug": "triangle",
"name": "Triangle",
Expand Down
7 changes: 7 additions & 0 deletions config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,13 @@ exercises:
prerequisites: []
difficulty: 2

- slug: strain
name: Strain
uuid: 1306a71c-5ddb-4421-a119-c4b5f2f38efe
practices: []
prerequisites: []
difficulty: 2

- slug: triangle
name: Triangle
uuid: 494f403b-3bd7-47f1-a866-d07e9faea677
Expand Down
29 changes: 29 additions & 0 deletions exercises/practice/strain/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -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.
1 change: 1 addition & 0 deletions exercises/practice/strain/.meta/.yamlscript/exercise.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
YS_VERSION := 0.1.75
28 changes: 28 additions & 0 deletions exercises/practice/strain/.meta/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
SHELL := bash

BASE := $(shell pwd)

export YS_VERSION := 0.1.79

YS_LOCAL_PREFIX := ../../../../.local/v$(YS_VERSION)

YS_LOCAL_BIN := $(YS_LOCAL_PREFIX)/bin

YS_BIN := $(YS_LOCAL_BIN)/ys-$(YS_VERSION)

TEST_FILE ?= $(wildcard *-test.ys)


export PATH := $(YS_LOCAL_BIN):$(PATH)

export YSPATH := $(BASE)


default:

test: $(YS_BIN)
prove -v $(TEST_FILE)

$(YS_BIN):
curl -s https://yamlscript.org/install | \
BIN=1 VERSION=$(YS_VERSION) PREFIX=$(YS_LOCAL_PREFIX) bash >/dev/null
23 changes: 23 additions & 0 deletions exercises/practice/strain/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"authors": [
"ingydotnet"
],
"files": {
"solution": [
"strain.ys"
],
"test": [
"strain-test.ys",
"GNUmakefile",
"Makefile",
".yamlscript/exercise.mk",
".yamlscript/exercism-ys-installer"
],
"example": [
".meta/strain.ys"
]
},
"blurb": "Implement the `keep` and `discard` operation on collections.",
"source": "Conversation with James Edward Gray II",
"source_url": "http://graysoftinc.com/"
}
125 changes: 125 additions & 0 deletions exercises/practice/strain/.meta/strain-test.ys
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
#!/usr/bin/env ys-0

require ys::taptest: :all

use: strain

test::
- name: Keep on empty list returns empty list
code: 'keep([] "fn([x] true)")'
want: []
uuid: 26af8c32-ba6a-4eb3-aa0a-ebd8f136e003

- name: Keeps everything
code: keep([1 3 5] "fn(x):\ true")
want:
- 1
- 3
- 5
uuid: f535cb4d-e99b-472a-bd52-9fa0ffccf454

- name: Keeps nothing
code: keep([1 3 5] "fn(x):\ false")
want: []
uuid: 950b8e8e-f628-42a8-85e2-9b30f09cde38

- name: Keeps first and last
code: keep([1 2 3] "fn(x):\ (x % 2) == 1")
want:
- 1
- 3
uuid: 92694259-6e76-470c-af87-156bdf75018a

- name: Keeps neither first nor last
code: keep([1 2 3] "fn(x):\ (x % 2) == 0")
want:
- 2
uuid: 938f7867-bfc7-449e-a21b-7b00cbb56994

- name: Keeps strings
code: keep(
qw(apple zebra banana zombies cherimoya zealot)
"fn(x):\ starts?(x, 'z')")
want:
- zebra
- zombies
- zealot
uuid: 8908e351-4437-4d2b-a0f7-770811e48816

- name: Keeps lists
code: keep(
[[1 2 3] [5 5 5] [5 1 2] [2 1 2] [1 5 2] [2 2 1] [1 2 5]]
"fn(x):\ has?(x, 5)")
want:
- - 5
- 5
- 5
- - 5
- 1
- 2
- - 1
- 5
- 2
- - 1
- 2
- 5
uuid: 2728036b-102a-4f1e-a3ef-eac6160d876a

- name: Discard on empty list returns empty list
code: discard([] "fn(x):\ true")
want: []
uuid: ef16beb9-8d84-451a-996a-14e80607fce6

- name: Discards everything
code: discard([1 3 5] "fn(x):\ true")
want: []
uuid: 2f42f9bc-8e06-4afe-a222-051b5d8cd12a

- name: Discards nothing
code: discard([1 3 5] "fn(x):\ false")
want:
- 1
- 3
- 5
uuid: ca990fdd-08c2-4f95-aa50-e0f5e1d6802b

- name: Discards first and last
code: discard([1 2 3] "fn(x):\ (x % 2) == 1")
want:
- 2
uuid: 71595dae-d283-48ca-a52b-45fa96819d2f

- name: Discards neither first nor last
code: discard([1 2 3] "fn(x):\ (x % 2) == 0")
want:
- 1
- 3
uuid: ae141f79-f86d-4567-b407-919eaca0f3dd

- name: Discards strings
code: discard(
qw(apple zebra banana zombies cherimoya zealot)
"fn(x):\ starts?(x, 'z')")
want:
- apple
- banana
- cherimoya
uuid: daf25b36-a59f-4f29-bcfe-302eb4e43609

- name: Discards lists
code: discard(
[[1 2 3] [5 5 5] [5 1 2] [2 1 2] [1 5 2] [2 2 1] [1 2 5]]
"fn(x):\ has?(x, 5)")
want:
- - 1
- 2
- 3
- - 2
- 1
- 2
- - 2
- 2
- 1
uuid: a38d03f9-95ad-4459-80d1-48e937e4acaf

done: 14
15 changes: 15 additions & 0 deletions exercises/practice/strain/.meta/strain.ys
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
!yamlscript/v0

defn keep(list predicate):
filter eval(predicate): list

defn discard(list predicate):
remove eval(predicate): list

# XXX: eval targeted to be in ys::std on 0.1.80
defn eval(code):
str("!yamlscript/v0\n$code"):
.ys/compile()
.replace(/(?s)^\(\+\+\+ (.*)\)$/ '$1')
.read-string()
.clojure::core/eval()
52 changes: 52 additions & 0 deletions exercises/practice/strain/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -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"
1 change: 1 addition & 0 deletions exercises/practice/strain/.yamlscript/exercise.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
YS_VERSION := 0.1.75
Loading

0 comments on commit e88788a

Please sign in to comment.