trackler 2.2.1.74 → 2.2.1.75

Sign up to get free protection for your applications and to get access to all the features.
Files changed (227) hide show
  1. checksums.yaml +4 -4
  2. data/fixtures/tracks/fruit/docs/something.md +0 -0
  3. data/lib/trackler/version.rb +1 -1
  4. data/problem-specifications/README.md +8 -4
  5. data/problem-specifications/exercises/acronym/canonical-data.json +19 -7
  6. data/problem-specifications/exercises/all-your-base/canonical-data.json +106 -64
  7. data/problem-specifications/exercises/allergies/canonical-data.json +37 -13
  8. data/tracks/c/config.json +176 -176
  9. data/tracks/clojure/config.json +17 -1
  10. data/tracks/clojure/exercises/isbn-verifier/README.md +43 -0
  11. data/tracks/clojure/exercises/isbn-verifier/project.clj +4 -0
  12. data/tracks/clojure/exercises/isbn-verifier/src/example.clj +17 -0
  13. data/tracks/clojure/exercises/isbn-verifier/src/isbn_verifier.clj +3 -0
  14. data/tracks/clojure/exercises/isbn-verifier/test/isbn_verifier_test.clj +42 -0
  15. data/tracks/clojure/exercises/proverb/README.md +15 -0
  16. data/tracks/clojure/exercises/proverb/project.clj +4 -0
  17. data/tracks/clojure/exercises/proverb/src/example.clj +15 -0
  18. data/tracks/clojure/exercises/proverb/src/proverb.clj +3 -0
  19. data/tracks/clojure/exercises/proverb/test/proverb_test.clj +14 -0
  20. data/tracks/common-lisp/docs/LEARNING.md +4 -3
  21. data/tracks/common-lisp/docs/RESOURCES.md +11 -0
  22. data/tracks/delphi/.gitignore +1 -0
  23. data/tracks/delphi/config.json +24 -0
  24. data/tracks/delphi/docs/INSTALLATION.md +1 -1
  25. data/tracks/delphi/exercises/isbn-verifier/ISBNVerifier.dpr +60 -0
  26. data/tracks/delphi/exercises/isbn-verifier/README.md +68 -0
  27. data/tracks/delphi/exercises/isbn-verifier/uISBNVerifierExample.pas +46 -0
  28. data/tracks/delphi/exercises/isbn-verifier/uTestISBNVerifier.pas +136 -0
  29. data/tracks/delphi/exercises/secret-handshake/README.md +56 -0
  30. data/tracks/delphi/exercises/secret-handshake/SecretHandshake.dpr +60 -0
  31. data/tracks/delphi/exercises/secret-handshake/uSecretHandshakeExample.pas +56 -0
  32. data/tracks/delphi/exercises/secret-handshake/uTestSecretHandshake.pas +215 -0
  33. data/tracks/ecmascript/docs/ABOUT.md +13 -9
  34. data/tracks/factor/exercises/two-fer/README.md +1 -1
  35. data/tracks/fsharp/docs/RESOURCES.md +1 -1
  36. data/tracks/fsharp/generators/{Input.fs → CanonicalData.fs} +5 -10
  37. data/tracks/fsharp/generators/Exercise.fs +11 -10
  38. data/tracks/fsharp/generators/{Output.fs → Formatting.fs} +2 -56
  39. data/tracks/fsharp/generators/Generators.fs +93 -93
  40. data/tracks/fsharp/generators/Generators.fsproj +9 -4
  41. data/tracks/fsharp/generators/Options.fs +1 -1
  42. data/tracks/fsharp/generators/Program.fs +3 -3
  43. data/tracks/fsharp/generators/Rendering.fs +57 -0
  44. data/tracks/go/exercises/all-your-base/.meta/gen.go +80 -0
  45. data/tracks/go/exercises/all-your-base/.meta/hints.md +13 -0
  46. data/tracks/go/exercises/all-your-base/README.md +16 -1
  47. data/tracks/go/exercises/all-your-base/all_your_base_test.go +12 -163
  48. data/tracks/go/exercises/all-your-base/cases_test.go +183 -0
  49. data/tracks/go/exercises/all-your-base/example.go +25 -29
  50. data/tracks/java/CONTRIBUTING.md +1 -1
  51. data/tracks/java/POLICIES.md +15 -1
  52. data/tracks/java/exercises/flatten-array/.meta/hints.md +58 -0
  53. data/tracks/java/exercises/flatten-array/README.md +62 -0
  54. data/tracks/java/exercises/hamming/src/main/java/Hamming.java +1 -1
  55. data/tracks/java/exercises/matrix/.meta/src/reference/java/Matrix.java +6 -6
  56. data/tracks/java/exercises/meetup/.meta/src/reference/java/Meetup.java +2 -2
  57. data/tracks/java/exercises/meetup/.meta/src/reference/java/MeetupSchedule.java +1 -1
  58. data/tracks/java/exercises/meetup/src/main/java/MeetupSchedule.java +1 -1
  59. data/tracks/java/exercises/pig-latin/.meta/hints.md +58 -0
  60. data/tracks/java/exercises/pig-latin/README.md +61 -0
  61. data/tracks/java/exercises/reverse-string/src/main/java/ReverseString.java +2 -2
  62. data/tracks/java/exercises/secret-handshake/README.md +1 -1
  63. data/tracks/javascript/.eslintignore +0 -3
  64. data/tracks/javascript/exercises/food-chain/example.js +50 -37
  65. data/tracks/javascript/exercises/octal/example.js +1 -1
  66. data/tracks/javascript/exercises/robot-name/robot-name.spec.js +7 -7
  67. data/tracks/javascript/package-lock.json +1846 -0
  68. data/tracks/python/docs/EXERCISE_README_INSERT.md +15 -0
  69. data/tracks/python/exercises/accumulate/README.md +15 -0
  70. data/tracks/python/exercises/acronym/README.md +15 -0
  71. data/tracks/python/exercises/all-your-base/README.md +15 -0
  72. data/tracks/python/exercises/all-your-base/all_your_base_test.py +19 -9
  73. data/tracks/python/exercises/allergies/README.md +15 -0
  74. data/tracks/python/exercises/alphametics/README.md +15 -0
  75. data/tracks/python/exercises/anagram/README.md +15 -0
  76. data/tracks/python/exercises/atbash-cipher/README.md +15 -0
  77. data/tracks/python/exercises/beer-song/README.md +16 -1
  78. data/tracks/python/exercises/binary-search-tree/README.md +16 -2
  79. data/tracks/python/exercises/binary-search/README.md +15 -0
  80. data/tracks/python/exercises/binary-search/binary_search_test.py +14 -4
  81. data/tracks/python/exercises/binary/README.md +15 -0
  82. data/tracks/python/exercises/binary/binary_test.py +14 -4
  83. data/tracks/python/exercises/bob/README.md +15 -0
  84. data/tracks/python/exercises/book-store/README.md +15 -0
  85. data/tracks/python/exercises/bracket-push/README.md +15 -0
  86. data/tracks/python/exercises/change/README.md +15 -0
  87. data/tracks/python/exercises/circular-buffer/README.md +15 -0
  88. data/tracks/python/exercises/circular-buffer/circular_buffer_test.py +15 -5
  89. data/tracks/python/exercises/circular-buffer/example.py +2 -2
  90. data/tracks/python/exercises/clock/README.md +15 -0
  91. data/tracks/python/exercises/collatz-conjecture/.meta/hints.md +1 -1
  92. data/tracks/python/exercises/collatz-conjecture/README.md +15 -0
  93. data/tracks/python/exercises/complex-numbers/README.md +15 -0
  94. data/tracks/python/exercises/connect/README.md +18 -3
  95. data/tracks/python/exercises/crypto-square/README.md +15 -0
  96. data/tracks/python/exercises/diamond/README.md +15 -0
  97. data/tracks/python/exercises/difference-of-squares/README.md +15 -0
  98. data/tracks/python/exercises/diffie-hellman/README.md +14 -0
  99. data/tracks/python/exercises/dominoes/README.md +16 -1
  100. data/tracks/python/exercises/error-handling/README.md +17 -0
  101. data/tracks/python/exercises/error-handling/error_handling_test.py +13 -3
  102. data/tracks/python/exercises/error-handling/example.py +1 -1
  103. data/tracks/python/exercises/etl/README.md +16 -1
  104. data/tracks/python/exercises/flatten-array/README.md +15 -0
  105. data/tracks/python/exercises/food-chain/README.md +15 -0
  106. data/tracks/python/exercises/forth/README.md +15 -0
  107. data/tracks/python/exercises/forth/example.py +7 -9
  108. data/tracks/python/exercises/forth/forth_test.py +107 -17
  109. data/tracks/python/exercises/gigasecond/README.md +15 -0
  110. data/tracks/python/exercises/go-counting/README.md +21 -3
  111. data/tracks/python/exercises/grade-school/README.md +15 -0
  112. data/tracks/python/exercises/grains/README.md +15 -0
  113. data/tracks/python/exercises/grains/grains_test.py +16 -6
  114. data/tracks/python/exercises/grep/README.md +15 -0
  115. data/tracks/python/exercises/hamming/README.md +15 -0
  116. data/tracks/python/exercises/hamming/hamming_test.py +12 -2
  117. data/tracks/python/exercises/hello-world/README.md +15 -0
  118. data/tracks/python/exercises/hexadecimal/README.md +15 -0
  119. data/tracks/python/exercises/hexadecimal/hexadecimal_test.py +11 -1
  120. data/tracks/python/exercises/house/README.md +16 -1
  121. data/tracks/python/exercises/isogram/README.md +15 -0
  122. data/tracks/python/exercises/kindergarten-garden/README.md +18 -3
  123. data/tracks/python/exercises/largest-series-product/README.md +15 -0
  124. data/tracks/python/exercises/largest-series-product/largest_series_product_test.py +14 -4
  125. data/tracks/python/exercises/leap/README.md +15 -0
  126. data/tracks/python/exercises/linked-list/README.md +15 -0
  127. data/tracks/python/exercises/list-ops/README.md +15 -0
  128. data/tracks/python/exercises/luhn/README.md +15 -0
  129. data/tracks/python/exercises/markdown/README.md +18 -0
  130. data/tracks/python/exercises/matrix/README.md +15 -0
  131. data/tracks/python/exercises/meetup/README.md +31 -12
  132. data/tracks/python/exercises/meetup/meetup_test.py +11 -1
  133. data/tracks/python/exercises/minesweeper/README.md +15 -0
  134. data/tracks/python/exercises/minesweeper/minesweeper_test.py +12 -2
  135. data/tracks/python/exercises/nth-prime/README.md +15 -0
  136. data/tracks/python/exercises/nth-prime/nth_prime_test.py +11 -1
  137. data/tracks/python/exercises/nucleotide-count/README.md +17 -2
  138. data/tracks/python/exercises/nucleotide-count/nucleotide_count_test.py +11 -1
  139. data/tracks/python/exercises/ocr-numbers/README.md +16 -1
  140. data/tracks/python/exercises/ocr-numbers/ocr_numbers_test.py +12 -2
  141. data/tracks/python/exercises/octal/README.md +15 -0
  142. data/tracks/python/exercises/octal/octal_test.py +16 -3
  143. data/tracks/python/exercises/palindrome-products/README.md +16 -1
  144. data/tracks/python/exercises/pangram/README.md +15 -0
  145. data/tracks/python/exercises/pascals-triangle/README.md +16 -1
  146. data/tracks/python/exercises/perfect-numbers/README.md +15 -0
  147. data/tracks/python/exercises/perfect-numbers/perfect_numbers_test.py +13 -3
  148. data/tracks/python/exercises/phone-number/README.md +16 -2
  149. data/tracks/python/exercises/phone-number/example.py +1 -1
  150. data/tracks/python/exercises/phone-number/phone_number_test.py +17 -7
  151. data/tracks/python/exercises/pig-latin/README.md +15 -0
  152. data/tracks/python/exercises/point-mutations/README.md +15 -0
  153. data/tracks/python/exercises/poker/README.md +15 -0
  154. data/tracks/python/exercises/pov/README.md +20 -2
  155. data/tracks/python/exercises/pov/example.py +2 -2
  156. data/tracks/python/exercises/pov/pov_test.py +15 -5
  157. data/tracks/python/exercises/prime-factors/README.md +15 -0
  158. data/tracks/python/exercises/protein-translation/README.md +15 -0
  159. data/tracks/python/exercises/protein-translation/protein_translation_test.py +10 -0
  160. data/tracks/python/exercises/proverb/README.md +14 -0
  161. data/tracks/python/exercises/pythagorean-triplet/README.md +15 -0
  162. data/tracks/python/exercises/pythagorean-triplet/pythagorean_triplet_test.py +11 -1
  163. data/tracks/python/exercises/queen-attack/README.md +15 -0
  164. data/tracks/python/exercises/queen-attack/queen_attack_test.py +17 -7
  165. data/tracks/python/exercises/rail-fence-cipher/README.md +15 -0
  166. data/tracks/python/exercises/raindrops/README.md +15 -0
  167. data/tracks/python/exercises/react/README.md +15 -1
  168. data/tracks/python/exercises/rectangles/README.md +24 -9
  169. data/tracks/python/exercises/rna-transcription/.meta/hints.md +1 -0
  170. data/tracks/python/exercises/rna-transcription/README.md +18 -5
  171. data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +13 -3
  172. data/tracks/python/exercises/robot-name/README.md +15 -0
  173. data/tracks/python/exercises/robot-simulator/README.md +15 -0
  174. data/tracks/python/exercises/roman-numerals/README.md +15 -0
  175. data/tracks/python/exercises/rotational-cipher/README.md +15 -0
  176. data/tracks/python/exercises/run-length-encoding/README.md +15 -0
  177. data/tracks/python/exercises/saddle-points/README.md +15 -0
  178. data/tracks/python/exercises/saddle-points/saddle_points_test.py +11 -1
  179. data/tracks/python/exercises/say/README.md +15 -0
  180. data/tracks/python/exercises/say/say_test.py +12 -2
  181. data/tracks/python/exercises/scale-generator/README.md +15 -0
  182. data/tracks/python/exercises/scale-generator/example.py +3 -3
  183. data/tracks/python/exercises/scale-generator/scale_generator_test.py +11 -1
  184. data/tracks/python/exercises/scrabble-score/README.md +15 -0
  185. data/tracks/python/exercises/secret-handshake/README.md +16 -1
  186. data/tracks/python/exercises/series/README.md +15 -0
  187. data/tracks/python/exercises/series/series_test.py +12 -2
  188. data/tracks/python/exercises/sieve/README.md +15 -0
  189. data/tracks/python/exercises/simple-cipher/.meta/hints.md +6 -6
  190. data/tracks/python/exercises/simple-cipher/README.md +17 -1
  191. data/tracks/python/exercises/simple-cipher/simple_cipher_test.py +12 -2
  192. data/tracks/python/exercises/simple-linked-list/{hints.md → .meta/hints.md} +10 -10
  193. data/tracks/python/exercises/simple-linked-list/README.md +16 -0
  194. data/tracks/python/exercises/simple-linked-list/example.py +2 -2
  195. data/tracks/python/exercises/simple-linked-list/simple_linked_list_test.py +13 -3
  196. data/tracks/python/exercises/space-age/README.md +15 -0
  197. data/tracks/python/exercises/strain/README.md +16 -3
  198. data/tracks/python/exercises/sublist/README.md +15 -0
  199. data/tracks/python/exercises/sum-of-multiples/README.md +18 -3
  200. data/tracks/python/exercises/tournament/README.md +15 -0
  201. data/tracks/python/exercises/transpose/README.md +15 -0
  202. data/tracks/python/exercises/tree-building/README.md +30 -0
  203. data/tracks/python/exercises/tree-building/example.py +3 -5
  204. data/tracks/python/exercises/tree-building/tree_building_test.py +16 -6
  205. data/tracks/python/exercises/triangle/README.md +15 -0
  206. data/tracks/python/exercises/triangle/example.py +1 -1
  207. data/tracks/python/exercises/triangle/triangle_test.py +15 -5
  208. data/tracks/python/exercises/trinary/README.md +15 -0
  209. data/tracks/python/exercises/twelve-days/README.md +15 -0
  210. data/tracks/python/exercises/two-bucket/README.md +22 -7
  211. data/tracks/python/exercises/two-fer/README.md +16 -0
  212. data/tracks/python/exercises/variable-length-quantity/README.md +15 -0
  213. data/tracks/python/exercises/variable-length-quantity/variable_length_quantity_test.py +12 -2
  214. data/tracks/python/exercises/word-count/README.md +15 -0
  215. data/tracks/python/exercises/word-search/README.md +15 -0
  216. data/tracks/python/exercises/wordy/README.md +15 -0
  217. data/tracks/python/exercises/wordy/wordy_test.py +14 -4
  218. data/tracks/python/exercises/zebra-puzzle/README.md +15 -0
  219. data/tracks/python/exercises/zipper/README.md +16 -3
  220. data/tracks/rust/config.json +11 -0
  221. data/tracks/rust/exercises/saddle-points/.gitignore +8 -0
  222. data/tracks/rust/exercises/saddle-points/Cargo.toml +5 -0
  223. data/tracks/rust/exercises/saddle-points/README.md +66 -0
  224. data/tracks/rust/exercises/saddle-points/example.rs +24 -0
  225. data/tracks/rust/exercises/saddle-points/src/lib.rs +3 -0
  226. data/tracks/rust/exercises/saddle-points/tests/saddle-points.rs +60 -0
  227. metadata +38 -5
