New Fetch
This commit is contained in:
83
go/transpose/README.md
Normal file
83
go/transpose/README.md
Normal file
@@ -0,0 +1,83 @@
|
||||
# Transpose
|
||||
|
||||
Given an input text output it transposed.
|
||||
|
||||
Roughly explained, the transpose of a matrix:
|
||||
|
||||
```
|
||||
ABC
|
||||
DEF
|
||||
```
|
||||
|
||||
is given by:
|
||||
|
||||
```
|
||||
AD
|
||||
BE
|
||||
CF
|
||||
```
|
||||
|
||||
Rows become columns and columns become rows. See <https://en.wikipedia.org/wiki/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:
|
||||
|
||||
```
|
||||
ABC
|
||||
DE
|
||||
```
|
||||
|
||||
results in:
|
||||
|
||||
```
|
||||
AD
|
||||
BE
|
||||
C
|
||||
```
|
||||
|
||||
And transposing:
|
||||
|
||||
```
|
||||
AB
|
||||
DEF
|
||||
```
|
||||
|
||||
results in:
|
||||
|
||||
```
|
||||
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).
|
||||
|
||||
## Running the tests
|
||||
|
||||
To run the tests run the command `go test` from within the exercise directory.
|
||||
|
||||
If the test suite contains benchmarks, you can run these with the `-bench`
|
||||
flag:
|
||||
|
||||
go test -bench .
|
||||
|
||||
Keep in mind that each reviewer will run benchmarks on a different machine, with
|
||||
different specs, so the results from these benchmark tests may vary.
|
||||
|
||||
## Further information
|
||||
|
||||
For more detailed information about the Go track, including how to get help if
|
||||
you're having trouble, please visit the exercism.io [Go language page](http://exercism.io/languages/go/about).
|
||||
|
||||
## Source
|
||||
|
||||
Reddit r/dailyprogrammer challenge #270 [Easy]. [https://www.reddit.com/r/dailyprogrammer/comments/4msu2x/challenge_270_easy_transpose_the_input_text](https://www.reddit.com/r/dailyprogrammer/comments/4msu2x/challenge_270_easy_transpose_the_input_text)
|
||||
|
||||
## Submitting Incomplete Solutions
|
||||
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
248
go/transpose/cases_test.go
Normal file
248
go/transpose/cases_test.go
Normal file
@@ -0,0 +1,248 @@
|
||||
package transpose
|
||||
|
||||
// Source: exercism/x-common
|
||||
// Commit: 6dba022 transpose: Fix canonical-data.json formatting
|
||||
// x-common version: 1.0.0
|
||||
|
||||
var testCases = []struct {
|
||||
description string
|
||||
input []string
|
||||
expected []string
|
||||
}{
|
||||
{
|
||||
"empty string",
|
||||
[]string{},
|
||||
[]string{},
|
||||
},
|
||||
{
|
||||
"two characters in a row",
|
||||
[]string{
|
||||
"A1",
|
||||
},
|
||||
[]string{
|
||||
"A",
|
||||
"1",
|
||||
},
|
||||
},
|
||||
{
|
||||
"two characters in a column",
|
||||
[]string{
|
||||
"A",
|
||||
"1",
|
||||
},
|
||||
[]string{
|
||||
"A1",
|
||||
},
|
||||
},
|
||||
{
|
||||
"simple",
|
||||
[]string{
|
||||
"ABC",
|
||||
"123",
|
||||
},
|
||||
[]string{
|
||||
"A1",
|
||||
"B2",
|
||||
"C3",
|
||||
},
|
||||
},
|
||||
{
|
||||
"single line",
|
||||
[]string{
|
||||
"Single line.",
|
||||
},
|
||||
[]string{
|
||||
"S",
|
||||
"i",
|
||||
"n",
|
||||
"g",
|
||||
"l",
|
||||
"e",
|
||||
" ",
|
||||
"l",
|
||||
"i",
|
||||
"n",
|
||||
"e",
|
||||
".",
|
||||
},
|
||||
},
|
||||
{
|
||||
"first line longer than second line",
|
||||
[]string{
|
||||
"The fourth line.",
|
||||
"The fifth line.",
|
||||
},
|
||||
[]string{
|
||||
"TT",
|
||||
"hh",
|
||||
"ee",
|
||||
" ",
|
||||
"ff",
|
||||
"oi",
|
||||
"uf",
|
||||
"rt",
|
||||
"th",
|
||||
"h ",
|
||||
" l",
|
||||
"li",
|
||||
"in",
|
||||
"ne",
|
||||
"e.",
|
||||
".",
|
||||
},
|
||||
},
|
||||
{
|
||||
"second line longer than first line",
|
||||
[]string{
|
||||
"The first line.",
|
||||
"The second line.",
|
||||
},
|
||||
[]string{
|
||||
"TT",
|
||||
"hh",
|
||||
"ee",
|
||||
" ",
|
||||
"fs",
|
||||
"ie",
|
||||
"rc",
|
||||
"so",
|
||||
"tn",
|
||||
" d",
|
||||
"l ",
|
||||
"il",
|
||||
"ni",
|
||||
"en",
|
||||
".e",
|
||||
" .",
|
||||
},
|
||||
},
|
||||
{
|
||||
"square",
|
||||
[]string{
|
||||
"HEART",
|
||||
"EMBER",
|
||||
"ABUSE",
|
||||
"RESIN",
|
||||
"TREND",
|
||||
},
|
||||
[]string{
|
||||
"HEART",
|
||||
"EMBER",
|
||||
"ABUSE",
|
||||
"RESIN",
|
||||
"TREND",
|
||||
},
|
||||
},
|
||||
{
|
||||
"rectangle",
|
||||
[]string{
|
||||
"FRACTURE",
|
||||
"OUTLINED",
|
||||
"BLOOMING",
|
||||
"SEPTETTE",
|
||||
},
|
||||
[]string{
|
||||
"FOBS",
|
||||
"RULE",
|
||||
"ATOP",
|
||||
"CLOT",
|
||||
"TIME",
|
||||
"UNIT",
|
||||
"RENT",
|
||||
"EDGE",
|
||||
},
|
||||
},
|
||||
{
|
||||
"triangle",
|
||||
[]string{
|
||||
"T",
|
||||
"EE",
|
||||
"AAA",
|
||||
"SSSS",
|
||||
"EEEEE",
|
||||
"RRRRRR",
|
||||
},
|
||||
[]string{
|
||||
"TEASER",
|
||||
" EASER",
|
||||
" ASER",
|
||||
" SER",
|
||||
" ER",
|
||||
" R",
|
||||
},
|
||||
},
|
||||
{
|
||||
"many lines",
|
||||
[]string{
|
||||
"Chor. Two households, both alike in dignity,",
|
||||
"In fair Verona, where we lay our scene,",
|
||||
"From ancient grudge break to new mutiny,",
|
||||
"Where civil blood makes civil hands unclean.",
|
||||
"From forth the fatal loins of these two foes",
|
||||
"A pair of star-cross'd lovers take their life;",
|
||||
"Whose misadventur'd piteous overthrows",
|
||||
"Doth with their death bury their parents' strife.",
|
||||
"The fearful passage of their death-mark'd love,",
|
||||
"And the continuance of their parents' rage,",
|
||||
"Which, but their children's end, naught could remove,",
|
||||
"Is now the two hours' traffic of our stage;",
|
||||
"The which if you with patient ears attend,",
|
||||
"What here shall miss, our toil shall strive to mend.",
|
||||
},
|
||||
[]string{
|
||||
"CIFWFAWDTAWITW",
|
||||
"hnrhr hohnhshh",
|
||||
"o oeopotedi ea",
|
||||
"rfmrmash cn t",
|
||||
".a e ie fthow ",
|
||||
" ia fr weh,whh",
|
||||
"Trnco miae ie",
|
||||
"w ciroitr btcr",
|
||||
"oVivtfshfcuhhe",
|
||||
" eeih a uote ",
|
||||
"hrnl sdtln is",
|
||||
"oot ttvh tttfh",
|
||||
"un bhaeepihw a",
|
||||
"saglernianeoyl",
|
||||
"e,ro -trsui ol",
|
||||
"h uofcu sarhu ",
|
||||
"owddarrdan o m",
|
||||
"lhg to'egccuwi",
|
||||
"deemasdaeehris",
|
||||
"sr als t ists",
|
||||
",ebk 'phool'h,",
|
||||
" reldi ffd ",
|
||||
"bweso tb rtpo",
|
||||
"oea ileutterau",
|
||||
"t kcnoorhhnatr",
|
||||
"hl isvuyee'fi ",
|
||||
" atv es iisfet",
|
||||
"ayoior trr ino",
|
||||
"l lfsoh ecti",
|
||||
"ion vedpn l",
|
||||
"kuehtteieadoe ",
|
||||
"erwaharrar,fas",
|
||||
" nekt te rh",
|
||||
"ismdsehphnnosa",
|
||||
"ncuse ra-tau l",
|
||||
" et tormsural",
|
||||
"dniuthwea'g t ",
|
||||
"iennwesnr hsts",
|
||||
"g,ycoi tkrttet",
|
||||
"n ,l r s'a anr",
|
||||
"i ef 'dgcgdi",
|
||||
"t aol eoe,v",
|
||||
"y nei sl,u; e",
|
||||
", .sf to l ",
|
||||
" e rv d t",
|
||||
" ; ie o",
|
||||
" f, r ",
|
||||
" e e m",
|
||||
" . m e",
|
||||
" o n",
|
||||
" v d",
|
||||
" e .",
|
||||
" ,",
|
||||
},
|
||||
},
|
||||
}
|
32
go/transpose/transpose.go
Normal file
32
go/transpose/transpose.go
Normal file
@@ -0,0 +1,32 @@
|
||||
package transpose
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
const testVersion = 1
|
||||
|
||||
func Transpose(inp []string) []string {
|
||||
// find the longest length string in the slice
|
||||
lng := 0
|
||||
for i := range inp {
|
||||
if len(inp[i]) > lng {
|
||||
lng = len(inp[i])
|
||||
}
|
||||
}
|
||||
ret := make([]string, lng, lng)
|
||||
for i := range inp {
|
||||
for j := 0; j < lng; j++ {
|
||||
if len(inp[i]) > j {
|
||||
ret[j] = ret[j] + string(inp[i][j])
|
||||
} else {
|
||||
ret[j] = ret[j] + " "
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(ret) > 0 {
|
||||
// Trim the spaces off of the end of the last line
|
||||
ret[len(ret)-1] = strings.TrimRight(ret[len(ret)-1], " ")
|
||||
}
|
||||
return ret
|
||||
}
|
52
go/transpose/transpose_test.go
Normal file
52
go/transpose/transpose_test.go
Normal file
@@ -0,0 +1,52 @@
|
||||
package transpose
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
|
||||
const targetTestVersion = 1
|
||||
|
||||
func TestTestVersion(t *testing.T) {
|
||||
if testVersion != targetTestVersion {
|
||||
t.Fatalf("Found testVersion = %v, want %v", testVersion, targetTestVersion)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTranspose(t *testing.T) {
|
||||
for _, test := range testCases {
|
||||
actual := Transpose(test.input)
|
||||
if !reflect.DeepEqual(actual, test.expected) {
|
||||
// check for zero length slices
|
||||
if len(actual) == 0 || len(test.expected) == 0 {
|
||||
t.Fatalf("\n\tTranspose(%q): %s\n\n\tExpected: %q\n\tGot: %q",
|
||||
test.input, test.description, test.expected, actual)
|
||||
}
|
||||
// let's make the error more specific and find the row it's on
|
||||
min := min(len(test.expected), len(actual))
|
||||
for i := 0; i < min; i++ {
|
||||
if test.expected[i] != actual[i] {
|
||||
t.Fatalf("\n\tTranspose(%q): %s\n\n\tExpected: %q\n\tGot: %q\n\n\tRow %d Expected: %q Got: %q",
|
||||
test.input, test.description, test.expected, actual, i, test.expected[i], actual[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// helper function
|
||||
// https://stackoverflow.com/questions/27516387/what-is-the-correct-way-to-find-the-min-between-two-integers-in-go
|
||||
func min(a, b int) int {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
func BenchmarkTranspose(b *testing.B) {
|
||||
for _, test := range testCases {
|
||||
for i := 0; i < b.N; i++ {
|
||||
Transpose(test.input)
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user