Skip to content

Commit

Permalink
series: add exercise
Browse files Browse the repository at this point in the history
  • Loading branch information
ErikSchierboom committed Sep 11, 2024
1 parent 7df038b commit 981cb51
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -648,6 +648,14 @@
"prerequisites": [],
"difficulty": 1,
"status": "beta"
},
{
"slug": "series",
"name": "Series",
"uuid": "2ef6f027-a27c-4b00-bf1e-2969baf04a36",
"practices": [],
"prerequisites": [],
"difficulty": 3
}
]
},
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": [
"series.R"
],
"test": [
"test_series.R"
],
"example": [
".meta/example.R"
]
},
"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"
}
6 changes: 6 additions & 0 deletions exercises/practice/series/.meta/example.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
slices <- function(series, slice_length) {
stopifnot(slice_length > 0 & nchar(series) > 0 & nchar(series) >= slice_length)

Check warning on line 2 in exercises/practice/series/.meta/example.R

View workflow job for this annotation

GitHub Actions / precheck

file=/home/runner/work/r/r/exercises/practice/series/.meta/example.R,line=2,col=81,[a] Lines should not be more than 80 characters. This line is 81 characters.

slice_indices <- 1:(nchar(series) - slice_length + 1)
sapply(slice_indices, function(i) substr(series, i, i+slice_length-1))

Check warning on line 5 in exercises/practice/series/.meta/example.R

View workflow job for this annotation

GitHub Actions / precheck

file=/home/runner/work/r/r/exercises/practice/series/.meta/example.R,line=5,col=56,[f] Put spaces around all infix operators.

Check warning on line 5 in exercises/practice/series/.meta/example.R

View workflow job for this annotation

GitHub Actions / precheck

file=/home/runner/work/r/r/exercises/practice/series/.meta/example.R,line=5,col=69,[f] Put spaces around all infix operators.
}
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/series.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
slices <- function(series, slice_length) {

}
46 changes: 46 additions & 0 deletions exercises/practice/series/test_series.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
source("./series.R")
library(testthat)

test_that("Slices of one from one", {
expect_equal(slices("1", 1), c("1"))
})

test_that("Slices of one from two", {
expect_equal(slices("12", 1), c("1", "2"))
})

test_that("Slices of two", {
expect_equal(slices("35", 2), c("35"))
})

test_that("Slices of two overlap", {
expect_equal(slices("9142", 2), c("91", "14", "42"))
})

test_that("Slices can include duplicates", {
expect_equal(slices("777777", 3), c("777", "777", "777", "777"))
})

test_that("Slices of a long series", {
expect_equal(slices("918493904243", 5), c("91849", "18493", "84939", "49390", "93904", "39042", "90424", "04243"))

Check warning on line 25 in exercises/practice/series/test_series.R

View workflow job for this annotation

GitHub Actions / precheck

file=/home/runner/work/r/r/exercises/practice/series/test_series.R,line=25,col=81,[a] Lines should not be more than 80 characters. This line is 116 characters.
})

test_that("Slice length is too large", {
expect_error(slices("12345", 6))
})

test_that("Slice length is way too large", {
expect_error(slices("12345", 42))
})

test_that("Slice length cannot be zero", {
expect_error(slices("12345", 0))
})

test_that("Slice length cannot be negative", {
expect_error(slices("123", -1))
})

test_that("Empty series is invalid", {
expect_error(slices("", 1))
})

0 comments on commit 981cb51

Please sign in to comment.