@@ -1,3 +1,18 @@
1
+ ## Exception messages
2
+
3
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
4
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
5
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
6
+ a message.
7
+
8
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
9
+ `raise Exception`, you shold write:
10
+
11
+ ```python
12
+ raise Exception("Meaningful message indicating the source of the error")
13
+ ```
14
+
15
+
1
16
  ## Submitting Exercises
2
17
 
3
18
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
@@ -25,6 +25,21 @@ Keep your hands off that collect/map/fmap/whatchamacallit functionality
25
25
  provided by your standard library!
26
26
  Solve this one yourself using other basic tools instead.
27
27
 
28
+ ## Exception messages
29
+
30
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
31
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
32
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
33
+ a message.
34
+
35
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
36
+ `raise Exception`, you shold write:
37
+
38
+ ```python
39
+ raise Exception("Meaningful message indicating the source of the error")
40
+ ```
41
+
42
+
28
43
  ## Submitting Exercises
29
44
 
30
45
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
@@ -7,6 +7,21 @@ Techies love their TLA (Three Letter Acronyms)!
7
7
  Help generate some jargon by writing a program that converts a long name
8
8
  like Portable Network Graphics to its acronym (PNG).
9
9
 
10
+ ## Exception messages
11
+
12
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
13
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
14
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
15
+ a message.
16
+
17
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
18
+ `raise Exception`, you shold write:
19
+
20
+ ```python
21
+ raise Exception("Meaningful message indicating the source of the error")
22
+ ```
23
+
24
+
10
25
  ## Submitting Exercises
