trackler 2.0.8.27 → 2.0.8.28

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/simple-cipher/description.md +1 -1
  3. data/common/exercises/triangle/description.md +12 -23
  4. data/lib/trackler/version.rb +1 -1
  5. data/tracks/kotlin/config.json +5 -0
  6. data/tracks/kotlin/exercises/bank-account/build.gradle +32 -0
  7. data/tracks/kotlin/exercises/bank-account/src/example/kotlin/BankAccount.kt +27 -0
  8. data/tracks/kotlin/exercises/bank-account/src/main/kotlin/.keep +0 -0
  9. data/tracks/kotlin/exercises/bank-account/src/test/kotlin/BankAccountTest.kt +73 -0
  10. data/tracks/kotlin/exercises/settings.gradle +1 -0
  11. data/tracks/python/config.json +11 -11
  12. data/tracks/python/exercises/accumulate/accumulate_test.py +16 -14
  13. data/tracks/python/exercises/acronym/acronym_test.py +8 -7
  14. data/tracks/python/exercises/allergies/allergies_test.py +5 -6
  15. data/tracks/python/exercises/atbash-cipher/atbash_cipher_test.py +16 -22
  16. data/tracks/python/exercises/binary-search/binary_search_test.py +12 -10
  17. data/tracks/python/exercises/binary/binary_test.py +7 -8
  18. data/tracks/python/exercises/circular-buffer/circular_buffer_test.py +16 -17
  19. data/tracks/python/exercises/clock/clock_test.py +35 -35
  20. data/tracks/python/exercises/crypto-square/crypto_square_test.py +5 -6
  21. data/tracks/python/exercises/diamond/diamond_test.py +3 -4
  22. data/tracks/python/exercises/etl/etl_test.py +4 -4
  23. data/tracks/python/exercises/gigasecond/gigasecond_test.py +11 -19
  24. data/tracks/python/exercises/grade-school/grade_school_test.py +17 -19
  25. data/tracks/python/exercises/grains/grains_test.py +14 -14
  26. data/tracks/python/exercises/grep/grep_test.py +51 -64
  27. data/tracks/python/exercises/hamming/hamming_test.py +13 -13
  28. data/tracks/python/exercises/hello-world/hello_world_test.py +1 -2
  29. data/tracks/python/exercises/hexadecimal/hexadecimal_test.py +9 -10
  30. data/tracks/python/exercises/house/house_test.py +6 -6
  31. data/tracks/python/exercises/kindergarten-garden/kindergarten_garden_test.py +22 -19
  32. data/tracks/python/exercises/largest-series-product/largest_series_product_test.py +29 -28
  33. data/tracks/python/exercises/linked-list/linked_list_test.py +18 -19
  34. data/tracks/python/exercises/list-ops/list_ops_test.py +44 -39
  35. data/tracks/python/exercises/matrix/matrix_test.py +6 -6
  36. data/tracks/python/exercises/meetup/meetup_test.py +27 -27
  37. data/tracks/python/exercises/minesweeper/example.py +4 -2
  38. data/tracks/python/exercises/minesweeper/minesweeper_test.py +9 -9
  39. data/tracks/python/exercises/nucleotide-count/nucleotide_count_test.py +6 -6
  40. data/tracks/python/exercises/ocr-numbers/ocr_numbers_test.py +63 -49
  41. data/tracks/python/exercises/octal/octal_test.py +7 -7
  42. data/tracks/python/exercises/palindrome-products/palindrome_products_test.py +9 -9
  43. data/tracks/python/exercises/pascals-triangle/pascals_triangle_test.py +7 -7
  44. data/tracks/python/exercises/phone-number/phone_number_test.py +8 -8
  45. data/tracks/python/exercises/pig-latin/pig_latin_test.py +15 -15
  46. data/tracks/python/exercises/point-mutations/point_mutations_test.py +11 -11
  47. data/tracks/python/exercises/poker/poker_test.py +32 -30
  48. data/tracks/python/exercises/prime-factors/prime_factors_test.py +11 -11
  49. data/tracks/python/exercises/proverb/proverb_test.py +16 -9
  50. data/tracks/python/exercises/pythagorean-triplet/pythagorean_triplet_test.py +14 -12
  51. data/tracks/python/exercises/queen-attack/queen_attack_test.py +10 -10
  52. data/tracks/python/exercises/rail-fence-cipher/example.py +2 -1
  53. data/tracks/python/exercises/rail-fence-cipher/rail_fence_cipher_test.py +14 -13
  54. data/tracks/python/exercises/raindrops/raindrops_test.py +16 -16
  55. data/tracks/python/exercises/rectangles/rectangles_test.py +9 -9
  56. data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +8 -8
  57. data/tracks/python/exercises/robot-name/robot_name_test.py +1 -1
  58. data/tracks/python/exercises/robot-simulator/robot_simulator_test.py +18 -19
  59. data/tracks/python/exercises/roman-numerals/roman_numerals_test.py +1 -1
  60. data/tracks/python/exercises/run-length-encoding/run_length_encoding_test.py +15 -16
  61. data/tracks/python/exercises/saddle-points/saddle_points_test.py +4 -4
  62. data/tracks/python/exercises/say/say_test.py +21 -23
  63. data/tracks/python/exercises/scrabble-score/scrabble_score_test.py +9 -9
  64. data/tracks/python/exercises/secret-handshake/secret_handshake_test.py +14 -13
  65. data/tracks/python/exercises/series/example.py +3 -3
  66. data/tracks/python/exercises/series/series_test.py +16 -12
  67. data/tracks/python/exercises/simple-cipher/simple_cipher_test.py +21 -19
  68. data/tracks/python/exercises/space-age/space_age_test.py +16 -16
  69. data/tracks/python/exercises/strain/strain_test.py +9 -8
  70. data/tracks/python/exercises/sublist/sublist_test.py +19 -20
  71. data/tracks/python/exercises/sum-of-multiples/example.py +1 -4
  72. data/tracks/python/exercises/sum-of-multiples/sum_of_multiples_test.py +31 -26
  73. data/tracks/python/exercises/triangle/triangle_test.py +15 -30
  74. data/tracks/python/exercises/trinary/trinary_test.py +7 -7
  75. data/tracks/python/exercises/twelve-days/twelve_days_test.py +13 -14
  76. data/tracks/python/exercises/word-count/example.py +1 -9
  77. data/tracks/python/exercises/word-count/word_count_test.py +0 -15
  78. data/tracks/python/exercises/wordy/wordy_test.py +17 -18
  79. data/tracks/python/exercises/zebra-puzzle/example.py +20 -23
  80. data/tracks/python/exercises/zebra-puzzle/zebra_puzzle_test.py +3 -3
  81. data/tracks/python/test/check-exercises.py +1 -1
  82. metadata +6 -2
