trackler 2.2.1.6 → 2.2.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (236) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/c/README.md +27 -0
  4. data/tracks/coffeescript/config.json +1 -0
  5. data/tracks/coldfusion/config.json +1 -1
  6. data/tracks/crystal/README.md +27 -7
  7. data/tracks/crystal/config/maintainers.json +25 -0
  8. data/tracks/crystal/generator/spec/remote_data_file_spec.cr +1 -1
  9. data/tracks/crystal/generator/src/exercise_generator.cr +1 -1
  10. data/tracks/crystal/generator/src/remote_data_file.cr +2 -2
  11. data/tracks/csharp/config.json +1 -2
  12. data/tracks/csharp/config/maintainers.json +55 -0
  13. data/tracks/csharp/docs/EXERCISE_README_INSERT.md +1 -1
  14. data/tracks/csharp/exercises/accumulate/README.md +1 -1
  15. data/tracks/csharp/exercises/acronym/README.md +1 -1
  16. data/tracks/csharp/exercises/all-your-base/README.md +1 -1
  17. data/tracks/csharp/exercises/allergies/README.md +1 -1
  18. data/tracks/csharp/exercises/alphametics/README.md +1 -1
  19. data/tracks/csharp/exercises/anagram/README.md +1 -1
  20. data/tracks/csharp/exercises/atbash-cipher/README.md +1 -1
  21. data/tracks/csharp/exercises/bank-account/README.md +1 -1
  22. data/tracks/csharp/exercises/beer-song/README.md +1 -1
  23. data/tracks/csharp/exercises/binary-search-tree/README.md +1 -1
  24. data/tracks/csharp/exercises/binary-search/README.md +1 -1
  25. data/tracks/csharp/exercises/bob/README.md +1 -1
  26. data/tracks/csharp/exercises/book-store/README.md +1 -1
  27. data/tracks/csharp/exercises/bowling/README.md +1 -1
  28. data/tracks/csharp/exercises/bracket-push/README.md +1 -1
  29. data/tracks/csharp/exercises/change/README.md +1 -1
  30. data/tracks/csharp/exercises/circular-buffer/README.md +1 -1
  31. data/tracks/csharp/exercises/clock/README.md +1 -1
  32. data/tracks/csharp/exercises/connect/README.md +1 -1
  33. data/tracks/csharp/exercises/crypto-square/README.md +1 -1
  34. data/tracks/csharp/exercises/custom-set/README.md +1 -1
  35. data/tracks/csharp/exercises/diamond/README.md +1 -1
  36. data/tracks/csharp/exercises/difference-of-squares/README.md +1 -1
  37. data/tracks/csharp/exercises/diffie-hellman/README.md +1 -1
  38. data/tracks/csharp/exercises/dominoes/README.md +1 -1
  39. data/tracks/csharp/exercises/dot-dsl/README.md +1 -1
  40. data/tracks/csharp/exercises/error-handling/README.md +1 -1
  41. data/tracks/csharp/exercises/etl/README.md +1 -1
  42. data/tracks/csharp/exercises/flatten-array/README.md +1 -1
  43. data/tracks/csharp/exercises/food-chain/README.md +1 -1
  44. data/tracks/csharp/exercises/forth/README.md +1 -1
  45. data/tracks/csharp/exercises/gigasecond/README.md +1 -1
  46. data/tracks/csharp/exercises/go-counting/README.md +1 -1
  47. data/tracks/csharp/exercises/grade-school/README.md +1 -1
  48. data/tracks/csharp/exercises/grains/README.md +1 -1
  49. data/tracks/csharp/exercises/grep/README.md +1 -1
  50. data/tracks/csharp/exercises/hamming/README.md +1 -1
  51. data/tracks/csharp/exercises/hangman/README.md +1 -1
  52. data/tracks/csharp/exercises/hello-world/README.md +1 -1
  53. data/tracks/csharp/exercises/house/README.md +1 -1
  54. data/tracks/csharp/exercises/isogram/README.md +1 -1
  55. data/tracks/csharp/exercises/kindergarten-garden/README.md +1 -1
  56. data/tracks/csharp/exercises/largest-series-product/README.md +1 -1
  57. data/tracks/csharp/exercises/leap/README.md +1 -1
  58. data/tracks/csharp/exercises/ledger/README.md +1 -1
  59. data/tracks/csharp/exercises/linked-list/README.md +1 -1
  60. data/tracks/csharp/exercises/list-ops/README.md +1 -1
  61. data/tracks/csharp/exercises/luhn/README.md +1 -1
  62. data/tracks/csharp/exercises/markdown/README.md +1 -1
  63. data/tracks/csharp/exercises/matrix/README.md +1 -1
  64. data/tracks/csharp/exercises/meetup/README.md +1 -1
  65. data/tracks/csharp/exercises/minesweeper/README.md +1 -1
  66. data/tracks/csharp/exercises/nth-prime/README.md +1 -1
  67. data/tracks/csharp/exercises/nucleotide-count/README.md +1 -1
  68. data/tracks/csharp/exercises/ocr-numbers/README.md +1 -1
  69. data/tracks/csharp/exercises/palindrome-products/README.md +1 -1
  70. data/tracks/csharp/exercises/pangram/README.md +1 -1
  71. data/tracks/csharp/exercises/parallel-letter-frequency/README.md +1 -1
  72. data/tracks/csharp/exercises/pascals-triangle/README.md +1 -1
  73. data/tracks/csharp/exercises/perfect-numbers/README.md +1 -1
  74. data/tracks/csharp/exercises/phone-number/README.md +1 -1
  75. data/tracks/csharp/exercises/pig-latin/README.md +1 -1
  76. data/tracks/csharp/exercises/poker/README.md +1 -1
  77. data/tracks/csharp/exercises/pov/README.md +1 -1
  78. data/tracks/csharp/exercises/prime-factors/README.md +1 -1
  79. data/tracks/csharp/exercises/protein-translation/README.md +1 -1
  80. data/tracks/csharp/exercises/proverb/README.md +1 -1
  81. data/tracks/csharp/exercises/pythagorean-triplet/README.md +1 -1
  82. data/tracks/csharp/exercises/queen-attack/README.md +1 -1
  83. data/tracks/csharp/exercises/rail-fence-cipher/README.md +1 -1
  84. data/tracks/csharp/exercises/raindrops/README.md +1 -1
  85. data/tracks/csharp/exercises/react/README.md +1 -1
  86. data/tracks/csharp/exercises/rectangles/README.md +1 -1
  87. data/tracks/csharp/exercises/rna-transcription/README.md +1 -1
  88. data/tracks/csharp/exercises/robot-name/README.md +1 -1
  89. data/tracks/csharp/exercises/robot-simulator/README.md +1 -1
  90. data/tracks/csharp/exercises/roman-numerals/README.md +1 -1
  91. data/tracks/csharp/exercises/rotational-cipher/README.md +1 -1
  92. data/tracks/csharp/exercises/run-length-encoding/README.md +1 -1
  93. data/tracks/csharp/exercises/saddle-points/README.md +1 -1
  94. data/tracks/csharp/exercises/say/README.md +1 -1
  95. data/tracks/csharp/exercises/scale-generator/README.md +1 -1
  96. data/tracks/csharp/exercises/scrabble-score/README.md +1 -1
  97. data/tracks/csharp/exercises/secret-handshake/README.md +1 -1
  98. data/tracks/csharp/exercises/series/README.md +1 -1
  99. data/tracks/csharp/exercises/sgf-parsing/README.md +1 -1
  100. data/tracks/csharp/exercises/sieve/README.md +1 -1
  101. data/tracks/csharp/exercises/simple-cipher/README.md +1 -1
  102. data/tracks/csharp/exercises/simple-linked-list/README.md +1 -1
  103. data/tracks/csharp/exercises/space-age/README.md +1 -1
  104. data/tracks/csharp/exercises/strain/README.md +1 -1
  105. data/tracks/csharp/exercises/sublist/README.md +1 -1
  106. data/tracks/csharp/exercises/sum-of-multiples/README.md +1 -1
  107. data/tracks/csharp/exercises/tournament/README.md +1 -1
  108. data/tracks/csharp/exercises/transpose/README.md +1 -1
  109. data/tracks/csharp/exercises/tree-building/README.md +1 -1
  110. data/tracks/csharp/exercises/triangle/README.md +1 -1
  111. data/tracks/csharp/exercises/twelve-days/README.md +1 -1
  112. data/tracks/csharp/exercises/two-bucket/README.md +1 -1
  113. data/tracks/csharp/exercises/variable-length-quantity/README.md +1 -1
  114. data/tracks/csharp/exercises/word-count/README.md +1 -1
  115. data/tracks/csharp/exercises/word-search/README.md +1 -1
  116. data/tracks/csharp/exercises/wordy/README.md +1 -1
  117. data/tracks/csharp/exercises/zebra-puzzle/README.md +1 -1
  118. data/tracks/csharp/exercises/zipper/README.md +1 -1
  119. data/tracks/d/config.json +1 -0
  120. data/tracks/dart/config/maintainers.json +15 -0
  121. data/tracks/ecmascript/config.json +76 -193
  122. data/tracks/ecmascript/exercises/twelve-days/README.md +66 -0
  123. data/tracks/ecmascript/exercises/twelve-days/example.js +53 -0
  124. data/tracks/ecmascript/exercises/twelve-days/package.json +68 -0
  125. data/tracks/ecmascript/exercises/twelve-days/twelve-days.spec.js +106 -0
  126. data/tracks/factor/config.json +1 -1
  127. data/tracks/fsharp/config/maintainers.json +35 -0
  128. data/tracks/go/config.json +82 -38
  129. data/tracks/go/config/maintainers.json +13 -22
  130. data/tracks/go/exercises/bowling/cases_test.go +11 -11
  131. data/tracks/go/exercises/forth/cases_test.go +7 -7
  132. data/tracks/go/exercises/forth/example.go +1 -1
  133. data/tracks/go/exercises/forth/forth_test.go +1 -1
  134. data/tracks/go/exercises/hamming/cases_test.go +7 -7
  135. data/tracks/go/exercises/hamming/hamming.go +1 -1
  136. data/tracks/go/exercises/phone-number/cases_test.go +2 -7
  137. data/tracks/go/exercises/phone-number/example.go +1 -1
  138. data/tracks/go/exercises/phone-number/phone_number_test.go +1 -1
  139. data/tracks/go/exercises/rna-transcription/cases_test.go +7 -7
  140. data/tracks/go/exercises/secret-handshake/cases_test.go +1 -1
  141. data/tracks/groovy/config.json +1 -0
  142. data/tracks/haxe/config.json +1 -1
  143. data/tracks/java/.travis.yml +1 -1
  144. data/tracks/java/config/maintainers.json +20 -0
  145. data/tracks/java/exercises/custom-set/src/test/java/CustomSetTest.java +1 -1
  146. data/tracks/java/exercises/word-count/src/test/java/WordCountTest.java +1 -1
  147. data/tracks/javascript/config.json +229 -247
  148. data/tracks/kotlin/config/maintainers.json +35 -0
  149. data/tracks/lfe/config/maintainers.json +15 -0
  150. data/tracks/lisp/config/maintainers.json +55 -0
  151. data/tracks/ocaml/config.json +0 -5
  152. data/tracks/ocaml/config/maintainers.json +25 -0
  153. data/tracks/perl5/config/maintainers.json +25 -0
  154. data/tracks/perl6/config/maintainers.json +25 -0
  155. data/tracks/pony/config/maintainers.json +15 -0
  156. data/tracks/pony/exercises/atbash-cipher/example.pony +2 -2
  157. data/tracks/pony/exercises/beer-song/example.pony +1 -1
  158. data/tracks/pony/exercises/bob/example.pony +1 -1
  159. data/tracks/pony/exercises/difference-of-squares/example.pony +1 -1
  160. data/tracks/pony/exercises/hamming/test.pony +12 -12
  161. data/tracks/pony/exercises/pascals-triangle/example.pony +1 -1
  162. data/tracks/pony/exercises/pascals-triangle/test.pony +6 -6
  163. data/tracks/pony/exercises/rna-transcription/test.pony +3 -3
  164. data/tracks/pony/exercises/roman-numerals/test.pony +3 -3
  165. data/tracks/purescript/config/maintainers.json +35 -0
  166. data/tracks/r/config.json +140 -81
  167. data/tracks/r/exercises/collatz-conjecture/README.md +43 -0
  168. data/tracks/r/exercises/collatz-conjecture/collatz-conjecture.R +3 -0
  169. data/tracks/r/exercises/collatz-conjecture/example.R +13 -0
  170. data/tracks/r/exercises/collatz-conjecture/test_collatz-conjecture.R +28 -0
  171. data/tracks/r/exercises/nucleotide-count/README.md +43 -0
  172. data/tracks/r/exercises/nucleotide-count/example.R +17 -0
  173. data/tracks/r/exercises/nucleotide-count/nucleotide-count.R +3 -0
  174. data/tracks/r/exercises/nucleotide-count/test_nucleotide-count.R +51 -0
  175. data/tracks/r/exercises/pangram/README.md +25 -0
  176. data/tracks/r/exercises/pangram/example.R +14 -0
  177. data/tracks/r/exercises/pangram/pangram.R +3 -0
  178. data/tracks/r/exercises/pangram/test_pangram.R +42 -0
  179. data/tracks/r/exercises/triangle/.meta/hints.md +4 -0
  180. data/tracks/r/exercises/triangle/README.md +41 -0
  181. data/tracks/r/exercises/triangle/example.R +23 -0
  182. data/tracks/r/exercises/triangle/test_triangle.R +72 -0
  183. data/tracks/r/exercises/triangle/triangle.R +3 -0
  184. data/tracks/rust/config.json +32 -1
  185. data/tracks/rust/config/maintainers.json +1 -6
  186. data/tracks/rust/exercises/acronym/tests/acronym.rs +1 -1
  187. data/tracks/rust/exercises/beer-song/example.rs +1 -1
  188. data/tracks/rust/exercises/circular-buffer/example.rs +8 -10
  189. data/tracks/rust/exercises/circular-buffer/tests/circular-buffer.rs +2 -2
  190. data/tracks/rust/exercises/clock/.meta/hints.md +10 -0
  191. data/tracks/rust/exercises/clock/Cargo.lock +4 -0
  192. data/tracks/rust/exercises/clock/Cargo.toml +6 -0
  193. data/tracks/rust/exercises/clock/README.md +57 -0
  194. data/tracks/rust/exercises/clock/example.rs +32 -0
  195. data/tracks/{ocaml/exercises/point-mutations/example.ml → rust/exercises/clock/src/lib.rs} +0 -0
  196. data/tracks/rust/exercises/clock/tests/clock.rs +331 -0
  197. data/tracks/rust/exercises/custom-set/tests/custom-set.rs +3 -3
  198. data/tracks/rust/exercises/dominoes/example.rs +1 -1
  199. data/tracks/rust/exercises/grade-school/example.rs +1 -1
  200. data/tracks/rust/exercises/hamming/example.rs +1 -1
  201. data/tracks/rust/exercises/nth-prime/Cargo.lock +4 -0
  202. data/tracks/rust/exercises/nth-prime/Cargo.toml +6 -0
  203. data/tracks/rust/exercises/nth-prime/README.md +47 -0
  204. data/tracks/rust/exercises/nth-prime/example.rs +28 -0
  205. data/tracks/rust/exercises/nth-prime/src/lib.rs +0 -0
  206. data/tracks/rust/exercises/nth-prime/tests/nth-prime.rs +30 -0
  207. data/tracks/rust/exercises/parallel-letter-frequency/example.rs +1 -1
  208. data/tracks/rust/exercises/phone-number/example.rs +1 -1
  209. data/tracks/rust/exercises/pythagorean-triplet/Cargo.lock +4 -0
  210. data/tracks/rust/exercises/pythagorean-triplet/Cargo.toml +6 -0
  211. data/tracks/rust/exercises/pythagorean-triplet/README.md +56 -0
  212. data/tracks/rust/exercises/pythagorean-triplet/example.rs +11 -0
  213. data/tracks/rust/exercises/pythagorean-triplet/src/lib.rs +0 -0
  214. data/tracks/rust/exercises/pythagorean-triplet/tests/pythagorean-triplet.rs +6 -0
  215. data/tracks/rust/exercises/rna-transcription/tests/rna-transcription.rs +1 -1
  216. data/tracks/rust/exercises/robot-name/tests/robot-name.rs +2 -2
  217. data/tracks/rust/exercises/say/example.rs +4 -4
  218. data/tracks/rust/exercises/say/tests/say.rs +4 -4
  219. data/tracks/rust/exercises/tournament/example.rs +2 -2
  220. data/tracks/scala/config/maintainers.json +10 -6
  221. data/tracks/scala/exercises/bracket-push/example.scala +2 -2
  222. data/tracks/scala/exercises/bracket-push/src/test/scala/BracketPushTest.scala +74 -0
  223. data/tracks/scala/exercises/crypto-square/example.scala +9 -9
  224. data/tracks/scala/exercises/crypto-square/src/test/scala/CryptoSquareTest.scala +33 -41
  225. data/tracks/scala/testgen/src/main/scala/BracketPushTestGenerator.scala +9 -38
  226. data/tracks/scala/testgen/src/main/scala/CryptoSquareTestGenerator.scala +17 -0
  227. data/tracks/sml/config.json +1 -1
  228. data/tracks/swift/config/maintainers.json +35 -0
  229. data/tracks/swift/docs/ABOUT.md +15 -5
  230. data/tracks/vimscript/config/maintainers.json +35 -0
  231. metadata +58 -8
  232. data/tracks/ocaml/exercises/point-mutations/Makefile +0 -8
  233. data/tracks/ocaml/exercises/point-mutations/README.md +0 -81
  234. data/tracks/ocaml/exercises/point-mutations/dna.mli +0 -6
  235. data/tracks/scala/exercises/bracket-push/src/test/scala/BracketsTest.scala +0 -68
  236. data/tracks/scala/exercises/crypto-square/src/main/scala/CryptoSquare.scala +0 -11