11
26
 
12
27
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
@@ -31,6 +31,21 @@ I think you got the idea!
31
31
 
32
32
  *Yes. Those three numbers above are exactly the same. Congratulations!*
33
33
 
34
+ ## Exception messages
35
+
36
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
37
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
38
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
39
+ a message.
40
+
41
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
42
+ `raise Exception`, you shold write:
43
+
44
+ ```python
45
+ raise Exception("Meaningful message indicating the source of the error")
46
+ ```
47
+
48
+
34
49
  ## Submitting Exercises
35
50
 
36
51
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
@@ -44,41 +44,51 @@ class AllYourBaseTests(unittest.TestCase):
44
44
  self.assertEqual(rebase(7, [0, 6, 0], 10), [4, 2])
45
45
 
46
46
  def test_first_base_is_one(self):
47
- with self.assertRaises(ValueError):
47
+ with self.assertRaisesWithMessage(ValueError):
48
48
  rebase(1, [], 10)
49
49
 
50
50
  def test_first_base_is_zero(self):
51
- with self.assertRaises(ValueError):
51
+ with self.assertRaisesWithMessage(ValueError):
52
52
  rebase(0, [], 10)
53
53
 
54
54
  def test_first_base_is_negative(self):
55
- with self.assertRaises(ValueError):
55
+ with self.assertRaisesWithMessage(ValueError):
56
56
  rebase(-2, [1], 10)