@@ -1,7 +1,4 @@
1
- def sum_of_multiples(limit, multiples=None):
2
- if multiples[0] == 0:
3
- # multiples of 0 don't change the sum
4
- multiples = multiples[1:]
1
+ def sum_of_multiples(limit, multiples):
5
2
  return sum(value for value in range(limit)
6
3
  if any(value % multiple == 0
7
4
  for multiple in multiples))
@@ -1,10 +1,10 @@
1
1
  """
2
2
  You can make the following assumptions about the inputs to the
3
3
  'sum_of_multiples' function:
4
- * All input numbers are non-negative 'int's, i.e. natural numbers including
5
- zero.
6
- * A list of factors must be given, and its elements are unique and sorted in
7
- ascending order.
4
+ * All input numbers are non-negative 'int's, i.e. natural numbers
5
+ including zero.
6
+ * A list of factors must be given, and its elements are unique
7
+ and sorted in ascending order.
8
8
  """
9
9
 
10
10
  import unittest
@@ -12,39 +12,44 @@ import unittest
12
12
  from sum_of_multiples import sum_of_multiples
13
13
 
14
14
 
15
+ # test cases adapted from `x-common//canonical-data.json` @ version: 1.0.0
16
+
15
17
  class SumOfMultiplesTest(unittest.TestCase):
