trackler 2.0.8.43 → 2.0.8.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/ceylon/exercises/anagram/source/anagram/AnagramTest.ceylon +3 -2
- data/tracks/ceylon/exercises/bracket-push/source/bracketpush/BracketsTest.ceylon +3 -0
- data/tracks/ceylon/exercises/hamming/source/hamming/HammingTest.ceylon +16 -0
- data/tracks/ceylon/exercises/largest-series-product/source/largestseriesproduct/SeriesTest.ceylon +16 -0
- data/tracks/ceylon/exercises/leap/source/leap/LeapTest.ceylon +1 -0
- data/tracks/ceylon/exercises/react/source/react/ReactorTest.ceylon +2 -0
- data/tracks/ceylon/exercises/sieve/source/sieve/SieveTest.ceylon +1 -0
- data/tracks/crystal/exercises/sieve/src/example.cr +3 -2
- data/tracks/csharp/.github/stale.yml +0 -0
- data/tracks/csharp/exercises/house/HINTS.md +3 -0
- data/tracks/csharp/exercises/saddle-points/HINTS.md +4 -0
- data/tracks/fsharp/.github/stale.yml +0 -0
- data/tracks/go/.github/stale.yml +22 -0
- data/tracks/go/README.md +26 -15
- data/tracks/go/exercises/bob/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/bowling/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/change/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/clock/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/connect/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/custom-set/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/forth/.meta/gen.go +71 -0
- data/tracks/go/exercises/forth/cases_test.go +259 -236
- data/tracks/go/exercises/forth/forth_test.go +19 -34
- data/tracks/go/exercises/gigasecond/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/hamming/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/largest-series-product/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/leap/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/luhn/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/meetup/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/raindrops/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/rna-transcription/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/roman-numerals/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/transpose/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/exercises/word-count/{example_gen.go → .meta/gen.go} +1 -1
- data/tracks/go/gen/gen.go +9 -9
- data/tracks/purescript/config.json +7 -0
- data/tracks/purescript/exercises/binary-search/bower.json +16 -0
- data/tracks/purescript/exercises/binary-search/examples/src/BinarySearch.purs +19 -0
- data/tracks/purescript/exercises/binary-search/src/BinarySearch.purs +3 -0
- data/tracks/purescript/exercises/binary-search/test/Main.purs +53 -0
- data/tracks/python/config.json +6 -0
- data/tracks/python/exercises/rectangles/rectangles_test.py +68 -41
- data/tracks/python/exercises/transpose/example.py +6 -0
- data/tracks/python/exercises/transpose/transpose.py +2 -0
- data/tracks/python/exercises/transpose/transpose_test.py +264 -0
- metadata +32 -20
- data/tracks/go/exercises/forth/example_gen.go +0 -99
data/tracks/go/gen/gen.go
CHANGED
@@ -26,11 +26,10 @@ import (
|
|
26
26
|
// └── xgo
|
27
27
|
var dirMetadata string
|
28
28
|
|
29
|
-
//
|
30
|
-
// This assumes that the generator script lives in the
|
31
|
-
// the
|
32
|
-
|
33
|
-
var dirProblem string
|
29
|
+
// dirExercise is the location that the test cases should be generated to.
|
30
|
+
// This assumes that the generator script lives in the .meta directory within
|
31
|
+
// the exercise directory. Falls back to the present working directory.
|
32
|
+
var dirExercise string
|
34
33
|
|
35
34
|
// Header tells how the test data was generated, for display in the header of cases_test.go
|
36
35
|
type Header struct {
|
@@ -58,13 +57,14 @@ func init() {
|
|
58
57
|
dirMetadata = filepath.Join(path, "..", "..", "..", "x-common")
|
59
58
|
}
|
60
59
|
if _, path, _, ok := runtime.Caller(2); ok {
|
61
|
-
|
60
|
+
dirExercise = filepath.Join(path, "..", "..")
|
62
61
|
}
|
63
|
-
if
|
64
|
-
|
62
|
+
if dirExercise == "" {
|
63
|
+
dirExercise = "."
|
65
64
|
}
|
66
65
|
}
|
67
66
|
|
67
|
+
// Gen generates the exercise cases_test.go file from the relevant canonical-data.json
|
68
68
|
func Gen(exercise string, j interface{}, t *template.Template) error {
|
69
69
|
if dirMetadata == "" {
|
70
70
|
return errors.New("unable to determine current path")
|
@@ -116,7 +116,7 @@ func Gen(exercise string, j interface{}, t *template.Template) error {
|
|
116
116
|
return err
|
117
117
|
}
|
118
118
|
// write output file for the Go test cases.
|
119
|
-
return ioutil.WriteFile(filepath.Join(
|
119
|
+
return ioutil.WriteFile(filepath.Join(dirExercise, "cases_test.go"), src, 0666)
|
120
120
|
}
|
121
121
|
|
122
122
|
func getPath(jFile string) (jPath, jOrigin, jCommit string) {
|
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"name": "binary-search",
|
3
|
+
"ignore": [
|
4
|
+
"**/.*",
|
5
|
+
"node_modules",
|
6
|
+
"bower_components",
|
7
|
+
"output"
|
8
|
+
],
|
9
|
+
"dependencies": {
|
10
|
+
"purescript-prelude": "^2.5.0"
|
11
|
+
},
|
12
|
+
"devDependencies": {
|
13
|
+
"purescript-psci-support": "^2.0.0",
|
14
|
+
"purescript-test-unit": "^10.1.0"
|
15
|
+
}
|
16
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module BinarySearch
|
2
|
+
( find
|
3
|
+
) where
|
4
|
+
|
5
|
+
import Prelude
|
6
|
+
import Data.Array (length, (!!))
|
7
|
+
import Data.Maybe (Maybe(Just, Nothing))
|
8
|
+
|
9
|
+
find :: Int -> Array Int -> Maybe Int
|
10
|
+
find i a = go 0 (length a - 1)
|
11
|
+
where go l h | l > h = Nothing
|
12
|
+
go l h =
|
13
|
+
let m = l + (h - l) / 2
|
14
|
+
in case a !! m of
|
15
|
+
Nothing -> Nothing
|
16
|
+
Just j | j == i -> Just m
|
17
|
+
| j < i -> go (m + 1) h
|
18
|
+
| otherwise -> go l (m - 1)
|
19
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Test.Main where
|
2
|
+
|
3
|
+
import Prelude
|
4
|
+
import Control.Monad.Eff (Eff)
|
5
|
+
import Data.Maybe (Maybe(..))
|
6
|
+
import Test.Unit.Assert as Assert
|
7
|
+
import Test.Unit (suite, test)
|
8
|
+
import Test.Unit.Main (runTest)
|
9
|
+
import BinarySearch (find)
|
10
|
+
|
11
|
+
main :: Eff _ Unit
|
12
|
+
main = runTest do
|
13
|
+
suite "BinarySearch.find" do
|
14
|
+
|
15
|
+
test "finds a value in an array with one element" $
|
16
|
+
Assert.equal (Just 0)
|
17
|
+
(find 6 [6])
|
18
|
+
|
19
|
+
test "finds a value in the middle of an array" $
|
20
|
+
Assert.equal (Just 3)
|
21
|
+
(find 6 [1,3,4,6,8,9,11])
|
22
|
+
|
23
|
+
test "finds a value at the beginning of an array" $
|
24
|
+
Assert.equal (Just 0)
|
25
|
+
(find 1 [1,3,4,6,8,9,11])
|
26
|
+
|
27
|
+
test "finds a value at the end of an array" $
|
28
|
+
Assert.equal (Just 6)
|
29
|
+
(find 11 [1,3,4,6,8,9,11])
|
30
|
+
|
31
|
+
test "finds a value in an array of odd length" $
|
32
|
+
Assert.equal (Just 9)
|
33
|
+
(find 144 [1,3,5,8,13,21,34,55,89,144,233,377,634])
|
34
|
+
|
35
|
+
test "finds a value in an array of even length" $
|
36
|
+
Assert.equal (Just 5)
|
37
|
+
(find 21 [1,3,5,8,13,21,34,55,89,144,233,377])
|
38
|
+
|
39
|
+
test "identifies that a value is not included in the array" $
|
40
|
+
Assert.equal Nothing
|
41
|
+
(find 7 [1,3,4,6,8,9,11])
|
42
|
+
|
43
|
+
test "a value smaller than the array's smallest value is not included" $
|
44
|
+
Assert.equal Nothing
|
45
|
+
(find 0 [1,3,4,6,8,9,11])
|
46
|
+
|
47
|
+
test "a value larger than the array's largest value is not included" $
|
48
|
+
Assert.equal Nothing
|
49
|
+
(find 13 [1,3,4,6,8,9,11])
|
50
|
+
|
51
|
+
test "nothing is included in an empty array" $
|
52
|
+
Assert.equal Nothing
|
53
|
+
(find 1 [])
|
data/tracks/python/config.json
CHANGED
@@ -3,64 +3,91 @@ import unittest
|
|
3
3
|
from rectangles import count
|
4
4
|
|
5
5
|
|
6
|
+
# test cases adapted from `x-common//canonical-data.json` @ version: 1.0.0
|
7
|
+
|
6
8
|
class WordTest(unittest.TestCase):
|
7
|
-
def
|
8
|
-
self.assertEqual(count(), 0)
|
9
|
+
def test_no_rows(self):
|
10
|
+
self.assertEqual(count([]), 0)
|
9
11
|
|
10
|
-
def
|
11
|
-
|
12
|
-
self.assertEqual(count(lines), 0)
|
12
|
+
def test_no_columns(self):
|
13
|
+
self.assertEqual(count(['']), 0)
|
13
14
|
|
14
|
-
def
|
15
|
-
|
16
|
-
self.assertEqual(count(lines), 0)
|
15
|
+
def test_no_rectangles(self):
|
16
|
+
self.assertEqual(count([' ']), 0)
|
17
17
|
|
18
18
|
def test_one_rectangle(self):
|
19
|
-
lines = [
|
20
|
-
|
21
|
-
|
19
|
+
lines = ['+-+',
|
20
|
+
'| |',
|
21
|
+
'+-+']
|
22
22
|
self.assertEqual(count(lines), 1)
|
23
23
|
|
24
|
-
def
|
25
|
-
lines = [
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
def test_two_rectangles_without_shared_parts(self):
|
25
|
+
lines = [' +-+',
|
26
|
+
' | |',
|
27
|
+
'+-+-+',
|
28
|
+
'| | ',
|
29
|
+
'+-+ ']
|
30
30
|
self.assertEqual(count(lines), 2)
|
31
31
|
|
32
|
-
def
|
33
|
-
lines = [
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
32
|
+
def test_five_rectangles_with_shared_parts(self):
|
33
|
+
lines = [' +-+',
|
34
|
+
' | |',
|
35
|
+
'+-+-+',
|
36
|
+
'| | |',
|
37
|
+
'+-+-+']
|
38
38
|
self.assertEqual(count(lines), 5)
|
39
39
|
|
40
|
-
def
|
41
|
-
lines = [
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
40
|
+
def test_rectangle_of_height_1_is_counted(self):
|
41
|
+
lines = ['+--+',
|
42
|
+
'+--+']
|
43
|
+
self.assertEqual(count(lines), 1)
|
44
|
+
|
45
|
+
def test_rectangle_of_width_1_is_counted(self):
|
46
|
+
lines = ['++',
|
47
|
+
'||',
|
48
|
+
'++']
|
49
|
+
self.assertEqual(count(lines), 1)
|
50
|
+
|
51
|
+
def test_1x1_square_is_counted(self):
|
52
|
+
lines = ['++',
|
53
|
+
'++']
|
54
|
+
self.assertEqual(count(lines), 1)
|
55
|
+
|
56
|
+
def test_only_complete_rectangles_are_counted(self):
|
57
|
+
lines = [' +-+',
|
58
|
+
' |',
|
59
|
+
'+-+-+',
|
60
|
+
'| | -',
|
61
|
+
'+-+-+']
|
46
62
|
self.assertEqual(count(lines), 1)
|
47
63
|
|
48
|
-
def
|
49
|
-
lines = [
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
64
|
+
def test_rectangles_can_be_of_different_sizes(self):
|
65
|
+
lines = ['+------+----+',
|
66
|
+
'| | |',
|
67
|
+
'+---+--+ |',
|
68
|
+
'| | |',
|
69
|
+
'+---+-------+']
|
54
70
|
self.assertEqual(count(lines), 3)
|
55
71
|
|
56
|
-
def
|
57
|
-
lines = [
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
72
|
+
def test_corner_is_required_for_a_rectangle_to_be_complete(self):
|
73
|
+
lines = ['+------+----+',
|
74
|
+
'| | |',
|
75
|
+
'+------+ |',
|
76
|
+
'| | |',
|
77
|
+
'+---+-------+']
|
62
78
|
self.assertEqual(count(lines), 2)
|
63
79
|
|
80
|
+
def test_large_input_with_many_rectangles(self):
|
81
|
+
lines = ['+---+--+----+',
|
82
|
+
'| +--+----+',
|
83
|
+
'+---+--+ |',
|
84
|
+
'| +--+----+',
|
85
|
+
'+---+--+--+-+',
|
86
|
+
'+---+--+--+-+',
|
87
|
+
'+------+ | |',
|
88
|
+
' +-+']
|
89
|
+
self.assertEqual(count(lines), 60)
|
90
|
+
|
64
91
|
|
65
92
|
if __name__ == '__main__':
|
66
93
|
unittest.main()
|
@@ -0,0 +1,264 @@
|
|
1
|
+
import unittest
|
2
|
+
from transpose import transpose
|
3
|
+
|
4
|
+
|
5
|
+
# test cases adapted from `x-common//canonical-data.json` @ version: 1.0.0
|
6
|
+
|
7
|
+
class TransposeTests(unittest.TestCase):
|
8
|
+
def test_empty_string(self):
|
9
|
+
input_line = ""
|
10
|
+
expected = ""
|
11
|
+
self.assertEqual(
|
12
|
+
transpose(input_line),
|
13
|
+
expected
|
14
|
+
)
|
15
|
+
|
16
|
+
def test_two_characters_in_a_row(self):
|
17
|
+
self.assertEqual(
|
18
|
+
transpose("A1"),
|
19
|
+
"\n".join(["A", "1"])
|
20
|
+
)
|
21
|
+
|
22
|
+
def test_two_characters_in_a_column(self):
|
23
|
+
self.assertEqual(
|
24
|
+
transpose("\n".join(["A", "1"])),
|
25
|
+
"A1"
|
26
|
+
)
|
27
|
+
|
28
|
+
def test_simple(self):
|
29
|
+
input_line = [
|
30
|
+
"ABC",
|
31
|
+
"123"
|
32
|
+
]
|
33
|
+
expected = [
|
34
|
+
"A1",
|
35
|
+
"B2",
|
36
|
+
"C3"
|
37
|
+
]
|
38
|
+
|
39
|
+
self.assertEqual(
|
40
|
+
transpose("\n".join(input_line)),
|
41
|
+
"\n".join(expected)
|
42
|
+
)
|
43
|
+
|
44
|
+
def test_single_line(self):
|
45
|
+
input_line = ["Single line."]
|
46
|
+
expected = [
|
47
|
+
"S",
|
48
|
+
"i",
|
49
|
+
"n",
|
50
|
+
"g",
|
51
|
+
"l",
|
52
|
+
"e",
|
53
|
+
" ",
|
54
|
+
"l",
|
55
|
+
"i",
|
56
|
+
"n",
|
57
|
+
"e",
|
58
|
+
"."
|
59
|
+
]
|
60
|
+
self.assertEqual(
|
61
|
+
transpose("\n".join(input_line)),
|
62
|
+
"\n".join(expected)
|
63
|
+
)
|
64
|
+
|
65
|
+
def test_first_line_longer_than_second_line(self):
|
66
|
+
input_line = [
|
67
|
+
"The fourth line.",
|
68
|
+
"The fifth line."
|
69
|
+
]
|
70
|
+
expected = [
|
71
|
+
"TT",
|
72
|
+
"hh",
|
73
|
+
"ee",
|
74
|
+
" ",
|
75
|
+
"ff",
|
76
|
+
"oi",
|
77
|
+
"uf",
|
78
|
+
"rt",
|
79
|
+
"th",
|
80
|
+
"h ",
|
81
|
+
" l",
|
82
|
+
"li",
|
83
|
+
"in",
|
84
|
+
"ne",
|
85
|
+
"e.",
|
86
|
+
"."
|
87
|
+
]
|
88
|
+
self.assertEqual(
|
89
|
+
transpose("\n".join(input_line)),
|
90
|
+
"\n".join(expected)
|
91
|
+
)
|
92
|
+
|
93
|
+
def test_second_line_longer_than_first_line(self):
|
94
|
+
input_line = [
|
95
|
+
"The first line.",
|
96
|
+
"The second line."
|
97
|
+
]
|
98
|
+
expected = [
|
99
|
+
"TT",
|
100
|
+
"hh",
|
101
|
+
"ee",
|
102
|
+
" ",
|
103
|
+
"fs",
|
104
|
+
"ie",
|
105
|
+
"rc",
|
106
|
+
"so",
|
107
|
+
"tn",
|
108
|
+
" d",
|
109
|
+
"l ",
|
110
|
+
"il",
|
111
|
+
"ni",
|
112
|
+
"en",
|
113
|
+
".e",
|
114
|
+
" ."
|
115
|
+
]
|
116
|
+
self.assertEqual(
|
117
|
+
transpose("\n".join(input_line)),
|
118
|
+
"\n".join(expected)
|
119
|
+
)
|
120
|
+
|
121
|
+
def test_square(self):
|
122
|
+
input_line = [
|
123
|
+
"HEART",
|
124
|
+
"EMBER",
|
125
|
+
"ABUSE",
|
126
|
+
"RESIN",
|
127
|
+
"TREND"
|
128
|
+
]
|
129
|
+
expected = [
|
130
|
+
"HEART",
|
131
|
+
"EMBER",
|
132
|
+
"ABUSE",
|
133
|
+
"RESIN",
|
134
|
+
"TREND"
|
135
|
+
]
|
136
|
+
self.assertEqual(
|
137
|
+
transpose("\n".join(input_line)),
|
138
|
+
"\n".join(expected)
|
139
|
+
)
|
140
|
+
|
141
|
+
def test_rectangle(self):
|
142
|
+
input_line = [
|
143
|
+
"FRACTURE",
|
144
|
+
"OUTLINED",
|
145
|
+
"BLOOMING",
|
146
|
+
"SEPTETTE"
|
147
|
+
]
|
148
|
+
expected = [
|
149
|
+
"FOBS",
|
150
|
+
"RULE",
|
151
|
+
"ATOP",
|
152
|
+
"CLOT",
|
153
|
+
"TIME",
|
154
|
+
"UNIT",
|
155
|
+
"RENT",
|
156
|
+
"EDGE"
|
157
|
+
]
|
158
|
+
self.assertEqual(
|
159
|
+
transpose("\n".join(input_line)),
|
160
|
+
"\n".join(expected)
|
161
|
+
)
|
162
|
+
|
163
|
+
def test_triangle(self):
|
164
|
+
input_line = [
|
165
|
+
"T",
|
166
|
+
"EE",
|
167
|
+
"AAA",
|
168
|
+
"SSSS",
|
169
|
+
"EEEEE",
|
170
|
+
"RRRRRR"
|
171
|
+
]
|
172
|
+
expected = [
|
173
|
+
"TEASER",
|
174
|
+
" EASER",
|
175
|
+
" ASER",
|
176
|
+
" SER",
|
177
|
+
" ER",
|
178
|
+
" R"
|
179
|
+
]
|
180
|
+
self.assertEqual(
|
181
|
+
transpose("\n".join(input_line)),
|
182
|
+
"\n".join(expected)
|
183
|
+
)
|
184
|
+
|
185
|
+
def test_many_lines(self):
|
186
|
+
input_line = [
|
187
|
+
"Chor. Two households, both alike in dignity,",
|
188
|
+
"In fair Verona, where we lay our scene,",
|
189
|
+
"From ancient grudge break to new mutiny,",
|
190
|
+
"Where civil blood makes civil hands unclean.",
|
191
|
+
"From forth the fatal loins of these two foes",
|
192
|
+
"A pair of star-cross'd lovers take their life;",
|
193
|
+
"Whose misadventur'd piteous overthrows",
|
194
|
+
"Doth with their death bury their parents' strife.",
|
195
|
+
"The fearful passage of their death-mark'd love,",
|
196
|
+
"And the continuance of their parents' rage,",
|
197
|
+
"Which, but their children's end, naught could remove,",
|
198
|
+
"Is now the two hours' traffic of our stage;",
|
199
|
+
"The which if you with patient ears attend,",
|
200
|
+
"What here shall miss, our toil shall strive to mend."
|
201
|
+
]
|
202
|
+
expected = [
|
203
|
+
"CIFWFAWDTAWITW",
|
204
|
+
"hnrhr hohnhshh",
|
205
|
+
"o oeopotedi ea",
|
206
|
+
"rfmrmash cn t",
|
207
|
+
".a e ie fthow ",
|
208
|
+
" ia fr weh,whh",
|
209
|
+
"Trnco miae ie",
|
210
|
+
"w ciroitr btcr",
|
211
|
+
"oVivtfshfcuhhe",
|
212
|
+
" eeih a uote ",
|
213
|
+
"hrnl sdtln is",
|
214
|
+
"oot ttvh tttfh",
|
215
|
+
"un bhaeepihw a",
|
216
|
+
"saglernianeoyl",
|
217
|
+
"e,ro -trsui ol",
|
218
|
+
"h uofcu sarhu ",
|
219
|
+
"owddarrdan o m",
|
220
|
+
"lhg to'egccuwi",
|
221
|
+
"deemasdaeehris",
|
222
|
+
"sr als t ists",
|
223
|
+
",ebk 'phool'h,",
|
224
|
+
" reldi ffd ",
|
225
|
+
"bweso tb rtpo",
|
226
|
+
"oea ileutterau",
|
227
|
+
"t kcnoorhhnatr",
|
228
|
+
"hl isvuyee'fi ",
|
229
|
+
" atv es iisfet",
|
230
|
+
"ayoior trr ino",
|
231
|
+
"l lfsoh ecti",
|
232
|
+
"ion vedpn l",
|
233
|
+
"kuehtteieadoe ",
|
234
|
+
"erwaharrar,fas",
|
235
|
+
" nekt te rh",
|
236
|
+
"ismdsehphnnosa",
|
237
|
+
"ncuse ra-tau l",
|
238
|
+
" et tormsural",
|
239
|
+
"dniuthwea'g t ",
|
240
|
+
"iennwesnr hsts",
|
241
|
+
"g,ycoi tkrttet",
|
242
|
+
"n ,l r s'a anr",
|
243
|
+
"i ef 'dgcgdi",
|
244
|
+
"t aol eoe,v",
|
245
|
+
"y nei sl,u; e",
|
246
|
+
", .sf to l ",
|
247
|
+
" e rv d t",
|
248
|
+
" ; ie o",
|
249
|
+
" f, r ",
|
250
|
+
" e e m",
|
251
|
+
" . m e",
|
252
|
+
" o n",
|
253
|
+
" v d",
|
254
|
+
" e .",
|
255
|
+
" ,"
|
256
|
+
]
|
257
|
+
self.assertEqual(
|
258
|
+
transpose("\n".join(input_line)),
|
259
|
+
"\n".join(expected)
|
260
|
+
)
|
261
|
+
|
262
|
+
|
263
|
+
if __name__ == '__main__':
|
264
|
+
unittest.main()
|