57
57
 
58
58
  def test_negative_digit(self):
59
- with self.assertRaises(ValueError):
59
+ with self.assertRaisesWithMessage(ValueError):
60
60
  rebase(2, [1, -1, 1, 0, 1, 0], 10)
61
61
 
62
62
  def test_invalid_positive_digit(self):
63
- with self.assertRaises(ValueError):
63
+ with self.assertRaisesWithMessage(ValueError):
64
64
  rebase(2, [1, 2, 1, 0, 1, 0], 10)
65
65
 
66
66
  def test_second_base_is_one(self):
67
- with self.assertRaises(ValueError):
67
+ with self.assertRaisesWithMessage(ValueError):
68
68
  rebase(2, [1, 0, 1, 0, 1, 0], 1)
69
69
 
70
70
  def test_second_base_is_zero(self):
71
- with self.assertRaises(ValueError):
71
+ with self.assertRaisesWithMessage(ValueError):
72
72
  rebase(10, [7], 0)
73
73
 
74
74
  def test_second_base_is_negative(self):
75
- with self.assertRaises(ValueError):
75
+ with self.assertRaisesWithMessage(ValueError):
76
76
  rebase(2, [1], -7)
77
77
 
78
78
  def test_both_bases_are_negative(self):
79
- with self.assertRaises(ValueError):
79
+ with self.assertRaisesWithMessage(ValueError):
80
80
  rebase(-2, [1], -7)