16
- def test_sum_to_1(self):
17
- self.assertEqual(0, sum_of_multiples(1, [3, 5]))
18
+ def test_multiples_of_3_or_5_up_to_1(self):
19
+ self.assertEqual(sum_of_multiples(1, [3, 5]), 0)
20
+
21
+ def test_multiples_of_3_or_5_up_to_4(self):
22
+ self.assertEqual(sum_of_multiples(4, [3, 5]), 3)
18
23
 
19
- def test_sum_to_3(self):
20
- self.assertEqual(3, sum_of_multiples(4, [3, 5]))
24
+ def test_multiples_of_3_or_5_up_to_10(self):
25
+ self.assertEqual(sum_of_multiples(10, [3, 5]), 23)
21
26
 
22
- def test_sum_to_10(self):
23
- self.assertEqual(23, sum_of_multiples(10, [3, 5]))
27
+ def test_multiples_of_3_or_5_up_to_100(self):
28
+ self.assertEqual(sum_of_multiples(100, [3, 5]), 2318)
24
29
 
25
- def test_sum_to_100(self):
26
- self.assertEqual(2318, sum_of_multiples(100, [3, 5]))
30
+ def test_multiples_of_3_or_5_up_to_1000(self):
31
+ self.assertEqual(sum_of_multiples(1000, [3, 5]), 233168)
27
32
 
28
- def test_sum_to_1000(self):
29
- self.assertEqual(233168, sum_of_multiples(1000, [3, 5]))
33
+ def test_multiples_of_7_13_or_17_up_to_20(self):
34
+ self.assertEqual(sum_of_multiples(20, [7, 13, 17]), 51)
30
35
 
31
- def test_configurable_7_13_17_to_20(self):
32
- self.assertEqual(51, sum_of_multiples(20, [7, 13, 17]))
36
+ def test_multiples_of_4_or_6_up_to_15(self):
37
+ self.assertEqual(sum_of_multiples(15, [4, 6]), 30)
33
38
 
34
- def test_configurable_4_6_to_15(self):
35
- self.assertEqual(30, sum_of_multiples(15, [4, 6]))
39
+ def test_multiples_of_5_6_or_8_up_to_150(self):
40
+ self.assertEqual(sum_of_multiples(150, [5, 6, 8]), 4419)
36
41
 
37
- def test_configurable_5_6_8_to_150(self):
38
- self.assertEqual(4419, sum_of_multiples(150, [5, 6, 8]))
42
+ def test_multiples_of_5_or_25_up_to_51(self):
43
+ self.assertEqual(sum_of_multiples(51, [5, 25]), 275)
39
44
 
40
- def test_configurable_43_47_to_10000(self):
41
- self.assertEqual(2203160, sum_of_multiples(10000, [43, 47]))
45
+ def test_multiples_of_43_or_47_up_to_10000(self):
46
+ self.assertEqual(sum_of_multiples(10000, [43, 47]), 2203160)
42
47
 
43
- def test_configurable_0_to_10(self):
44
- self.assertEqual(0, sum_of_multiples(10, [0]))
48
+ def test_multiples_of_1_up_to_100(self):
49
+ self.assertEqual(sum_of_multiples(100, [1]), 4950)
45
50
 
46
- def test_configurable_0_1_to_10(self):
47
- self.assertEqual(45, sum_of_multiples(10, [0, 1]))
51
+ def test_multiples_of_an_empty_list_up_to_10000(self):
52
+ self.assertEqual(sum_of_multiples(10000, []), 0)
48
53
 
49
54
 
50
55
  if __name__ == '__main__':
@@ -5,63 +5,48 @@ from triangle import Triangle, TriangleError
5
5
 
6
6
  class TriangleTests(unittest.TestCase):
7
7
  def test_equilateral_triangles_have_equal_sides(self):
