diff --git a/config.json b/config.json index d7cb72ce..91bdb6f3 100644 --- a/config.json +++ b/config.json @@ -648,6 +648,14 @@ "prerequisites": [], "difficulty": 1, "status": "beta" + }, + { + "slug": "series", + "name": "Series", + "uuid": "2ef6f027-a27c-4b00-bf1e-2969baf04a36", + "practices": [], + "prerequisites": [], + "difficulty": 3 } ] }, diff --git a/exercises/practice/series/.docs/instructions.md b/exercises/practice/series/.docs/instructions.md new file mode 100644 index 00000000..fd97a670 --- /dev/null +++ b/exercises/practice/series/.docs/instructions.md @@ -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_. diff --git a/exercises/practice/series/.meta/config.json b/exercises/practice/series/.meta/config.json new file mode 100644 index 00000000..60111780 --- /dev/null +++ b/exercises/practice/series/.meta/config.json @@ -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" +} diff --git a/exercises/practice/series/.meta/example.R b/exercises/practice/series/.meta/example.R new file mode 100644 index 00000000..2c00f0a2 --- /dev/null +++ b/exercises/practice/series/.meta/example.R @@ -0,0 +1,6 @@ +slices <- function(series, slice_length) { + stopifnot(slice_length > 0 & nchar(series) > 0 & nchar(series) >= slice_length) + + slice_indices <- 1:(nchar(series) - slice_length + 1) + sapply(slice_indices, function(i) substr(series, i, i+slice_length-1)) +} diff --git a/exercises/practice/series/.meta/tests.toml b/exercises/practice/series/.meta/tests.toml new file mode 100644 index 00000000..9696f51f --- /dev/null +++ b/exercises/practice/series/.meta/tests.toml @@ -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" diff --git a/exercises/practice/series/series.R b/exercises/practice/series/series.R new file mode 100644 index 00000000..64982502 --- /dev/null +++ b/exercises/practice/series/series.R @@ -0,0 +1,3 @@ +slices <- function(series, slice_length) { + +} diff --git a/exercises/practice/series/test_series.R b/exercises/practice/series/test_series.R new file mode 100644 index 00000000..120a3337 --- /dev/null +++ b/exercises/practice/series/test_series.R @@ -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")) +}) + +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)) +})