81
81
 
82
+ # Utility functions
83
+ def setUp(self):
84
+ try:
85
+ self.assertRaisesRegex = self.assertRaisesRegexp
86
+ except AttributeError:
87
+ pass
88
+
89
+ def assertRaisesWithMessage(self, exception):
90
+ return self.assertRaisesRegex(exception, r".+")
91
+
82
92
 
83
93
  if __name__ == '__main__':
84
94
  unittest.main()
@@ -29,6 +29,21 @@ allergens that score 256, 512, 1024, etc.). Your program should
29
29
  ignore those components of the score. For example, if the allergy
30
30
  score is 257, your program should only report the eggs (1) allergy.
31
31
 
32
+ ## Exception messages
33
+
34
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
35
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
36
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
37
+ a message.
38
+
39
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
40
+ `raise Exception`, you shold write:
41
+
42
+ ```python
43
+ raise Exception("Meaningful message indicating the source of the error")
44
+ ```
45
+
46
+
32
47
  ## Submitting Exercises
33
48
 
34
49
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
@@ -31,6 +31,21 @@ a multi-digit number must not be zero.
31
31
 
32
32
  Write a function to solve alphametics puzzles.
33
33
 
34
+ ## Exception messages
35
+
36
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
37
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
38
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
39
+ a message.
40
+
41
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
42
+ `raise Exception`, you shold write:
43
+
44
+ ```python
45
+ raise Exception("Meaningful message indicating the source of the error")
46
+ ```
47
+
48
+
34
49
  ## Submitting Exercises