8
- self.assertEqual("equilateral", Triangle(2, 2, 2).kind())
8
+ self.assertEqual(Triangle(2, 2, 2).kind(), "equilateral")
9
9
 
10
10
  def test_larger_equilateral_triangles_also_have_equal_sides(self):
11
- self.assertEqual("equilateral", Triangle(10, 10, 10).kind())
11
+ self.assertEqual(Triangle(10, 10, 10).kind(), "equilateral")
12
12
 
13
13
  def test_isosceles_triangles_have_last_two_sides_equal(self):
14
- self.assertEqual("isosceles", Triangle(3, 4, 4).kind())
14
+ self.assertEqual(Triangle(3, 4, 4).kind(), "isosceles")
15
15
 
16
16
  def test_isosceles_triangles_have_first_and_last_sides_equal(self):
17
- self.assertEqual("isosceles", Triangle(4, 3, 4).kind())
17
+ self.assertEqual(Triangle(4, 3, 4).kind(), "isosceles")
18
18
 
19
19
  def test_isosceles_triangles_have_two_first_sides_equal(self):
20
- self.assertEqual("isosceles", Triangle(4, 4, 3).kind())
20
+ self.assertEqual(Triangle(4, 4, 3).kind(), "isosceles")
21
21
 
22
22
  def test_isosceles_triangles_have_in_fact_exactly_two_sides_equal(self):
23
- self.assertEqual("isosceles", Triangle(10, 10, 2).kind())
23
+ self.assertEqual(Triangle(10, 10, 2).kind(), "isosceles")
24
24
 
25
25
  def test_scalene_triangles_have_no_equal_sides(self):
26
- self.assertEqual("scalene", Triangle(3, 4, 5).kind())
26
+ self.assertEqual(Triangle(3, 4, 5).kind(), "scalene")
27
27
 
28
28
  def test_scalene_triangles_have_no_equal_sides_at_a_larger_scale_too(self):
29
- self.assertEqual("scalene", Triangle(10, 11, 12).kind())
29
+ self.assertEqual(Triangle(10, 11, 12).kind(), "scalene")
30
30
 
31
- self.assertEqual("scalene", Triangle(5, 4, 2).kind())
31
+ self.assertEqual(Triangle(5, 4, 2).kind(), "scalene")
32
32
 
33
33
  def test_very_small_triangles_are_legal(self):
34
- self.assertEqual("scalene", Triangle(0.4, 0.6, 0.3).kind())
34
+ self.assertEqual(Triangle(0.4, 0.6, 0.3).kind(), "scalene")
35
35
 
36
36
  def test_triangles_with_no_size_are_illegal(self):
37
- self.assertRaises(
38
- TriangleError,
39
- Triangle, 0, 0, 0
40
- )
37
+ self.assertRaises(TriangleError, Triangle, 0, 0, 0)
41
38
 
42
39
  def test_triangles_with_negative_sides_are_illegal(self):
43
- self.assertRaises(
44
- TriangleError,
45
- Triangle, 3, 4, -5
46
- )
40
+ self.assertRaises(TriangleError, Triangle, 3, 4, -5)
47
41
 
48
42
  def test_triangles_violating_triangle_inequality_are_illegal(self):
49
- self.assertRaises(
50
- TriangleError,
51
- Triangle, 1, 1, 3
52
- )
43
+ self.assertRaises(TriangleError, Triangle, 1, 1, 3)
53
44
 
54
45
  def test_triangles_violating_triangle_inequality_are_illegal_2(self):
55
- self.assertRaises(
56
- TriangleError,
57
- Triangle, 2, 4, 2
58
- )
46
+ self.assertRaises(TriangleError, Triangle, 2, 4, 2)
59
47
 
60
48
  def test_triangles_violating_triangle_inequality_are_illegal_3(self):
61
- self.assertRaises(
62
- TriangleError,
63
- Triangle, 7, 3, 2
64
- )
49
+ self.assertRaises(TriangleError, Triangle, 7, 3, 2)
65
50
 
