trackler 2.0.8.27 → 2.0.8.28
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/common/exercises/simple-cipher/description.md +1 -1
- data/common/exercises/triangle/description.md +12 -23
- data/lib/trackler/version.rb +1 -1
- data/tracks/kotlin/config.json +5 -0
- data/tracks/kotlin/exercises/bank-account/build.gradle +32 -0
- data/tracks/kotlin/exercises/bank-account/src/example/kotlin/BankAccount.kt +27 -0
- data/tracks/kotlin/exercises/bank-account/src/main/kotlin/.keep +0 -0
- data/tracks/kotlin/exercises/bank-account/src/test/kotlin/BankAccountTest.kt +73 -0
- data/tracks/kotlin/exercises/settings.gradle +1 -0
- data/tracks/python/config.json +11 -11
- data/tracks/python/exercises/accumulate/accumulate_test.py +16 -14
- data/tracks/python/exercises/acronym/acronym_test.py +8 -7
- data/tracks/python/exercises/allergies/allergies_test.py +5 -6
- data/tracks/python/exercises/atbash-cipher/atbash_cipher_test.py +16 -22
- data/tracks/python/exercises/binary-search/binary_search_test.py +12 -10
- data/tracks/python/exercises/binary/binary_test.py +7 -8
- data/tracks/python/exercises/circular-buffer/circular_buffer_test.py +16 -17
- data/tracks/python/exercises/clock/clock_test.py +35 -35
- data/tracks/python/exercises/crypto-square/crypto_square_test.py +5 -6
- data/tracks/python/exercises/diamond/diamond_test.py +3 -4
- data/tracks/python/exercises/etl/etl_test.py +4 -4
- data/tracks/python/exercises/gigasecond/gigasecond_test.py +11 -19
- data/tracks/python/exercises/grade-school/grade_school_test.py +17 -19
- data/tracks/python/exercises/grains/grains_test.py +14 -14
- data/tracks/python/exercises/grep/grep_test.py +51 -64
- data/tracks/python/exercises/hamming/hamming_test.py +13 -13
- data/tracks/python/exercises/hello-world/hello_world_test.py +1 -2
- data/tracks/python/exercises/hexadecimal/hexadecimal_test.py +9 -10
- data/tracks/python/exercises/house/house_test.py +6 -6
- data/tracks/python/exercises/kindergarten-garden/kindergarten_garden_test.py +22 -19
- data/tracks/python/exercises/largest-series-product/largest_series_product_test.py +29 -28
- data/tracks/python/exercises/linked-list/linked_list_test.py +18 -19
- data/tracks/python/exercises/list-ops/list_ops_test.py +44 -39
- data/tracks/python/exercises/matrix/matrix_test.py +6 -6
- data/tracks/python/exercises/meetup/meetup_test.py +27 -27
- data/tracks/python/exercises/minesweeper/example.py +4 -2
- data/tracks/python/exercises/minesweeper/minesweeper_test.py +9 -9
- data/tracks/python/exercises/nucleotide-count/nucleotide_count_test.py +6 -6
- data/tracks/python/exercises/ocr-numbers/ocr_numbers_test.py +63 -49
- data/tracks/python/exercises/octal/octal_test.py +7 -7
- data/tracks/python/exercises/palindrome-products/palindrome_products_test.py +9 -9
- data/tracks/python/exercises/pascals-triangle/pascals_triangle_test.py +7 -7
- data/tracks/python/exercises/phone-number/phone_number_test.py +8 -8
- data/tracks/python/exercises/pig-latin/pig_latin_test.py +15 -15
- data/tracks/python/exercises/point-mutations/point_mutations_test.py +11 -11
- data/tracks/python/exercises/poker/poker_test.py +32 -30
- data/tracks/python/exercises/prime-factors/prime_factors_test.py +11 -11
- data/tracks/python/exercises/proverb/proverb_test.py +16 -9
- data/tracks/python/exercises/pythagorean-triplet/pythagorean_triplet_test.py +14 -12
- data/tracks/python/exercises/queen-attack/queen_attack_test.py +10 -10
- data/tracks/python/exercises/rail-fence-cipher/example.py +2 -1
- data/tracks/python/exercises/rail-fence-cipher/rail_fence_cipher_test.py +14 -13
- data/tracks/python/exercises/raindrops/raindrops_test.py +16 -16
- data/tracks/python/exercises/rectangles/rectangles_test.py +9 -9
- data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +8 -8
- data/tracks/python/exercises/robot-name/robot_name_test.py +1 -1
- data/tracks/python/exercises/robot-simulator/robot_simulator_test.py +18 -19
- data/tracks/python/exercises/roman-numerals/roman_numerals_test.py +1 -1
- data/tracks/python/exercises/run-length-encoding/run_length_encoding_test.py +15 -16
- data/tracks/python/exercises/saddle-points/saddle_points_test.py +4 -4
- data/tracks/python/exercises/say/say_test.py +21 -23
- data/tracks/python/exercises/scrabble-score/scrabble_score_test.py +9 -9
- data/tracks/python/exercises/secret-handshake/secret_handshake_test.py +14 -13
- data/tracks/python/exercises/series/example.py +3 -3
- data/tracks/python/exercises/series/series_test.py +16 -12
- data/tracks/python/exercises/simple-cipher/simple_cipher_test.py +21 -19
- data/tracks/python/exercises/space-age/space_age_test.py +16 -16
- data/tracks/python/exercises/strain/strain_test.py +9 -8
- data/tracks/python/exercises/sublist/sublist_test.py +19 -20
- data/tracks/python/exercises/sum-of-multiples/example.py +1 -4
- data/tracks/python/exercises/sum-of-multiples/sum_of_multiples_test.py +31 -26
- data/tracks/python/exercises/triangle/triangle_test.py +15 -30
- data/tracks/python/exercises/trinary/trinary_test.py +7 -7
- data/tracks/python/exercises/twelve-days/twelve_days_test.py +13 -14
- data/tracks/python/exercises/word-count/example.py +1 -9
- data/tracks/python/exercises/word-count/word_count_test.py +0 -15
- data/tracks/python/exercises/wordy/wordy_test.py +17 -18
- data/tracks/python/exercises/zebra-puzzle/example.py +20 -23
- data/tracks/python/exercises/zebra-puzzle/zebra_puzzle_test.py +3 -3
- data/tracks/python/test/check-exercises.py +1 -1
- metadata +6 -2
@@ -13,7 +13,7 @@ class QueenAttackTest(unittest.TestCase):
|
|
13
13
|
'______B_',
|
14
14
|
'________',
|
15
15
|
'________']
|
16
|
-
self.assertEqual(
|
16
|
+
self.assertEqual(board((2, 3), (5, 6)), ans)
|
17
17
|
|
18
18
|
def test_board2(self):
|
19
19
|
ans = ['______W_',
|
@@ -24,31 +24,31 @@ class QueenAttackTest(unittest.TestCase):
|
|
24
24
|
'________',
|
25
25
|
'________',
|
26
26
|
'________']
|
27
|
-
self.assertEqual(
|
27
|
+
self.assertEqual(board((0, 6), (1, 7)), ans)
|
28
28
|
|
29
29
|
def test_attack_true1(self):
|
30
|
-
self.
|
30
|
+
self.assertTrue(can_attack((2, 3), (5, 6)))
|
31
31
|
|
32
32
|
def test_attack_true2(self):
|
33
|
-
self.
|
33
|
+
self.assertTrue(can_attack((2, 6), (5, 3)))
|
34
34
|
|
35
35
|
def test_attack_true3(self):
|
36
|
-
self.
|
36
|
+
self.assertTrue(can_attack((2, 4), (2, 7)))
|
37
37
|
|
38
38
|
def test_attack_true4(self):
|
39
|
-
self.
|
39
|
+
self.assertTrue(can_attack((5, 4), (2, 4)))
|
40
40
|
|
41
41
|
def test_attack_true5(self):
|
42
|
-
self.
|
42
|
+
self.assertTrue(can_attack((1, 1), (6, 6)))
|
43
43
|
|
44
44
|
def test_attack_true6(self):
|
45
|
-
self.
|
45
|
+
self.assertTrue(can_attack((0, 6), (1, 7)))
|
46
46
|
|
47
47
|
def test_attack_false1(self):
|
48
|
-
self.
|
48
|
+
self.assertFalse(can_attack((4, 2), (0, 5)))
|
49
49
|
|
50
50
|
def test_attack_false2(self):
|
51
|
-
self.
|
51
|
+
self.assertFalse(can_attack((2, 3), (4, 7)))
|
52
52
|
|
53
53
|
# If either board or can_attack are called with an invalid board position
|
54
54
|
# they should raise a ValueError with a meaningful error message.
|
@@ -14,4 +14,5 @@ def encode(msg, rails):
|
|
14
14
|
def decode(msg, rails):
|
15
15
|
fence = fence_pattern(rails, len(msg))
|
16
16
|
fence_msg = zip(msg, sorted(fence))
|
17
|
-
return ''.join(
|
17
|
+
return ''.join(
|
18
|
+
char for char, _ in sorted(fence_msg, key=lambda item: item[1][1]))
|
@@ -4,31 +4,32 @@ from rail_fence_cipher import encode, decode
|
|
4
4
|
|
5
5
|
|
6
6
|
class RailFenceTests(unittest.TestCase):
|
7
|
-
|
8
7
|
def test_encode_with_two_rails(self):
|
9
|
-
self.assertMultiLineEqual(
|
10
|
-
|
8
|
+
self.assertMultiLineEqual(
|
9
|
+
encode('XOXOXOXOXOXOXOXOXO', 2), 'XXXXXXXXXOOOOOOOOO')
|
11
10
|
|
12
11
|
def test_encode_with_three_rails(self):
|
13
|
-
self.assertMultiLineEqual(
|
14
|
-
|
12
|
+
self.assertMultiLineEqual(
|
13
|
+
encode('WEAREDISCOVEREDFLEEATONCE', 3),
|
14
|
+
'WECRLTEERDSOEEFEAOCAIVDEN')
|
15
15
|
|
16
16
|
def test_encode_with_middle_stop(self):
|
17
|
-
self.assertMultiLineEqual(
|
17
|
+
self.assertMultiLineEqual(encode('EXERCISES', 4), 'ESXIEECSR')
|
18
18
|
|
19
19
|
def test_decode_with_three_rails(self):
|
20
|
-
self.assertMultiLineEqual(
|
21
|
-
|
20
|
+
self.assertMultiLineEqual(
|
21
|
+
decode('TEITELHDVLSNHDTISEIIEA', 3), 'THEDEVILISINTHEDETAILS')
|
22
22
|
|
23
23
|
def test_decode_with_five_rails(self):
|
24
|
-
self.assertMultiLineEqual(
|
25
|
-
|
24
|
+
self.assertMultiLineEqual(
|
25
|
+
decode('EIEXMSMESAORIWSCE', 5), 'EXERCISMISAWESOME')
|
26
26
|
|
27
27
|
def test_decode_with_six_rails(self):
|
28
28
|
self.assertMultiLineEqual(
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
decode(
|
30
|
+
'133714114238148966225439541018335470986172518171757571896261',
|
31
|
+
6),
|
32
|
+
'112358132134558914423337761098715972584418167651094617711286')
|
32
33
|
|
33
34
|
|
34
35
|
if __name__ == '__main__':
|
@@ -5,52 +5,52 @@ from raindrops import raindrops
|
|
5
5
|
|
6
6
|
class RaindropsTest(unittest.TestCase):
|
7
7
|
def test_1(self):
|
8
|
-
self.assertEqual(
|
8
|
+
self.assertEqual(raindrops(1), "1")
|
9
9
|
|
10
10
|
def test_3(self):
|
11
|
-
self.assertEqual(
|
11
|
+
self.assertEqual(raindrops(3), "Pling")
|
12
12
|
|
13
13
|
def test_5(self):
|
14
|
-
self.assertEqual(
|
14
|
+
self.assertEqual(raindrops(5), "Plang")
|
15
15
|
|
16
16
|
def test_7(self):
|
17
|
-
self.assertEqual(
|
17
|
+
self.assertEqual(raindrops(7), "Plong")
|
18
18
|
|
19
19
|
def test_6(self):
|
20
|
-
self.assertEqual(
|
20
|
+
self.assertEqual(raindrops(6), "Pling")
|
21
21
|
|
22
22
|
def test_9(self):
|
23
|
-
self.assertEqual(
|
23
|
+
self.assertEqual(raindrops(9), "Pling")
|
24
24
|
|
25
25
|
def test_10(self):
|
26
|
-
self.assertEqual(
|
26
|
+
self.assertEqual(raindrops(10), "Plang")
|
27
27
|
|
28
28
|
def test_14(self):
|
29
|
-
self.assertEqual(
|
29
|
+
self.assertEqual(raindrops(14), "Plong")
|
30
30
|
|
31
31
|
def test_15(self):
|
32
|
-
self.assertEqual(
|
32
|
+
self.assertEqual(raindrops(15), "PlingPlang")
|
33
33
|
|
34
34
|
def test_21(self):
|
35
|
-
self.assertEqual(
|
35
|
+
self.assertEqual(raindrops(21), "PlingPlong")
|
36
36
|
|
37
37
|
def test_25(self):
|
38
|
-
self.assertEqual(
|
38
|
+
self.assertEqual(raindrops(25), "Plang")
|
39
39
|
|
40
40
|
def test_35(self):
|
41
|
-
self.assertEqual(
|
41
|
+
self.assertEqual(raindrops(35), "PlangPlong")
|
42
42
|
|
43
43
|
def test_49(self):
|
44
|
-
self.assertEqual(
|
44
|
+
self.assertEqual(raindrops(49), "Plong")
|
45
45
|
|
46
46
|
def test_52(self):
|
47
|
-
self.assertEqual(
|
47
|
+
self.assertEqual(raindrops(52), "52")
|
48
48
|
|
49
49
|
def test_105(self):
|
50
|
-
self.assertEqual(
|
50
|
+
self.assertEqual(raindrops(105), "PlingPlangPlong")
|
51
51
|
|
52
52
|
def test_12121(self):
|
53
|
-
self.assertEqual(
|
53
|
+
self.assertEqual(raindrops(12121), "12121")
|
54
54
|
|
55
55
|
|
56
56
|
if __name__ == '__main__':
|
@@ -5,21 +5,21 @@ from rectangles import count
|
|
5
5
|
|
6
6
|
class WordTest(unittest.TestCase):
|
7
7
|
def test_zero_area_1(self):
|
8
|
-
self.assertEqual(
|
8
|
+
self.assertEqual(count(), 0)
|
9
9
|
|
10
10
|
def test_zero_area_2(self):
|
11
11
|
lines = ""
|
12
|
-
self.assertEqual(
|
12
|
+
self.assertEqual(count(lines), 0)
|
13
13
|
|
14
14
|
def test_empty_area(self):
|
15
15
|
lines = " "
|
16
|
-
self.assertEqual(
|
16
|
+
self.assertEqual(count(lines), 0)
|
17
17
|
|
18
18
|
def test_one_rectangle(self):
|
19
19
|
lines = ["+-+",
|
20
20
|
"| |",
|
21
21
|
"+-+"]
|
22
|
-
self.assertEqual(
|
22
|
+
self.assertEqual(count(lines), 1)
|
23
23
|
|
24
24
|
def test_two_rectangles_no_shared_parts(self):
|
25
25
|
lines = [" +-+",
|
@@ -27,7 +27,7 @@ class WordTest(unittest.TestCase):
|
|
27
27
|
"+-+-+",
|
28
28
|
"| | ",
|
29
29
|
"+-+ "]
|
30
|
-
self.assertEqual(
|
30
|
+
self.assertEqual(count(lines), 2)
|
31
31
|
|
32
32
|
def test_five_rectangles_three_regions(self):
|
33
33
|
lines = [" +-+",
|
@@ -35,7 +35,7 @@ class WordTest(unittest.TestCase):
|
|
35
35
|
"+-+-+",
|
36
36
|
"| | |",
|
37
37
|
"+-+-+"]
|
38
|
-
self.assertEqual(
|
38
|
+
self.assertEqual(count(lines), 5)
|
39
39
|
|
40
40
|
def test_incomplete_rectangles(self):
|
41
41
|
lines = [" +-+",
|
@@ -43,7 +43,7 @@ class WordTest(unittest.TestCase):
|
|
43
43
|
"+-+-+",
|
44
44
|
"| | -",
|
45
45
|
"+-+-+"]
|
46
|
-
self.assertEqual(
|
46
|
+
self.assertEqual(count(lines), 1)
|
47
47
|
|
48
48
|
def test_complicated(self):
|
49
49
|
lines = ["+------+----+",
|
@@ -51,7 +51,7 @@ class WordTest(unittest.TestCase):
|
|
51
51
|
"+---+--+ |",
|
52
52
|
"| | |",
|
53
53
|
"+---+-------+"]
|
54
|
-
self.assertEqual(
|
54
|
+
self.assertEqual(count(lines), 3)
|
55
55
|
|
56
56
|
def test_not_so_complicated(self):
|
57
57
|
lines = ["+------+----+",
|
@@ -59,7 +59,7 @@ class WordTest(unittest.TestCase):
|
|
59
59
|
"+------+ |",
|
60
60
|
"| | |",
|
61
61
|
"+---+-------+"]
|
62
|
-
self.assertEqual(
|
62
|
+
self.assertEqual(count(lines), 2)
|
63
63
|
|
64
64
|
|
65
65
|
if __name__ == '__main__':
|
@@ -7,28 +7,28 @@ from rna_transcription import to_rna
|
|
7
7
|
|
8
8
|
class DNATests(unittest.TestCase):
|
9
9
|
def test_transcribes_guanine_to_cytosine(self):
|
10
|
-
self.assertEqual('
|
10
|
+
self.assertEqual(to_rna('G'), 'C')
|
11
11
|
|
12
12
|
def test_transcribes_cytosine_to_guanine(self):
|
13
|
-
self.assertEqual('
|
13
|
+
self.assertEqual(to_rna('C'), 'G')
|
14
14
|
|
15
15
|
def test_transcribes_thymine_to_adenine(self):
|
16
|
-
self.assertEqual('
|
16
|
+
self.assertEqual(to_rna('T'), 'A')
|
17
17
|
|
18
18
|
def test_transcribes_adenine_to_uracil(self):
|
19
|
-
self.assertEqual('
|
19
|
+
self.assertEqual(to_rna('A'), 'U')
|
20
20
|
|
21
21
|
def test_transcribes_all_occurences(self):
|
22
|
-
self.assertMultiLineEqual('
|
22
|
+
self.assertMultiLineEqual(to_rna('ACGTGGTCTTAA'), 'UGCACCAGAAUU')
|
23
23
|
|
24
24
|
def test_correctly_handles_single_invalid_input(self):
|
25
|
-
self.assertEqual('',
|
25
|
+
self.assertEqual(to_rna('U'), '')
|
26
26
|
|
27
27
|
def test_correctly_handles_completely_invalid_input(self):
|
28
|
-
self.assertMultiLineEqual('',
|
28
|
+
self.assertMultiLineEqual(to_rna('XXX'), '')
|
29
29
|
|
30
30
|
def test_correctly_handles_partially_invalid_input(self):
|
31
|
-
self.assertMultiLineEqual('',
|
31
|
+
self.assertMultiLineEqual(to_rna('ACGTXXXCTTAA'), '')
|
32
32
|
|
33
33
|
|
34
34
|
if __name__ == '__main__':
|
@@ -4,16 +4,15 @@ from robot_simulator import Robot, NORTH, EAST, SOUTH, WEST
|
|
4
4
|
|
5
5
|
|
6
6
|
class RobotTests(unittest.TestCase):
|
7
|
-
|
8
7
|
def test_init(self):
|
9
8
|
robot = Robot()
|
10
|
-
self.assertEqual((0, 0)
|
11
|
-
self.assertEqual(
|
9
|
+
self.assertEqual(robot.coordinates, (0, 0))
|
10
|
+
self.assertEqual(robot.bearing, NORTH)
|
12
11
|
|
13
12
|
def test_setup(self):
|
14
13
|
robot = Robot(SOUTH, -1, 1)
|
15
|
-
self.assertEqual((-1, 1)
|
16
|
-
self.assertEqual(
|
14
|
+
self.assertEqual(robot.coordinates, (-1, 1))
|
15
|
+
self.assertEqual(robot.bearing, SOUTH)
|
17
16
|
|
18
17
|
def test_turn_right(self):
|
19
18
|
robot = Robot()
|
@@ -30,44 +29,44 @@ class RobotTests(unittest.TestCase):
|
|
30
29
|
def test_advance_positive_north(self):
|
31
30
|
robot = Robot(NORTH, 0, 0)
|
32
31
|
robot.advance()
|
33
|
-
self.assertEqual((0, 1)
|
34
|
-
self.assertEqual(
|
32
|
+
self.assertEqual(robot.coordinates, (0, 1))
|
33
|
+
self.assertEqual(robot.bearing, NORTH)
|
35
34
|
|
36
35
|
def test_advance_positive_east(self):
|
37
36
|
robot = Robot(EAST, 0, 0)
|
38
37
|
robot.advance()
|
39
|
-
self.assertEqual((1, 0)
|
40
|
-
self.assertEqual(
|
38
|
+
self.assertEqual(robot.coordinates, (1, 0))
|
39
|
+
self.assertEqual(robot.bearing, EAST)
|
41
40
|
|
42
41
|
def test_advance_negative_south(self):
|
43
42
|
robot = Robot(SOUTH, 0, 0)
|
44
43
|
robot.advance()
|
45
|
-
self.assertEqual((0, -1)
|
46
|
-
self.assertEqual(
|
44
|
+
self.assertEqual(robot.coordinates, (0, -1))
|
45
|
+
self.assertEqual(robot.bearing, SOUTH)
|
47
46
|
|
48
47
|
def test_advance_positive_west(self):
|
49
48
|
robot = Robot(WEST, 0, 0)
|
50
49
|
robot.advance()
|
51
|
-
self.assertEqual((-1, 0)
|
52
|
-
self.assertEqual(
|
50
|
+
self.assertEqual(robot.coordinates, (-1, 0))
|
51
|
+
self.assertEqual(robot.bearing, WEST)
|
53
52
|
|
54
53
|
def test_simulate_prog1(self):
|
55
54
|
robot = Robot(NORTH, 0, 0)
|
56
55
|
robot.simulate("LAAARALA")
|
57
|
-
self.assertEqual((-4, 1)
|
58
|
-
self.assertEqual(
|
56
|
+
self.assertEqual(robot.coordinates, (-4, 1))
|
57
|
+
self.assertEqual(robot.bearing, WEST)
|
59
58
|
|
60
59
|
def test_simulate_prog2(self):
|
61
60
|
robot = Robot(EAST, 2, -7)
|
62
61
|
robot.simulate("RRAAAAALA")
|
63
|
-
self.assertEqual((-3, -8)
|
64
|
-
self.assertEqual(
|
62
|
+
self.assertEqual(robot.coordinates, (-3, -8))
|
63
|
+
self.assertEqual(robot.bearing, SOUTH)
|
65
64
|
|
66
65
|
def test_simulate_prog3(self):
|
67
66
|
robot = Robot(SOUTH, 8, 4)
|
68
67
|
robot.simulate("LAAARRRALLLL")
|
69
|
-
self.assertEqual((11, 5)
|
70
|
-
self.assertEqual(
|
68
|
+
self.assertEqual(robot.coordinates, (11, 5))
|
69
|
+
self.assertEqual(robot.bearing, NORTH)
|
71
70
|
|
72
71
|
|
73
72
|
if __name__ == '__main__':
|
@@ -27,7 +27,7 @@ class RomanTest(unittest.TestCase):
|
|
27
27
|
|
28
28
|
def test_numerals(self):
|
29
29
|
for arabic, numeral in self.numerals.items():
|
30
|
-
self.assertEqual(
|
30
|
+
self.assertEqual(roman_numerals.numeral(arabic), numeral)
|
31
31
|
|
32
32
|
|
33
33
|
if __name__ == '__main__':
|
@@ -4,49 +4,48 @@ from run_length_encoding import encode, decode
|
|
4
4
|
|
5
5
|
|
6
6
|
class WordCountTests(unittest.TestCase):
|
7
|
-
|
8
7
|
def test_encode_empty_string(self):
|
9
|
-
self.assertMultiLineEqual('',
|
8
|
+
self.assertMultiLineEqual(encode(''), '')
|
10
9
|
|
11
10
|
def test_encode_single_characters_only_are_encoded_without_count(self):
|
12
|
-
self.assertMultiLineEqual('XYZ',
|
11
|
+
self.assertMultiLineEqual(encode('XYZ'), 'XYZ')
|
13
12
|
|
14
13
|
def test_encode_string_with_no_single_characters(self):
|
15
|
-
self.assertMultiLineEqual('
|
14
|
+
self.assertMultiLineEqual(encode('AABBBCCCC'), '2A3B4C')
|
16
15
|
|
17
16
|
def test_encode_single_characters_mixed_with_repeated_characters(self):
|
18
17
|
self.assertMultiLineEqual(
|
19
|
-
'
|
20
|
-
|
18
|
+
encode('WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB'),
|
19
|
+
'12WB12W3B24WB')
|
21
20
|
|
22
21
|
def test_encode_multiple_whitespace_mixed_in_string(self):
|
23
|
-
self.assertMultiLineEqual(
|
22
|
+
self.assertMultiLineEqual(encode(' hsqq qww '), '2 hs2q q2w2 ')
|
24
23
|
|
25
24
|
def test_encode_lowercase_characters(self):
|
26
|
-
self.assertMultiLineEqual('
|
25
|
+
self.assertMultiLineEqual(encode('aabbbcccc'), '2a3b4c')
|
27
26
|
|
28
27
|
def test_decode_empty_string(self):
|
29
|
-
self.assertMultiLineEqual('',
|
28
|
+
self.assertMultiLineEqual(decode(''), '')
|
30
29
|
|
31
30
|
def test_decode_single_characters_only(self):
|
32
|
-
self.assertMultiLineEqual('XYZ',
|
31
|
+
self.assertMultiLineEqual(decode('XYZ'), 'XYZ')
|
33
32
|
|
34
33
|
def test_decode_string_with_no_single_characters(self):
|
35
|
-
self.assertMultiLineEqual('
|
34
|
+
self.assertMultiLineEqual(decode('2A3B4C'), 'AABBBCCCC')
|
36
35
|
|
37
36
|
def test_decode_single_characters_with_repeated_characters(self):
|
38
37
|
self.assertMultiLineEqual(
|
39
|
-
'
|
40
|
-
|
38
|
+
decode('12WB12W3B24WB'),
|
39
|
+
'WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWB')
|
41
40
|
|
42
41
|
def test_decode_multiple_whitespace_mixed_in_string(self):
|
43
|
-
self.assertMultiLineEqual(
|
42
|
+
self.assertMultiLineEqual(decode('2 hs2q q2w2 '), ' hsqq qww ')
|
44
43
|
|
45
44
|
def test_decode_lower_case_string(self):
|
46
|
-
self.assertMultiLineEqual('
|
45
|
+
self.assertMultiLineEqual(decode('2a3b4c'), 'aabbbcccc')
|
47
46
|
|
48
47
|
def test_combination(self):
|
49
|
-
self.assertMultiLineEqual('zzz ZZ zZ',
|
48
|
+
self.assertMultiLineEqual(decode(encode('zzz ZZ zZ')), 'zzz ZZ zZ')
|
50
49
|
|
51
50
|
|
52
51
|
if __name__ == '__main__':
|
@@ -13,18 +13,18 @@ from saddle_points import saddle_points
|
|
13
13
|
class SaddlePointTest(unittest.TestCase):
|
14
14
|
def test_one_saddle(self):
|
15
15
|
inp = [[9, 8, 7], [5, 3, 2], [6, 6, 7]]
|
16
|
-
self.assertEqual(set([(1, 0)])
|
16
|
+
self.assertEqual(saddle_points(inp), set([(1, 0)]))
|
17
17
|
|
18
18
|
def test_no_saddle(self):
|
19
|
-
self.assertEqual(
|
19
|
+
self.assertEqual(saddle_points([[2, 1], [1, 2]]), set())
|
20
20
|
|
21
21
|
def test_mult_saddle(self):
|
22
22
|
inp = [[5, 3, 5, 4], [6, 4, 7, 3], [5, 1, 5, 3]]
|
23
23
|
ans = set([(0, 0), (0, 2), (2, 0), (2, 2)])
|
24
|
-
self.assertEqual(
|
24
|
+
self.assertEqual(saddle_points(inp), ans)
|
25
25
|
|
26
26
|
def test_empty_matrix(self):
|
27
|
-
self.assertEqual(
|
27
|
+
self.assertEqual(saddle_points([]), set())
|
28
28
|
|
29
29
|
def test_irregular_matrix(self):
|
30
30
|
inp = [[3, 2, 1], [0, 1], [2, 1, 0]]
|