35
50
 
36
51
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
@@ -6,6 +6,21 @@ Given `"listen"` and a list of candidates like `"enlists" "google"
6
6
  "inlets" "banana"` the program should return a list containing
7
7
  `"inlets"`.
8
8
 
9
+ ## Exception messages
10
+
11
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
12
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
13
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
14
+ a message.
15
+
16
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
17
+ `raise Exception`, you shold write:
18
+
19
+ ```python
20
+ raise Exception("Meaningful message indicating the source of the error")
21
+ ```
22
+
23
+
9
24
  ## Submitting Exercises
10
25
 
11
26
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
@@ -28,6 +28,21 @@ things based on word boundaries.
28
28
  - Decoding `gvhg` gives `test`
29
29
  - Decoding `gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt` gives `thequickbrownfoxjumpsoverthelazydog`
30
30
 
31
+ ## Exception messages
32
+
33
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
34
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
35
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
36
+ a message.
37
+
38
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
39
+ `raise Exception`, you shold write:
40
+
41
+ ```python
42
+ raise Exception("Meaningful message indicating the source of the error")
43
+ ```
44
+
45
+
31
46
  ## Submitting Exercises
32
47
 
33
48
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
@@ -1,6 +1,6 @@
1
1
  # Beer Song
2
2
 