66
51
 
67
52
  if __name__ == '__main__':
@@ -5,25 +5,25 @@ from trinary import trinary
5
5
 
6
6
  class TrinaryTest(unittest.TestCase):
7
7
  def test_valid_trinary1(self):
8
- self.assertEqual(0, trinary('0'))
8
+ self.assertEqual(trinary('0'), 0)
9
9
 
10
10
  def test_valid_trinary2(self):
11
- self.assertEqual(1, trinary('1'))
11
+ self.assertEqual(trinary('1'), 1)
12
12
 
13
13
  def test_valid_trinary3(self):
14
- self.assertEqual(3, trinary('10'))
14
+ self.assertEqual(trinary('10'), 3)
15
15
 
16
16
  def test_valid_trinary4(self):
17
- self.assertEqual(307, trinary('102101'))
17
+ self.assertEqual(trinary('102101'), 307)
18
18
 
19
19
  def test_valid_trinary5(self):
20
- self.assertEqual(242, trinary('22222'))
20
+ self.assertEqual(trinary('22222'), 242)
21
21
 
22
22
  def test_valid_trinary6(self):
23
- self.assertEqual(81, trinary('10000'))
23
+ self.assertEqual(trinary('10000'), 81)
24
24
 
25
25
  def test_invalid_trinary(self):
26
- self.assertEqual(0, trinary('13201'))
26
+ self.assertEqual(trinary('13201'), 0)
27
27
 
28
28
 
29
29
  if __name__ == '__main__':
@@ -4,24 +4,23 @@ from twelve_days import sing, verse, verses
4
4
 
5
5
 
6
6
  class TwelveDaysTests(unittest.TestCase):
7
-
8
7
  def test_verse1(self):
9
8
  expected = ("On the first day of Christmas my true love gave to me, "
10
9
  "a Partridge in a Pear Tree.\n")
11
- self.assertEqual(expected, verse(1))
10
+ self.assertEqual(verse(1), expected)
12
11
 
13
12
  def test_verse2(self):
14
13
  expected = ("On the second day of Christmas my true love gave to me, "
15
14
  "two Turtle Doves, "
16
15
  "and a Partridge in a Pear Tree.\n")
17
- self.assertEqual(expected, verse(2))
16
+ self.assertEqual(verse(2), expected)
18
17
 
19
18
  def test_verse3(self):
20
19
  expected = ("On the third day of Christmas my true love gave to me, "
21
20
  "three French Hens, "
22
21
  "two Turtle Doves, "
23
22
  "and a Partridge in a Pear Tree.\n")
24
- self.assertEqual(expected, verse(3))
23
+ self.assertEqual(verse(3), expected)
25
24
 
26
25
  def test_verse4(self):
27
26
  expected = ("On the fourth day of Christmas my true love gave to me, "
@@ -29,7 +28,7 @@ class TwelveDaysTests(unittest.TestCase):
29
28
  "three French Hens, "
30
29
  "two Turtle Doves, "
31
30
  "and a Partridge in a Pear Tree.\n")
32
- self.assertEqual(expected, verse(4))
31
+ self.assertEqual(verse(4), expected)
33
32
 
34
33
  def test_verse5(self):
35
34
  expected = ("On the fifth day of Christmas my true love gave to me, "
@@ -38,7 +37,7 @@ class TwelveDaysTests(unittest.TestCase):
38
37
  "three French Hens, "
39
38
  "two Turtle Doves, "
40
39
  "and a Partridge in a Pear Tree.\n")
41
- self.assertEqual(expected, verse(5))
40
+ self.assertEqual(verse(5), expected)
42
41
 
43
42
  def test_verse6(self):
44
43
  expected = ("On the sixth day of Christmas my true love gave to me, "
@@ -48,7 +47,7 @@ class TwelveDaysTests(unittest.TestCase):
48
47
  "three French Hens, "
49
48
  "two Turtle Doves, "
50
49
  "and a Partridge in a Pear Tree.\n")
