Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[matrix] Implementation #630

Merged
merged 8 commits into from Jun 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 9 additions & 0 deletions config.json
Expand Up @@ -589,6 +589,15 @@
"prerequisites": [],
"difficulty": 1,
"topics": []
},
{
"slug": "matrix",
"name": "Matrix",
"uuid": "50ba9ec3-93a7-4963-868e-0d08f7c01acd",
"practices": [],
"prerequisites": [],
"difficulty": 1,
"topics": []
}
]
},
Expand Down
38 changes: 38 additions & 0 deletions exercises/practice/matrix/.docs/instructions.md
@@ -0,0 +1,38 @@
# Instructions

Given a string representing a matrix of numbers, return the rows and columns of that matrix.

So given a string with embedded newlines like:

```text
9 8 7
5 3 2
6 6 7
```

representing this matrix:

```text
1 2 3
|---------
1 | 9 8 7
2 | 5 3 2
3 | 6 6 7
```

your code should be able to spit out:

- A list of the rows, reading each row left-to-right while moving top-to-bottom across the rows,
- A list of the columns, reading each column top-to-bottom while moving from left-to-right.

The rows for our example matrix:

- 9, 8, 7
- 5, 3, 2
- 6, 6, 7

And its columns:

- 9, 5, 6
- 8, 3, 6
- 7, 2, 7
19 changes: 19 additions & 0 deletions exercises/practice/matrix/.meta/config.json
@@ -0,0 +1,19 @@
{
"authors": [
"habere-et-dispertire"
],
"files": {
"solution": [
"Matrix.rakumod"
],
"test": [
"matrix.rakutest"
],
"example": [
".meta/solutions/Matrix.rakumod"
]
},
"blurb": "Given a string representing a matrix of numbers, return the rows and columns of that matrix.",
"source": "Exercise by the JumpstartLab team for students at The Turing School of Software and Design.",
"source_url": "https://turing.edu"
}
9 changes: 9 additions & 0 deletions exercises/practice/matrix/.meta/solutions/Matrix.rakumod
@@ -0,0 +1,9 @@
unit module Matrix;

sub extract-row(:$string, :$index) is export {
$string.lines[$index.pred].words
}

sub extract-column(:$string, :$index) is export {
gather for $string.lines { take .words[$index.pred] }
}
1 change: 1 addition & 0 deletions exercises/practice/matrix/.meta/solutions/matrix.rakutest
38 changes: 38 additions & 0 deletions exercises/practice/matrix/.meta/template-data.yaml
@@ -0,0 +1,38 @@
properties:
row:
test: |-
sprintf(q:to/END/, %case<input><string>.raku, %case<input><index>, %case<expected>.List<>.raku, %case<description>.raku);
cmp-ok(
extract-row( :string(%s), :index(%s) ),
"~~",
%s,
%s,
);
END
column:
test: |-
sprintf(q:to/END/, %case<input><string>.raku, %case<input><index>, %case<expected>.List<>.raku, %case<description>.raku);
cmp-ok(
extract-column( :string(%s), :index(%s) ),
"~~",
%s,
%s,
);
END

unit: module
example: |-
sub extract-row(:$string, :$index) is export {
$string.lines[$index.pred].words
}

sub extract-column(:$string, :$index) is export {
gather for $string.lines { take .words[$index.pred] }
}

stub: |-
sub extract-row(:$string, :$index) is export {
}

sub extract-column(:$string, :$index) is export {
}
34 changes: 34 additions & 0 deletions exercises/practice/matrix/.meta/tests.toml
@@ -0,0 +1,34 @@
# 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.

[ca733dab-9d85-4065-9ef6-a880a951dafd]
description = "extract row from one number matrix"

[5c93ec93-80e1-4268-9fc2-63bc7d23385c]
description = "can extract row"

[2f1aad89-ad0f-4bd2-9919-99a8bff0305a]
description = "extract row where numbers have different widths"

[68f7f6ba-57e2-4e87-82d0-ad09889b5204]
description = "can extract row from non-square matrix with no corresponding column"

[e8c74391-c93b-4aed-8bfe-f3c9beb89ebb]
description = "extract column from one number matrix"

[7136bdbd-b3dc-48c4-a10c-8230976d3727]
description = "can extract column"

[ad64f8d7-bba6-4182-8adf-0c14de3d0eca]
description = "can extract column from non-square matrix with no corresponding row"

[9eddfa5c-8474-440e-ae0a-f018c2a0dd89]
description = "extract column where numbers have different widths"
7 changes: 7 additions & 0 deletions exercises/practice/matrix/Matrix.rakumod
@@ -0,0 +1,7 @@
unit module Matrix;

sub extract-row(:$string, :$index) is export {
}

sub extract-column(:$string, :$index) is export {
}
62 changes: 62 additions & 0 deletions exercises/practice/matrix/matrix.rakutest
@@ -0,0 +1,62 @@
#!/usr/bin/env raku
use Test;
use lib $?FILE.IO.dirname;
use Matrix;

cmp-ok( # begin: ca733dab-9d85-4065-9ef6-a880a951dafd
extract-row( :string("1"), :index(1) ),
"~~",
(1,),
"extract row from one number matrix",
); # end: ca733dab-9d85-4065-9ef6-a880a951dafd

cmp-ok( # begin: 5c93ec93-80e1-4268-9fc2-63bc7d23385c
extract-row( :string("1 2\n3 4"), :index(2) ),
"~~",
(3, 4),
"can extract row",
); # end: 5c93ec93-80e1-4268-9fc2-63bc7d23385c

cmp-ok( # begin: 2f1aad89-ad0f-4bd2-9919-99a8bff0305a
extract-row( :string("1 2\n10 20"), :index(2) ),
"~~",
(10, 20),
"extract row where numbers have different widths",
); # end: 2f1aad89-ad0f-4bd2-9919-99a8bff0305a

cmp-ok( # begin: 68f7f6ba-57e2-4e87-82d0-ad09889b5204
extract-row( :string("1 2 3\n4 5 6\n7 8 9\n8 7 6"), :index(4) ),
"~~",
(8, 7, 6),
"can extract row from non-square matrix with no corresponding column",
); # end: 68f7f6ba-57e2-4e87-82d0-ad09889b5204

cmp-ok( # begin: e8c74391-c93b-4aed-8bfe-f3c9beb89ebb
extract-column( :string("1"), :index(1) ),
"~~",
(1,),
"extract column from one number matrix",
); # end: e8c74391-c93b-4aed-8bfe-f3c9beb89ebb

cmp-ok( # begin: 7136bdbd-b3dc-48c4-a10c-8230976d3727
extract-column( :string("1 2 3\n4 5 6\n7 8 9"), :index(3) ),
"~~",
(3, 6, 9),
"can extract column",
); # end: 7136bdbd-b3dc-48c4-a10c-8230976d3727

cmp-ok( # begin: ad64f8d7-bba6-4182-8adf-0c14de3d0eca
extract-column( :string("1 2 3 4\n5 6 7 8\n9 8 7 6"), :index(4) ),
"~~",
(4, 8, 6),
"can extract column from non-square matrix with no corresponding row",
); # end: ad64f8d7-bba6-4182-8adf-0c14de3d0eca

cmp-ok( # begin: 9eddfa5c-8474-440e-ae0a-f018c2a0dd89
extract-column( :string("89 1903 3\n18 3 1\n9 4 800"), :index(2) ),
"~~",
(1903, 3, 4),
"extract column where numbers have different widths",
); # end: 9eddfa5c-8474-440e-ae0a-f018c2a0dd89

done-testing;