@@ -0,0 +1,3 @@
1
+ triangle <- function(x, y, z) {
2
+
3
+ }
@@ -46,6 +46,15 @@
46
46
  "Mutable string"
47
47
  ]
48
48
  },
49
+ {
50
+ "uuid": "ee5048a7-c625-434d-a0a2-4fd54757ee02",
51
+ "slug": "nth-prime",
52
+ "core": false,
53
+ "unlocked_by": null,
54
+ "difficulty": 1,
55
+ "topics": [
56
+ ]
57
+ },
49
58
  {
50
59
  "uuid": "38ef1802-2730-4f94-bafe-d2cd6b3e7f95",
51
60
  "slug": "bob",
@@ -113,6 +122,16 @@
113
122
  "panic"
114
123
  ]
115
124
  },
125
+ {
126
+ "uuid": "6e7cac84-99d1-4f9f-b7d6-48ea43024bc0",
127
+ "slug": "pythagorean-triplet",
128
+ "core": false,
129
+ "unlocked_by": null,
130
+ "difficulty": 1,
131
+ "topics": [
132
+ "option"
133
+ ]
134
+ },
116
135
  {
117
136
  "uuid": "9f649818-0c82-4b79-b912-4d65b9f60e10",
118
137
  "slug": "prime-factors",
@@ -133,7 +152,7 @@
133
152
  "string concatenation",
134
153
  "modulus"
135
154
  ]