51
- self.assertEqual(expected, verse(6))
50
+ self.assertEqual(verse(6), expected)
52
51
 
53
52
  def test_verse7(self):
54
53
  expected = ("On the seventh day of Christmas my true love gave to me, "
@@ -59,7 +58,7 @@ class TwelveDaysTests(unittest.TestCase):
59
58
  "three French Hens, "
60
59
  "two Turtle Doves, "
61
60
  "and a Partridge in a Pear Tree.\n")
62
- self.assertEqual(expected, verse(7))
61
+ self.assertEqual(verse(7), expected)
63
62
 
64
63
  def test_verse8(self):
65
64
  expected = ("On the eighth day of Christmas my true love gave to me, "
@@ -71,7 +70,7 @@ class TwelveDaysTests(unittest.TestCase):
71
70
  "three French Hens, "
72
71
  "two Turtle Doves, "
73
72
  "and a Partridge in a Pear Tree.\n")
74
- self.assertEqual(expected, verse(8))
73
+ self.assertEqual(verse(8), expected)
75
74
 
76
75
  def test_verse9(self):
77
76
  expected = ("On the ninth day of Christmas my true love gave to me, "
@@ -84,7 +83,7 @@ class TwelveDaysTests(unittest.TestCase):
84
83
  "three French Hens, "
85
84
  "two Turtle Doves, "
86
85
  "and a Partridge in a Pear Tree.\n")
87
- self.assertEqual(expected, verse(9))
86
+ self.assertEqual(verse(9), expected)
88
87
 
89
88
  def test_verse10(self):
90
89
  expected = ("On the tenth day of Christmas my true love gave to me, "
@@ -98,7 +97,7 @@ class TwelveDaysTests(unittest.TestCase):
98
97
  "three French Hens, "
99
98
  "two Turtle Doves, "
100
99
  "and a Partridge in a Pear Tree.\n")
101
- self.assertEqual(expected, verse(10))
100
+ self.assertEqual(verse(10), expected)
102
101
 
103
102
  def test_verse11(self):
104
103
  expected = ("On the eleventh day of Christmas "
@@ -114,7 +113,7 @@ class TwelveDaysTests(unittest.TestCase):
114
113
  "three French Hens, "
115
114
  "two Turtle Doves, "
116
115
  "and a Partridge in a Pear Tree.\n")
117
- self.assertEqual(expected, verse(11))
116
+ self.assertEqual(verse(11), expected)
118
117
 
119
118
  def test_verse12(self):
120
119
  expected = ("On the twelfth day of Christmas my true love gave to me, "
@@ -130,7 +129,7 @@ class TwelveDaysTests(unittest.TestCase):
130
129
  "three French Hens, "
131
130
  "two Turtle Doves, "
132
131
  "and a Partridge in a Pear Tree.\n")
133
- self.assertEqual(expected, verse(12))
132
+ self.assertEqual(verse(12), expected)
134
133
 
135
134
  def test_multiple_verses(self):
136
135
  expected = ("On the first day of Christmas my true love gave to me, "
@@ -142,7 +141,7 @@ class TwelveDaysTests(unittest.TestCase):
142
141
  "three French Hens, "
143
142
  "two Turtle Doves, "
144
143
  "and a Partridge in a Pear Tree.\n\n")
145
- self.assertEqual(expected, verses(1, 3))
144
+ self.assertEqual(verses(1, 3), expected)
146
145
 
147
146
  def test_the_whole_song(self):
148
147
  self.assertEqual(verses(1, 12), sing())
@@ -1,16 +1,8 @@
1
1
  from collections import Counter
2
2
 
3
3
 
4
- # to be backwards compatible with the old Python 2.X
5
- def decode_if_needed(string):
6
- try:
7
- return string.decode('utf-8')
8
- except AttributeError:
9
- return string
10
-
11
-
12
4
  def word_count(text):
13
5
  def replace_nonalpha(char):
14
6
  return char.lower() if char.isalnum() else ' '
