Skip to content

Commit

Permalink
Add transpose exercise (#267)
Browse files Browse the repository at this point in the history
  • Loading branch information
keiravillekode authored Jan 19, 2024
1 parent b6953f8 commit 7cc1d43
Show file tree
Hide file tree
Showing 8 changed files with 583 additions and 0 deletions.
9 changes: 9 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,15 @@
"math"
]
},
{
"slug": "transpose",
"name": "Transpose",
"uuid": "5184de5a-4772-4389-aa3c-b1117b601450",
"practices": [],
"prerequisites": [],
"difficulty": 5,
"topics": []
},
{
"slug": "perfect-numbers",
"name": "Perfect Numbers",
Expand Down
61 changes: 61 additions & 0 deletions exercises/practice/transpose/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Instructions

Given an input text output it transposed.

Roughly explained, the transpose of a matrix:

```text
ABC
DEF
```

is given by:

```text
AD
BE
CF
```

Rows become columns and columns become rows.
See [transpose][].

If the input has rows of different lengths, this is to be solved as follows:

- Pad to the left with spaces.
- Don't pad to the right.

Therefore, transposing this matrix:

```text
ABC
DE
```

results in:

```text
AD
BE
C
```

And transposing:

```text
AB
DEF
```

results in:

```text
AD
BE
F
```

In general, all characters from the input should also be present in the transposed output.
That means that if a column in the input text contains only spaces on its bottom-most row(s), the corresponding output row should contain the spaces in its right-most column(s).

[transpose]: https://en.wikipedia.org/wiki/Transpose
19 changes: 19 additions & 0 deletions exercises/practice/transpose/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"keiravillekode"
],
"files": {
"solution": [
"transpose.sml"
],
"test": [
"test.sml"
],
"example": [
".meta/example.sml"
]
},
"blurb": "Take input text and output it transposed.",
"source": "Reddit r/dailyprogrammer challenge #270 [Easy].",
"source_url": "https://web.archive.org/web/20230630051421/https://old.reddit.com/r/dailyprogrammer/comments/4msu2x/challenge_270_easy_transpose_the_input_text/"
}
29 changes: 29 additions & 0 deletions exercises/practice/transpose/.meta/example.sml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
fun transpose (lines: string list): string list =
let
fun spaces (n: int): string =
if n = 0 then ""
else " " ^ spaces (n -1)

fun generateLine (index: int): string =
let
fun recurse (gap: int) (remaining: string list): string =
case remaining of
nil => ""
| first :: rest =>
if index >= size first then recurse (gap + 1) rest
else (spaces gap) ^ (String.substring(first, index, 1)) ^ (recurse 0 rest)
in
recurse 0 lines
end

fun generateLines (index: int): string list =
let
val line = generateLine index
in
if line = "" then nil
else line :: generateLines (index + 1)
end
in
generateLines 0
end

46 changes: 46 additions & 0 deletions exercises/practice/transpose/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# 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.

[404b7262-c050-4df0-a2a2-0cb06cd6a821]
description = "empty string"

[a89ce8a3-c940-4703-a688-3ea39412fbcb]
description = "two characters in a row"

[855bb6ae-4180-457c-abd0-ce489803ce98]
description = "two characters in a column"

[5ceda1c0-f940-441c-a244-0ced197769c8]
description = "simple"

[a54675dd-ae7d-4a58-a9c4-0c20e99a7c1f]
description = "single line"

[0dc2ec0b-549d-4047-aeeb-8029fec8d5c5]
description = "first line longer than second line"

[984e2ec3-b3d3-4b53-8bd6-96f5ef404102]
description = "second line longer than first line"

[eccd3784-45f0-4a3f-865a-360cb323d314]
description = "mixed line length"

[85b96b3f-d00c-4f80-8ca2-c8a5c9216c2d]
description = "square"

[b9257625-7a53-4748-8863-e08e9d27071d]
description = "rectangle"

[b80badc9-057e-4543-bd07-ce1296a1ea2c]
description = "triangle"

[76acfd50-5596-4d05-89f1-5116328a7dd9]
description = "jagged triangle"
Loading

0 comments on commit 7cc1d43

Please sign in to comment.