3
- Produce the lyrics to that beloved classic, that field-trip favorite: 99 Bottles of Beer on the Wall.
3
+ Recite the lyrics to that beloved classic, that field-trip favorite: 99 Bottles of Beer on the Wall.
4
4
 
5
5
  Note that not all verses are identical.
6
6
 
@@ -320,6 +320,21 @@ are some additional things you could try:
320
320
  Then please share your thoughts in a comment on the submission. Did this
321
321
  experiment make the code better? Worse? Did you learn anything from it?
322
322
 
323
+ ## Exception messages
324
+
325
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
326
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
327
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
328
+ a message.
329
+
330
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
331
+ `raise Exception`, you shold write:
332
+
333
+ ```python
334
+ raise Exception("Meaningful message indicating the source of the error")
335
+ ```
336
+
337
+
323
338
  ## Submitting Exercises
324
339
 
325
340
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
@@ -53,6 +53,20 @@ And if we then added 1, 5, and 7, it would look like this
53
53
  / \ / \
54
54
  1 3 5 7
55
55
 
56
+ ## Exception messages
57
+
58
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
59
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
60
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
61
+ a message.
62
+
63
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
64
+ `raise Exception`, you shold write:
65
+
66
+ ```python
67
+ raise Exception("Meaningful message indicating the source of the error")
68
+ ```
69
+
56
70
 
57
71
  ## Submitting Exercises
58
72
 