15
- text = ''.join(replace_nonalpha(c) for c in decode_if_needed(text))
7
+ text = ''.join(replace_nonalpha(c) for c in text)
16
8
  return Counter(text.split())
@@ -1,17 +1,8 @@
1
- # -*- coding: utf-8 -*-
2
1
  import unittest
3
2
 
4
3
  from word_count import word_count
5
4
 
6
5
 
7
- # to be backwards compatible with the old Python 2.X
8
- def decode_if_needed(string):
9
- try:
10
- return string.decode('utf-8')
11
- except AttributeError:
12
- return string
13
-
14
-
15
6
  class WordCountTests(unittest.TestCase):
16
7
 
17
8
  def test_count_one_word(self):
@@ -78,12 +69,6 @@ class WordCountTests(unittest.TestCase):
78
69
  word_count('hey,my_spacebar_is_broken.')
79
70
  )
80
71
 
81
- def test_unicode(self):
82
- self.assertEqual(
83
- {decode_if_needed('до'): 1, decode_if_needed('свидания'): 1},
84
- word_count('до🖖свидания!')
85
- )
86
-
87
72
 
88
73
  if __name__ == '__main__':
89
74
  unittest.main()
@@ -4,50 +4,49 @@ from wordy import calculate
4
4
 
5
5
 
6
6
  class WordyTest(unittest.TestCase):
7
-
8
7
  def test_simple_add_1(self):
9
- self.assertEqual(18, calculate("What is 5 plus 13?"))
8
+ self.assertEqual(calculate("What is 5 plus 13?"), 18)
10
9
 
11
10
  def test_simple_add_2(self):
12
- self.assertEqual(-8, calculate("What is 5 plus -13?"))
11
+ self.assertEqual(calculate("What is 5 plus -13?"), -8)
13
12
 
14
13
  def test_simple_sub_1(self):
15
- self.assertEqual(6, calculate("What is 103 minus 97?"))
14
+ self.assertEqual(calculate("What is 103 minus 97?"), 6)
16
15
 
17
16
  def test_simple_sub_2(self):
18
- self.assertEqual(-6, calculate("What is 97 minus 103?"))
17
+ self.assertEqual(calculate("What is 97 minus 103?"), -6)
19
18
 
20
19
  def test_simple_mult(self):
21
- self.assertEqual(21, calculate("What is 7 multiplied by 3?"))
20
+ self.assertEqual(calculate("What is 7 multiplied by 3?"), 21)
22
21
 
23
22
  def test_simple_div(self):
24
- self.assertEqual(9, calculate("What is 45 divided by 5?"))
23
+ self.assertEqual(calculate("What is 45 divided by 5?"), 9)
25
24
 
26
25
  def test_add_negative_numbers(self):
27
- self.assertEqual(-11, calculate("What is -1 plus -10?"))
26
+ self.assertEqual(calculate("What is -1 plus -10?"), -11)
28
27
 
29
28
  def test_add_more_digits(self):
30
- self.assertEqual(45801, calculate("What is 123 plus 45678?"))
29
+ self.assertEqual(calculate("What is 123 plus 45678?"), 45801)
31
30
 
32
31
  def test_add_twice(self):
33
- self.assertEqual(4, calculate("What is 1 plus 2 plus 1?"))
32
+ self.assertEqual(calculate("What is 1 plus 2 plus 1?"), 4)
34
33
 
35
34
  def test_add_then_subtract(self):
36
- self.assertEqual(14, calculate("What is 1 plus 5 minus -8?"))
35
+ self.assertEqual(calculate("What is 1 plus 5 minus -8?"), 14)
37
36
 
38
37
  def test_subtract_twice(self):
39
- self.assertEqual(-7, calculate("What is 20 minus 14 minus 13?"))
38
+ self.assertEqual(calculate("What is 20 minus 14 minus 13?"), -7)
40
39
 
41
40
  def test_multiply_twice(self):
