Skip to content

Commit

Permalink
Add series exercise
Browse files Browse the repository at this point in the history
  • Loading branch information
ErikSchierboom authored and BNAndras committed May 26, 2024
1 parent 07f2148 commit 8f7ff36
Show file tree
Hide file tree
Showing 8 changed files with 162 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,14 @@
"prerequisites": [],
"difficulty": 2
},
{
"slug": "series",
"name": "Series",
"uuid": "8546a842-c58e-4bbb-a965-f015f83102d3",
"practices": [],
"prerequisites": [],
"difficulty": 3
},
{
"slug": "isogram",
"name": "Isogram",
Expand Down
19 changes: 19 additions & 0 deletions exercises/practice/series/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Instructions

Given a string of digits, output all the contiguous substrings of length `n` in that string in the order that they appear.

For example, the string "49142" has the following 3-digit series:

- "491"
- "914"
- "142"

And the following 4-digit series:

- "4914"
- "9142"

And if you ask for a 6-digit series from a 5-digit string, you deserve whatever you get.

Note that these series are only required to occupy _adjacent positions_ in the input;
the digits need not be _numerically consecutive_.
19 changes: 19 additions & 0 deletions exercises/practice/series/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"erikschierboom"
],
"files": {
"solution": [
"src/series.art"
],
"test": [
"tests/test-series.art"
],
"example": [
".meta/src/example.art"
]
},
"blurb": "Given a string of digits, output all the contiguous substrings of length `n` in that string.",
"source": "A subset of the Problem 8 at Project Euler",
"source_url": "https://projecteuler.net/problem=8"
}
8 changes: 8 additions & 0 deletions exercises/practice/series/.meta/src/example.art
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
slices: function [series sliceLength][
if sliceLength < 1 -> return null
if sliceLength > size series -> return null
if empty? series -> return null

numberOfSlices: (size series) - sliceLength
map 0..numberOfSlices 'i -> slice series i (i + sliceLength - 1)
]
43 changes: 43 additions & 0 deletions exercises/practice/series/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# 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.

[7ae7a46a-d992-4c2a-9c15-a112d125ebad]
description = "slices of one from one"

[3143b71d-f6a5-4221-aeae-619f906244d2]
description = "slices of one from two"

[dbb68ff5-76c5-4ccd-895a-93dbec6d5805]
description = "slices of two"

[19bbea47-c987-4e11-a7d1-e103442adf86]
description = "slices of two overlap"

[8e17148d-ba0a-4007-a07f-d7f87015d84c]
description = "slices can include duplicates"

[bd5b085e-f612-4f81-97a8-6314258278b0]
description = "slices of a long series"

[6d235d85-46cf-4fae-9955-14b6efef27cd]
description = "slice length is too large"

[d7957455-346d-4e47-8e4b-87ed1564c6d7]
description = "slice length is way too large"

[d34004ad-8765-4c09-8ba1-ada8ce776806]
description = "slice length cannot be zero"

[10ab822d-8410-470a-a85d-23fbeb549e54]
description = "slice length cannot be negative"

[c7ed0812-0e4b-4bf3-99c4-28cbbfc246a2]
description = "empty series is invalid"
3 changes: 3 additions & 0 deletions exercises/practice/series/src/series.art
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
slices: function [series sliceLength][
panic "Please implement the slices function"
]
3 changes: 3 additions & 0 deletions exercises/practice/series/tester.art
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import {unitt}!

runTests.failFast findTests "tests"
59 changes: 59 additions & 0 deletions exercises/practice/series/tests/test-series.art
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import {unitt}!
import {src/series}!

suite "Series" [
test "slices of one from one" [
result: slices "1" 1
assert -> ["1"] = result
]

test.skip "slices of one from two" [
result: slices "12" 1
assert -> ["1", "2"] = result
]

test.skip "slices of two" [
result: slices "35" 2
assert -> ["35"] = result
]

test.skip "slices of two overlap" [
result: slices "9142" 2
assert -> ["91", "14", "42"] = result
]

test.skip "slices can include duplicates" [
result: slices "777777" 3
assert -> ["777", "777", "777", "777"] = result
]

test.skip "slices of a long series" [
result: slices "918493904243" 5
assert -> ["91849", "18493", "84939", "49390", "93904", "39042", "90424", "04243"] = result
]

test.skip "slice length is too large" [
result: slices "12345" 6
assert -> null = result
]

test.skip "slice length is way too large" [
result: slices "12345" 42
assert -> null = result
]

test.skip "slice length cannot be zero" [
result: slices "12345" 0
assert -> null = result
]

test.skip "slice length cannot be negative" [
result: slices "123" neg 1
assert -> null = result
]

test.skip "empty series is invalid" [
result: slices "" 1
assert -> null = result
]
]

0 comments on commit 8f7ff36

Please sign in to comment.