@@ -65,7 +79,7 @@ please see the [help page](http://exercism.io/languages/python).
65
79
 
66
80
  ## Source
67
81
 
68
- Wikipedia [https://en.wikipedia.org/wiki/Binary_search_tree](https://en.wikipedia.org/wiki/Binary_search_tree)
82
+ Josh Cheek [https://twitter.com/josh_cheek](https://twitter.com/josh_cheek)
69
83
 
70
84
  ## Submitting Incomplete Solutions
71
- It's possible to submit an incomplete solution so you can see how others have completed the exercise.
85
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -34,6 +34,21 @@ A binary search halves the number of items to check with each iteration,
34
34
  so locating an item (or determining its absence) takes logarithmic time.
35
35
  A binary search is a dichotomic divide and conquer search algorithm.
36
36
 
37
+ ## Exception messages
38
+
39
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
40
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
41
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
42
+ a message.
43
+
44
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
45
+ `raise Exception`, you shold write:
46
+
47
+ ```python
48
+ raise Exception("Meaningful message indicating the source of the error")
49
+ ```
50
+
51
+
37
52
  ## Submitting Exercises
38
53
 
39
54
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
@@ -29,21 +29,31 @@ class BinarySearchTests(unittest.TestCase):
29
29
  5)
30
30
 
31
31
  def test_identifies_value_missing(self):
32
- with self.assertRaises(ValueError):
32
+ with self.assertRaisesWithMessage(ValueError):
33
33
  binary_search([1, 3, 4, 6, 8, 9, 11], 7)
34
34
 
35
35
  def test_value_smaller_than_arrays_minimum(self):
36
- with self.assertRaises(ValueError):
36
+ with self.assertRaisesWithMessage(ValueError):
37
37
  binary_search([1, 3, 4, 6, 8, 9, 11], 0)
38
38
 
39
39
  def test_value_larger_than_arrays_maximum(self):
40
- with self.assertRaises(ValueError):
40
+ with self.assertRaisesWithMessage(ValueError):
41
41
  binary_search([1, 3, 4, 6, 8, 9, 11], 13)
42
42
 
43
43
  def test_empty_array(self):
44
- with self.assertRaises(ValueError):
44
+ with self.assertRaisesWithMessage(ValueError):
45
45
  binary_search([], 1)
46
46
 
47
+ # Utility functions
48
+ def setUp(self):
49
+ try:
50
+ self.assertRaisesRegex = self.assertRaisesRegexp
51
+ except AttributeError:
52
+ pass
53
+
54
+ def assertRaisesWithMessage(self, exception):
55
+ return self.assertRaisesRegex(exception, r".+")
56
+
47
57
 
48
58
  if __name__ == '__main__':
49
59
  unittest.main()
@@ -30,6 +30,21 @@ Binary is similar, but uses powers of 2 rather than powers of 10.
30
30
 
31
31
  So: `101 => 1*2^2 + 0*2^1 + 1*2^0 => 1*4 + 0*2 + 1*1 => 4 + 1 => 5 base 10`.
32
32
 
33
+ ## Exception messages
34
+
35
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
36
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
37
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
38
+ a message.
39
+
40
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
41
+ `raise Exception`, you shold write:
42
+
43
+ ```python
44
+ raise Exception("Meaningful message indicating the source of the error")
45
+ ```
46
+
47
+
33
48
  ## Submitting Exercises
34
49
 
35
50
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
@@ -32,21 +32,31 @@ class BinaryTests(unittest.TestCase):
32
32
  self.assertEqual(parse_binary("10001101000"), 1128)
33
33
 
34
34
  def test_invalid_binary_text_only(self):
35
- with self.assertRaises(ValueError):
35
+ with self.assertRaisesWithMessage(ValueError):
36
36
  parse_binary("carrot")
37
37
 
38
38
  def test_invalid_binary_number_not_base2(self):
39
- with self.assertRaises(ValueError):
39
+ with self.assertRaisesWithMessage(ValueError):
40
40
  parse_binary("102011")
41
41
 
42
42
  def test_invalid_binary_numbers_with_text(self):
43
- with self.assertRaises(ValueError):
43
+ with self.assertRaisesWithMessage(ValueError):
44
44
  parse_binary("10nope")
45
45
 
46
46
  def test_invalid_binary_text_with_numbers(self):
47
- with self.assertRaises(ValueError):
47
+ with self.assertRaisesWithMessage(ValueError):
48
48
  parse_binary("nope10")
49
49
 
50
+ # Utility functions
51
+ def setUp(self):
52
+ try:
53
+ self.assertRaisesRegex = self.assertRaisesRegexp
54
+ except AttributeError:
55
+ pass
56
+
57
+ def assertRaisesWithMessage(self, exception):
58
+ return self.assertRaisesRegex(exception, r".+")
59
+
50
60
 
51
61
  if __name__ == '__main__':
52
62
  unittest.main()
@@ -11,6 +11,21 @@ anything.
11
11
 
12
12
  He answers 'Whatever.' to anything else.
13
13
 
14
+ ## Exception messages
15
+
16
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
17
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
18
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
19
+ a message.
20
+
21
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
22
+ `raise Exception`, you shold write:
23
+
24
+ ```python
25
+ raise Exception("Meaningful message indicating the source of the error")
26
+ ```
27
+
28
+
14
29
  ## Submitting Exercises
15
30
 
16
31
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
@@ -67,6 +67,21 @@ For a total of $51.20
67
67
 
68
68
  And $51.20 is the price with the biggest discount.
69
69
 
70
+ ## Exception messages
71
+
72
+ Sometimes it is necessary to raise an exception. When you do this, you should include a meaningful error message to
73
+ indicate what the source of the error is. This makes your code more readable and helps significantly with debugging. Not
74
+ every exercise will require you to raise an exception, but for those that do, the tests will only pass if you include
75
+ a message.
76
+
77
+ To raise a message with an exception, just write it as an argument to the exception type. For example, instead of
78
+ `raise Exception`, you shold write:
79
+
80
+ ```python
81
+ raise Exception("Meaningful message indicating the source of the error")
82
+ ```
83
+
84
+
70
85
  ## Submitting Exercises
71
86
 
72
87
  Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.