136
- },
155
+ },
137
156
  {
138
157
  "uuid": "4dc9b165-792a-4438-be80-df9aab6f6a9c",
139
158
  "slug": "run-length-encoding",
@@ -147,6 +166,18 @@
147
166
  "loop"
148
167
  ]
149
168
  },
169
+ {
170
+ "uuid": "543a3ca2-fb9b-4f20-a873-ff23595d41df",
171
+ "slug": "clock",
172
+ "core": false,
173
+ "unlocked_by": null,
174
+ "difficulty": 4,
175
+ "topics": [
176
+ "traits",
177
+ "derive",
178
+ "struct"
179
+ ]
180
+ },
150
181
  {
151
182
  "uuid": "2874216a-0822-4ec2-892e-d451fd89646a",
152
183
  "slug": "hamming",
@@ -13,12 +13,7 @@
13
13
  {
14
14
  "github_username": "etrepum",
15
15
  "show_on_website": false,
16
- "alumnus": false,
17
- "name": null,
18
- "bio": null,
19
- "link_text": null,
20
- "link_url": null,
21
- "avatar_url": null
16
+ "alumnus": true
22
17
  },
23
18
  {
24
19
  "github_username": "ijanos",
@@ -38,6 +38,6 @@ fn non_acronym_all_caps_word() {
38
38
  #[test]
39
39
  #[ignore]
40
40
  fn hyphenated() {
41
- assert_eq!(acronym::abbreviate("Complementary metal-oxide semiconductor"),
41
+ assert_eq!(acronym::abbreviate("Complementary metal-oxide semiconductor"),
42
42
  "CMOS");
43
43
  }
@@ -1,4 +1,4 @@
1
- pub fn verse(n: i32) -> String {
1
+ pub fn verse(n: i32) -> String {
2
2
  match n {
3
3
  0 => "No more bottles of beer on the wall, no more bottles of beer.\n\
4
4
  Go to the store and buy some more, 99 bottles of beer on the wall.\n".to_string(),
@@ -13,13 +13,13 @@ pub struct CircularBuffer<T: Default + Clone> {
13
13
 
14
14
  impl<T: Default + Clone> CircularBuffer<T> {
15
15
  // this circular buffer keeps an unallocated slot between the start and the end
16
- // when the buffer is full.
16
+ // when the buffer is full.
17
17
  pub fn new(size: usize) -> CircularBuffer<T> {
18
- CircularBuffer {
19
- buffer: vec![T::default(); size + 1],
20
- size: size + 1,
21
- start: 0,
22
- end: 0
18
+ CircularBuffer {
19
+ buffer: vec![T::default(); size + 1],
20
+ size: size + 1,
21
+ start: 0,
22
+ end: 0
23
23
  }
24
24
  }
25
25
 
@@ -36,12 +36,11 @@ impl<T: Default + Clone> CircularBuffer<T> {
36
36
  pub fn write(&mut self, byte: T) -> Result<(), Error> {
37
37
  if self.is_full() {
38
38
  return Err(Error::FullBuffer);
39
- }
40
-
39
+ }
40
+
41
41
  self.buffer[self.end] = byte;
42
42
  self.advance_end();
43
43
  Ok(())
44
-
45
44
  }
46
45
 
47
46
  pub fn overwrite(&mut self, byte: T) {
@@ -73,5 +72,4 @@ impl<T: Default + Clone> CircularBuffer<T> {
73
72
  fn advance_end(&mut self) {
74
73
  self.end = (self.end + 1) % self.size;
75
74
  }
76
-
77
75
  }
@@ -65,7 +65,7 @@ mod tests {
65
65
  buffer.write('2');
66
66
  assert_eq!(Err(Error::FullBuffer), buffer.write('3'));
67
67
  }
68
-
68
+
69
69
  #[test]
70
70
  #[ignore]
71
71
  fn overwrite_item_in_non_full_buffer() {
@@ -100,7 +100,7 @@ mod tests {
100
100
  assert_eq!(-1,buffer.read().unwrap());
101
101
  assert_eq!(Err(Error::EmptyBuffer), buffer.read());
102
102
  }
103
-
103
+
104
104
  #[test]
105
105
  #[ignore]
106
106
  fn string_buffer() {
@@ -0,0 +1,10 @@
1
+ ## Rust Traits for .to_string()
2
+
3
+ Did you implement .to_string() for the Clock struct?
4
+
5
+ If so, try implementing the
6
+ [Display trait](https://doc.rust-lang.org/std/fmt/trait.Display.html) for Clock instead.
7
+
8
+ Traits allow for a common way to implement functionality for various types.
9
+
10
+ For additional learning, how would you implement String::from for the Clock type?
@@ -0,0 +1,4 @@
1
+ [root]
2
+ name = "clock"
3
+ version = "1.0.0"
4
+
@@ -0,0 +1,6 @@
1
+ [package]
2
+ name = "clock"
3
+ version = "1.0.0"
4
+ authors = ["sacherjj <sacherjj@gmail.com>"]
5
+
6
+ [dependencies]
@@ -0,0 +1,57 @@
1
+ # Clock
2
+
3
+ Implement a clock that handles times without dates.
4
+
5
+ You should be able to add and subtract minutes to it.
6
+
7
+ Two clocks that represent the same time should be equal to each other.
8
+
9
+ ## Rust Traits for .to_string()
10
+
11
+ Did you implement .to_string() for the Clock struct?
12
+
13
+ If so, try implementing the
14
+ [Display trait](https://doc.rust-lang.org/std/fmt/trait.Display.html) for Clock instead.
15
+
16
+ Traits allow for a common way to implement functionality for various types.
17
+
18
+ For additional learning, how would you implement String::from for the Clock type?
19
+
20
+
21
+ ## Rust Installation
22
+
23
+ Refer to the [exercism help page][help-page] for Rust installation and learning
24
+ resources.
25
+
26
+ ## Writing the Code
27
+
28
+ Execute the tests with:
29
+
30
+ ```bash
31
+ $ cargo test
32
+ ```
33
+
34
+ All but the first test have been ignored. After you get the first test to
35
+ pass, remove the ignore flag (`#[ignore]`) from the next test and get the tests
36
+ to pass again. The test file is located in the `tests` directory. You can
37
+ also remove the ignore flag from all the tests to get them to run all at once
38
+ if you wish.
39
+
40
+ Make sure to read the [Crates and Modules](https://doc.rust-lang.org/stable/book/crates-and-modules.html) chapter if you
41
+ haven't already, it will help you with organizing your files.
42
+
43
+ ## Feedback, Issues, Pull Requests
44
+
45
+ The [exercism/rust](https://github.com/exercism/rust) repository on GitHub is the home for all of the Rust exercises. If you have feedback about an exercise, or want to help implement new exercises, head over there and create an issue. Members of the [rust track team](https://github.com/orgs/exercism/teams/rust) are happy to help!
46
+
47
+ If you want to know more about Exercism, take a look at the [contribution guide](https://github.com/exercism/docs/blob/master/contributing-to-language-tracks/README.md).
48
+
49
+ [help-page]: http://exercism.io/languages/rust
50
+ [crates-and-modules]: http://doc.rust-lang.org/stable/book/crates-and-modules.html
51
+
52
+ ## Source
53
+
54
+ Pairing session with Erin Drummond [https://twitter.com/ebdrummond](https://twitter.com/ebdrummond)
55
+
56
+ ## Submitting Incomplete Solutions
57
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,32 @@
1
+ use std::fmt;
2
+
3
+ #[derive(Eq,PartialEq,Debug)]
4
+ pub struct Clock {
5
+ minutes: i32
6
+ }
7
+
8
+ impl fmt::Display for Clock {
9
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10
+ let hours = self.minutes / 60;
11
+ let mins = self.minutes % 60;
12
+ write!(f, "{:02}:{:02}", hours, mins)
13
+ }
14
+ }
15
+
16
+ impl Clock {
17
+ pub fn new(hour: i32, minute: i32) -> Self {
18
+ Clock::build(hour * 60 + minute)
19
+ }
20
+
21
+ fn build(minutes: i32) -> Self {
22
+ let mut mins = minutes;
23
+ while mins < 0 {
24
+ mins += 1440;
25
+ }
26
+ Clock { minutes: mins % 1440 }
27
+ }
28
+
29
+ pub fn add_minutes(&mut self, minutes: i32) -> Self {
30
+ Clock::build(self.minutes + minutes)
31
+ }
32
+ }
@@ -0,0 +1,331 @@
1
+ extern crate clock;
2
+
3
+ use clock::Clock;
4
+
5
+ //
6
+ // Clock Creation
7
+ //
8
+
9
+ #[test]
10
+ fn test_on_the_hour() {
11
+ assert_eq!(Clock::new(8, 0).to_string(), "08:00");
12
+ }
13
+
14
+ #[test]
15
+ #[ignore]
16
+ fn test_past_the_hour() {
17
+ assert_eq!(Clock::new(11, 9).to_string(), "11:09");
18
+ }
19
+
20
+ #[test]
21
+ #[ignore]
22
+ fn test_midnight_is_zero_hours() {
23
+ assert_eq!(Clock::new(24, 0).to_string(), "00:00");
24
+ }
25
+
26
+ #[test]
27
+ #[ignore]
28
+ fn test_hour_rolls_over() {
29
+ assert_eq!(Clock::new(25, 0).to_string(), "01:00");
30
+ }
31
+
32
+ #[test]
33
+ #[ignore]
34
+ fn test_hour_rolls_over_continuously() {
35
+ assert_eq!(Clock::new(100, 0).to_string(), "04:00");
36
+ }
37
+
38
+ #[test]
39
+ #[ignore]
40
+ fn test_sixty_minutes_is_next_hour() {
41
+ assert_eq!(Clock::new(1, 60).to_string(), "02:00");
42
+ }
43
+
44
+ #[test]
45
+ #[ignore]
46
+ fn test_minutes_roll_over() {
47
+ assert_eq!(Clock::new(0, 160).to_string(), "02:40");
48
+ }
49
+
50
+ #[test]
51
+ #[ignore]
52
+ fn test_minutes_roll_over_continuously() {
53
+ assert_eq!(Clock::new(0, 1723).to_string(), "04:43");
54
+ }
55
+
56
+ #[test]
57
+ #[ignore]
58
+ fn test_hours_and_minutes_roll_over() {
59
+ assert_eq!(Clock::new(25, 160).to_string(), "03:40");
60
+ }
61
+
62
+ #[test]
63
+ #[ignore]
64
+ fn test_hours_and_minutes_roll_over_continuously() {
65
+ assert_eq!(Clock::new(201, 3001).to_string(), "11:01");
66
+ }
67
+
68
+ #[test]
69
+ #[ignore]
70
+ fn test_hours_and_minutes_roll_over_to_exactly_midnight() {
71
+ assert_eq!(Clock::new(72, 8640).to_string(), "00:00");
72
+ }
73
+
74
+ #[test]
75
+ #[ignore]
76
+ fn test_negative_hour() {
77
+ assert_eq!(Clock::new(-1, 15).to_string(), "23:15");
78
+ }
79
+
80
+ #[test]
81
+ #[ignore]
82
+ fn test_negative_hour_roll_over() {
83
+ assert_eq!(Clock::new(-25, 00).to_string(), "23:00");
84
+ }
85
+
86
+ #[test]
87
+ #[ignore]
88
+ fn test_negative_hour_roll_over_continuously() {
89
+ assert_eq!(Clock::new(-91, 00).to_string(), "05:00");
90
+ }
91
+
92
+
93
+ #[test]
94
+ #[ignore]
95
+ fn test_negative_minutes() {
96
+ assert_eq!(Clock::new(1, -40).to_string(), "00:20");
97
+ }
98
+
99
+ #[test]
100
+ #[ignore]
101
+ fn test_negative_minutes_roll_over() {
102
+ assert_eq!(Clock::new(1, -160).to_string(), "22:20");
103
+ }
104
+
105
+ #[test]
106
+ #[ignore]
107
+ fn test_negative_minutes_roll_over_continuously() {
108
+ assert_eq!(Clock::new(1, -4820).to_string(), "16:40");
109
+ }
110
+
111
+ #[test]
112
+ #[ignore]
113
+ fn test_negative_hour_and_minutes_both_roll_over() {
114
+ assert_eq!(Clock::new(-25, -160).to_string(), "20:20");
115
+ }
116
+
117
+ #[test]
118
+ #[ignore]
119
+ fn test_negative_hour_and_minutes_both_roll_over_continuously() {
120
+ assert_eq!(Clock::new(-121, -5810).to_string(), "22:10");
121
+ }
122
+
123
+ //
124
+ // Clock Math
125
+ //
126
+
127
+ #[test]
128
+ #[ignore]
129
+ fn test_add_minutes() {
130
+ let clock = Clock::new(10, 0).add_minutes(3);
131
+ assert_eq!(clock.to_string(), "10:03");
132
+ }
133
+
134
+ #[test]
135
+ #[ignore]
136
+ fn test_add_no_minutes() {
137
+ let clock = Clock::new(6, 41).add_minutes(0);
138
+ assert_eq!(clock.to_string(), "06:41");
139
+ }
140
+
141
+ #[test]
142
+ #[ignore]
143
+ fn test_add_to_next_hour() {
144
+ let clock = Clock::new(0, 45).add_minutes(40);
145
+ assert_eq!(clock.to_string(), "01:25");
146
+ }
147
+
148
+ #[test]
149
+ #[ignore]
150
+ fn test_add_more_than_one_hour() {
151
+ let clock = Clock::new(10, 0).add_minutes(61);
152
+ assert_eq!(clock.to_string(), "11:01");
153
+ }
154
+
155
+ #[test]
156
+ #[ignore]
157
+ fn test_add_more_than_two_hours_with_carry() {
158
+ let clock = Clock::new(0, 45).add_minutes(160);
159
+ assert_eq!(clock.to_string(), "03:25");
160
+ }
161
+
162
+ #[test]
163
+ #[ignore]
164
+ fn test_add_across_midnight() {
165
+ let clock = Clock::new(23, 59).add_minutes(2);
166
+ assert_eq!(clock.to_string(), "00:01");
167
+ }
168
+
169
+ #[test]
170
+ #[ignore]
171
+ fn test_add_more_than_one_day() {
172
+ let clock = Clock::new(5, 32).add_minutes(1500);
173
+ assert_eq!(clock.to_string(), "06:32");
174
+ }
175
+
176
+ #[test]
177
+ #[ignore]
178
+ fn test_add_more_than_two_days() {
179
+ let clock = Clock::new(1, 1).add_minutes(3500);
180
+ assert_eq!(clock.to_string(), "11:21");
181
+ }
182
+
183
+ #[test]
184
+ #[ignore]
185
+ fn test_subtract_minutes() {
186
+ let clock = Clock::new(10, 3).add_minutes(-3);
187
+ assert_eq!(clock.to_string(), "10:00");
188
+ }
189
+
190
+ #[test]
191
+ #[ignore]
192
+ fn test_subtract_to_previous_hour() {
193
+ let clock = Clock::new(10, 3).add_minutes(-30);
194
+ assert_eq!(clock.to_string(), "09:33");
195
+ }
196
+
197
+ #[test]
198
+ #[ignore]
199
+ fn test_subtract_more_than_an_hour() {
200
+ let clock = Clock::new(10, 3).add_minutes(-70);
201
+ assert_eq!(clock.to_string(), "08:53");
202
+ }
203
+
204
+ #[test]
205
+ #[ignore]
206
+ fn test_subtract_across_midnight() {
207
+ let clock = Clock::new(0, 3).add_minutes(-4);
208
+ assert_eq!(clock.to_string(), "23:59");
209
+ }
210
+
211
+ #[test]
212
+ #[ignore]
213
+ fn test_subtract_more_than_two_hours() {
214
+ let clock = Clock::new(0, 0).add_minutes(-160);
215
+ assert_eq!(clock.to_string(), "21:20");
216
+ }
217
+
218
+ #[test]
219
+ #[ignore]
220
+ fn test_subtract_more_than_two_hours_with_borrow() {
221
+ let clock = Clock::new(6, 15).add_minutes(-160);
222
+ assert_eq!(clock.to_string(), "03:35");
223
+ }
224
+
225
+ #[test]
226
+ #[ignore]
227
+ fn test_subtract_more_than_one_day() {
228
+ let clock = Clock::new(5, 32).add_minutes(-1500);
229
+ assert_eq!(clock.to_string(), "04:32");
230
+ }
231
+
232
+ #[test]
233
+ #[ignore]
234
+ fn test_subtract_mores_than_two_days() {
235
+ let clock = Clock::new(2, 20).add_minutes(-3000);
236
+ assert_eq!(clock.to_string(), "00:20");
237
+ }
238
+
239
+ //
240
+ // Test Equality
241
+ //
242
+
243
+ #[test]
244
+ #[ignore]
245
+ fn test_compare_clocks_for_equality() {
246
+ assert_eq!(Clock::new(15, 37), Clock::new(15, 37));
247
+ }
248
+
249
+ #[test]
250
+ #[ignore]
251
+ fn test_compare_clocks_a_minute_apart() {
252
+ assert_ne!(Clock::new(15, 36), Clock::new(15, 37));
253
+ }
254
+
255
+ #[test]
256
+ #[ignore]
257
+ fn test_compare_clocks_an_hour_apart() {
258
+ assert_ne!(Clock::new(14, 37), Clock::new(15, 37));
259
+ }
260
+
261
+ #[test]
262
+ #[ignore]
263
+ fn test_compare_clocks_with_hour_overflow() {
264
+ assert_eq!(Clock::new(10, 37), Clock::new(34, 37));
265
+ }
266
+
267
+ #[test]
268
+ #[ignore]
269
+ fn test_compare_clocks_with_hour_overflow_by_several_days() {
270
+ assert_eq!(Clock::new(3, 11), Clock::new(99, 11));
271
+ }
272
+
273
+ #[test]
274
+ #[ignore]
275
+ fn test_compare_clocks_with_negative_hour() {
276
+ assert_eq!(Clock::new(22, 40), Clock::new(-2, 40));
277
+ }
278
+
279
+ #[test]
280
+ #[ignore]
281
+ fn test_compare_clocks_with_negative_hour_that_wraps() {
282
+ assert_eq!(Clock::new(17, 3), Clock::new(-31, 3));
283
+ }
284
+
285
+ #[test]
286
+ #[ignore]
287
+ fn test_compare_clocks_with_negative_hour_that_wraps_multiple_times() {
288
+ assert_eq!(Clock::new(13, 49), Clock::new(-83, 49));
289
+ }
290
+
291
+ #[test]
292
+ #[ignore]
293
+ fn test_compare_clocks_with_minutes_overflow() {
294
+ assert_eq!(Clock::new(0, 1), Clock::new(0, 1441));
295
+ }
296
+
297
+ #[test]
298
+ #[ignore]
299
+ fn test_compare_clocks_with_minutes_overflow_by_several_days() {
300
+ assert_eq!(Clock::new(2, 2), Clock::new(2, 4322));
301
+ }
302
+
303
+ #[test]
304
+ #[ignore]
305
+ fn test_compare_clocks_with_negative_minute() {
306
+ assert_eq!(Clock::new(2, 40), Clock::new(3, -20))
307
+ }
308
+
309
+ #[test]
310
+ #[ignore]
311
+ fn test_compare_clocks_with_negative_minute_that_wraps() {
312
+ assert_eq!(Clock::new(4, 10), Clock::new(5, -1490))
313
+ }
314
+
315
+ #[test]
316
+ #[ignore]
317
+ fn test_compare_clocks_with_negative_minute_that_wraps_multiple() {
318
+ assert_eq!(Clock::new(6, 15), Clock::new(6, -4305))
319
+ }
320
+
321
+ #[test]
322
+ #[ignore]
323
+ fn test_compare_clocks_with_negative_hours_and_minutes() {
324
+ assert_eq!(Clock::new(7, 32), Clock::new(-12, -268))
325
+ }
326
+
327
+ #[test]
328
+ #[ignore]
329
+ fn test_compare_clocks_with_negative_hours_and_minutes_that_wrap() {
330
+ assert_eq!(Clock::new(18, 7), Clock::new(-54, -11513))
331
+ }