42
- self.assertEqual(-12, calculate("What is 2 multiplied by -2 "
43
- "multiplied by 3?"))
41
+ self.assertEqual(
42
+ calculate("What is 2 multiplied by -2 multiplied by 3?"), -12)
44
43
 
45
44
  def test_add_then_multiply(self):
46
- self.assertEqual(-8, calculate("What is -3 plus 7 multiplied by -2?"))
45
+ self.assertEqual(calculate("What is -3 plus 7 multiplied by -2?"), -8)
47
46
 
48
47
  def test_divide_twice(self):
49
48
  self.assertEqual(
50
- 16, calculate("What is -12000 divided by 25 divided by -30?"))
49
+ calculate("What is -12000 divided by 25 divided by -30?"), 16)
51
50
 
52
51
  def test_invalid_operation(self):
53
52
  self.assertRaises(ValueError, calculate, "What is 4 xor 7?")
@@ -56,8 +55,8 @@ class WordyTest(unittest.TestCase):
56
55
  self.assertRaises(ValueError, calculate, "What is 2 2 minus 3?")
57
56
 
58
57
  def test_missing_number(self):
59
- self.assertRaises(ValueError, calculate, "What is 7 plus "
60
- "multiplied by -2?")
58
+ self.assertRaises(ValueError, calculate,
59
+ "What is 7 plus multiplied by -2?")
61
60
 
62
61
  def test_irrelevant_question(self):
63
62
  self.assertRaises(ValueError, calculate, "Which is greater, 3 or 2?")
@@ -17,28 +17,25 @@ def next_to(x, y):
17
17
  def solution():
18
18
  houses = first, _, middle, _, _ = range(5)
19
19
  orderings = list(permutations(houses))
20
- result = next([{Englishman: "Englishman", Spaniard: "Spaniard",
21
- Ukranian: "Ukranian", Japanese: "Japanese",
22
- Norwegian: "Norwegian"}[x]
23
- for x in (water, zebra)]
24
- for (red, green, ivory, yellow, blue) in orderings
25
- if just_right_of(green, ivory)
26
- for (Englishman, Spaniard, Ukranian, Japanese, Norwegian) in orderings
27
- if Englishman is red
28
- if Norwegian is first
29
- if next_to(Norwegian, blue)
30
- for (coffee, tea, milk, oj, water) in orderings
31
- if coffee is green
32
- if Ukranian is tea
33
- if milk is middle
34
- for (OldGold, Kools, Chesterfields, LuckyStrike, Parliaments) in orderings
35
- if Kools is yellow
36
- if LuckyStrike is oj
37
- if Japanese is Parliaments
38
- for (dog, snails, fox, horse, zebra) in orderings
39
- if Spaniard is dog
40
- if OldGold is snails
41
- if next_to(Chesterfields, fox)
42
- if next_to(Kools, horse))
20
+ result = next(
21
+ [{
22
+ Englishman: "Englishman",
23
+ Spaniard: "Spaniard",
24
+ Ukranian: "Ukranian",
25
+ Japanese: "Japanese",
26
+ Norwegian: "Norwegian"
27
+ }[x] for x in (water, zebra)]
28
+ for (red, green, ivory, yellow, blue) in orderings
29
+ if just_right_of(green, ivory)
30
+ for (Englishman, Spaniard, Ukranian, Japanese, Norwegian) in orderings
31
+ if Englishman is red if Norwegian is first if next_to(Norwegian, blue)
32
+ for (coffee, tea, milk, oj, water) in orderings if coffee is green
33
+ if Ukranian is tea if milk is middle
34
+ for (OldGold, Kools, Chesterfields, LuckyStrike, Parliaments
35
+ ) in orderings if Kools is yellow if LuckyStrike is oj
36
+ if Japanese is Parliaments
37
+ for (dog, snails, fox, horse, zebra) in orderings if Spaniard is dog
38
+ if OldGold is snails if next_to(Chesterfields, fox)
39
+ if next_to(Kools, horse))
43
40
  return ("It is the {} who drinks the water.\n"
44
41
  "The {} keeps the zebra.").format(*result)