trackler 1.0.0 → 1.0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (288) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +7 -0
  3. data/CHANGELOG.md +9 -1
  4. data/README.md +10 -0
  5. data/common/CONTRIBUTING.md +50 -2
  6. data/common/exercises/alphametics/canonical-data.json +10 -10
  7. data/common/exercises/markdown/canonical-data.json +4 -4
  8. data/common/exercises/pov/canonical-data.json +356 -0
  9. data/lib/trackler/version.rb +1 -1
  10. data/trackler.gemspec +1 -2
  11. data/tracks/c/config.json +11 -1
  12. data/tracks/c/exercises/binary-search/makefile +16 -0
  13. data/tracks/c/exercises/binary-search/src/example.c +21 -0
  14. data/tracks/c/exercises/binary-search/src/example.h +8 -0
  15. data/tracks/c/exercises/binary-search/test/test_binary_search.c +99 -0
  16. data/tracks/c/exercises/binary-search/test/vendor/unity.c +1300 -0
  17. data/tracks/c/exercises/binary-search/test/vendor/unity.h +274 -0
  18. data/tracks/c/exercises/binary-search/test/vendor/unity_internals.h +701 -0
  19. data/tracks/clojure/config.json +3 -2
  20. data/tracks/clojure/exercises/bank-account/project.clj +4 -0
  21. data/tracks/clojure/exercises/bank-account/src/example.clj +17 -0
  22. data/tracks/clojure/exercises/bank-account/test/bank_account_test.clj +44 -0
  23. data/tracks/clojure/exercises/isogram/project.clj +4 -0
  24. data/tracks/clojure/exercises/isogram/src/example.clj +5 -0
  25. data/tracks/clojure/exercises/isogram/test/isogram_test.clj +17 -0
  26. data/tracks/csharp/config.json +27 -87
  27. data/tracks/csharp/exercises/exercises.csproj +265 -1
  28. data/tracks/csharp/exercises/grep/Example.cs +114 -0
  29. data/tracks/csharp/exercises/grep/GrepTest.cs +376 -0
  30. data/tracks/csharp/exercises/paket.references +2 -1
  31. data/tracks/csharp/exercises/poker/Example.cs +96 -0
  32. data/tracks/csharp/exercises/poker/PokerTest.cs +171 -0
  33. data/tracks/csharp/exercises/sgf-parsing/Example.cs +61 -0
  34. data/tracks/csharp/exercises/sgf-parsing/SgfParsing.cs +13 -0
  35. data/tracks/csharp/exercises/sgf-parsing/SgfParsingTest.cs +158 -0
  36. data/tracks/csharp/paket.dependencies +2 -1
  37. data/tracks/csharp/paket.lock +72 -0
  38. data/tracks/ecmascript/exercises/simple-cipher/simple-cipher.spec.js +1 -1
  39. data/tracks/elisp/config.json +6 -1
  40. data/tracks/elisp/exercises/etl/etl-test.el +90 -0
  41. data/tracks/elisp/exercises/etl/etl.el +9 -0
  42. data/tracks/elisp/exercises/etl/example.el +22 -0
  43. data/tracks/elisp/exercises/nucleotide-count/example.el +19 -0
  44. data/tracks/elisp/exercises/nucleotide-count/nucleotide-count-test.el +34 -0
  45. data/tracks/elisp/exercises/nucleotide-count/nucleotide-count.el +9 -0
  46. data/tracks/elisp/exercises/perfect-numbers/example.el +28 -0
  47. data/tracks/elisp/exercises/perfect-numbers/perfect-numbers-test.el +24 -0
  48. data/tracks/elisp/exercises/perfect-numbers/perfect-numbers.el +10 -0
  49. data/tracks/elisp/exercises/roman-numerals/example.el +36 -0
  50. data/tracks/elisp/exercises/roman-numerals/roman-numerals-test.el +30 -0
  51. data/tracks/elisp/exercises/roman-numerals/roman-numerals.el +10 -0
  52. data/tracks/elisp/exercises/word-count/example.el +18 -0
  53. data/tracks/elisp/exercises/word-count/word-count-test.el +64 -0
  54. data/tracks/elisp/exercises/word-count/word-count.el +9 -0
  55. data/tracks/elixir/README.md +4 -4
  56. data/tracks/elixir/SETUP.md +3 -3
  57. data/tracks/elixir/docs/TESTS.md +3 -3
  58. data/tracks/elixir/exercises/accumulate/accumulate_test.exs +7 -7
  59. data/tracks/elixir/exercises/acronym/acronym_test.exs +5 -5
  60. data/tracks/elixir/exercises/allergies/allergies_test.exs +13 -13
  61. data/tracks/elixir/exercises/anagram/anagram_test.exs +12 -12
  62. data/tracks/elixir/exercises/atbash-cipher/atbash_cipher_test.exs +9 -9
  63. data/tracks/elixir/exercises/bank-account/bank_account_test.exs +5 -5
  64. data/tracks/elixir/exercises/beer-song/beer_song_test.exs +6 -6
  65. data/tracks/elixir/exercises/binary-search/binary_search_test.exs +7 -7
  66. data/tracks/elixir/exercises/binary/binary_test.exs +13 -13
  67. data/tracks/elixir/exercises/bob/bob_test.exs +15 -15
  68. data/tracks/elixir/exercises/bowling/bowling_test.exs +18 -18
  69. data/tracks/elixir/exercises/bracket-push/bracket_push_test.exs +12 -12
  70. data/tracks/elixir/exercises/change/change_test.exs +7 -7
  71. data/tracks/elixir/exercises/connect/connect_test.exs +9 -9
  72. data/tracks/elixir/exercises/crypto-square/crypto_square_test.exs +7 -7
  73. data/tracks/elixir/exercises/custom-set/custom_set_test.exs +11 -11
  74. data/tracks/elixir/exercises/diamond/diamond_test.exs +4 -4
  75. data/tracks/elixir/exercises/difference-of-squares/difference_of_squares_test.exs +10 -10
  76. data/tracks/elixir/exercises/dot-dsl/dot_dsl_test.exs +17 -17
  77. data/tracks/elixir/exercises/etl/etl_test.exs +5 -5
  78. data/tracks/elixir/exercises/flatten-array/flatten_array_test.exs +6 -6
  79. data/tracks/elixir/exercises/forth/forth_test.exs +16 -16
  80. data/tracks/elixir/exercises/gigasecond/gigasecond_test.exs +5 -5
  81. data/tracks/elixir/exercises/grade-school/grade_school_test.exs +6 -6
  82. data/tracks/elixir/exercises/grains/grains_test.exs +9 -9
  83. data/tracks/elixir/exercises/hamming/hamming_test.exs +6 -6
  84. data/tracks/elixir/exercises/hello-world/hello_world_test.exs +3 -3
  85. data/tracks/elixir/exercises/hexadecimal/hexadecimal_test.exs +11 -11
  86. data/tracks/elixir/exercises/isogram/isogram_test.exs +10 -10
  87. data/tracks/elixir/exercises/kindergarten-garden/garden_test.exs +7 -7
  88. data/tracks/elixir/exercises/largest-series-product/largest_series_product_test.exs +17 -17
  89. data/tracks/elixir/exercises/leap/leap_test.exs +5 -5
  90. data/tracks/elixir/exercises/list-ops/list_ops_test.exs +26 -26
  91. data/tracks/elixir/exercises/luhn/luhn_test.exs +7 -7
  92. data/tracks/elixir/exercises/markdown/markdown_test.exs +10 -10
  93. data/tracks/elixir/exercises/meetup/meetup_test.exs +92 -92
  94. data/tracks/elixir/exercises/minesweeper/minesweeper_test.exs +8 -8
  95. data/tracks/elixir/exercises/nth-prime/nth_prime_test.exs +6 -6
  96. data/tracks/elixir/exercises/nucleotide-count/example.exs +0 -5
  97. data/tracks/elixir/exercises/nucleotide-count/nucleotide_count_test.exs +7 -7
  98. data/tracks/elixir/exercises/palindrome-products/palindrome_products_test.exs +6 -6
  99. data/tracks/elixir/exercises/pangram/pangram_test.exs +11 -11
  100. data/tracks/elixir/exercises/parallel-letter-frequency/parallel_letter_frequency_test.exs +10 -10
  101. data/tracks/elixir/exercises/pascals-triangle/pascals_triangle_test.exs +7 -7
  102. data/tracks/elixir/exercises/phone-number/phone_number_test.exs +10 -10
  103. data/tracks/elixir/exercises/prime-factors/prime_factors_test.exs +13 -13
  104. data/tracks/elixir/exercises/pythagorean-triplet/pythagorean_triplet_test.exs +8 -8
  105. data/tracks/elixir/exercises/queen-attack/queen_attack_test.exs +16 -16
  106. data/tracks/elixir/exercises/rail-fence-cipher/rail_fence_cipher_test.exs +13 -13
  107. data/tracks/elixir/exercises/raindrops/raindrops_test.exs +17 -17
  108. data/tracks/elixir/exercises/rna-transcription/rna_transcription_test.exs +6 -6
  109. data/tracks/elixir/exercises/robot-simulator/robot_simulator_test.exs +6 -6
  110. data/tracks/elixir/exercises/roman-numerals/roman_numerals_test.exs +19 -19
  111. data/tracks/elixir/exercises/run-length-encoding/rle_test.exs +6 -6
  112. data/tracks/elixir/exercises/saddle-points/saddle_points_test.exs +11 -11
  113. data/tracks/elixir/exercises/scrabble-score/scrabble_score_test.exs +9 -9
  114. data/tracks/elixir/exercises/sieve/sieve_test.exs +3 -3
  115. data/tracks/elixir/exercises/space-age/space_age_test.exs +9 -9
  116. data/tracks/elixir/exercises/sublist/sublist_test.exs +20 -20
  117. data/tracks/elixir/exercises/sum-of-multiples/sum_of_multiples_test.exs +11 -11
  118. data/tracks/elixir/exercises/test_helper.exs +1 -1
  119. data/tracks/elixir/exercises/triangle/triangle_test.exs +16 -16
  120. data/tracks/elixir/exercises/word-count/word_count_test.exs +9 -9
  121. data/tracks/elixir/exercises/wordy/wordy_test.exs +16 -16
  122. data/tracks/elixir/exercises/zipper/zipper_test.exs +13 -13
  123. data/tracks/fsharp/build.fsx +2 -7
  124. data/tracks/fsharp/config.json +0 -104
  125. data/tracks/fsharp/exercises/grep/GrepTest.fs +7 -1
  126. data/tracks/go/config.json +1 -0
  127. data/tracks/go/exercises/acronym/acronym_test.go +36 -0
  128. data/tracks/go/exercises/acronym/example.go +21 -0
  129. data/tracks/go/exercises/palindrome-products/example.go +2 -0
  130. data/tracks/go/exercises/palindrome-products/palindrome_products_test.go +10 -0
  131. data/tracks/go/exercises/phone-number/example.go +2 -0
  132. data/tracks/go/exercises/phone-number/phone_number_test.go +44 -27
  133. data/tracks/go/exercises/robot-simulator/defs.go +6 -6
  134. data/tracks/go/exercises/robot-simulator/example.go +22 -22
  135. data/tracks/go/exercises/robot-simulator/robot_simulator_step2_test.go +28 -28
  136. data/tracks/go/exercises/robot-simulator/robot_simulator_step3_test.go +75 -76
  137. data/tracks/go/exercises/robot-simulator/robot_simulator_test.go +10 -4
  138. data/tracks/haskell/exercises/anagram/HINTS.md +22 -0
  139. data/tracks/haskell/exercises/anagram/package.yaml +3 -0
  140. data/tracks/haskell/exercises/anagram/src/Example.hs +10 -7
  141. data/tracks/haskell/exercises/anagram/test/Tests.hs +9 -3
  142. data/tracks/haskell/exercises/beer-song/HINTS.md +18 -0
  143. data/tracks/haskell/exercises/beer-song/src/Beer.hs +301 -3
  144. data/tracks/haskell/exercises/beer-song/src/Example.hs +5 -3
  145. data/tracks/haskell/exercises/beer-song/test/Tests.hs +332 -23
  146. data/tracks/haskell/exercises/crypto-square/src/CryptoSquare.hs +3 -17
  147. data/tracks/haskell/exercises/crypto-square/src/Example.hs +12 -20
  148. data/tracks/haskell/exercises/crypto-square/test/Tests.hs +46 -86
  149. data/tracks/haskell/exercises/leap/HINTS.md +11 -0
  150. data/tracks/haskell/exercises/leap/src/LeapYear.hs +1 -0
  151. data/tracks/java/exercises/pangram/src/test/java/PangramTest.java +34 -4
  152. data/tracks/lua/exercises/pov/pov_spec.lua +0 -13
  153. data/tracks/mips/docs/ABOUT.md +1 -1
  154. data/tracks/objective-c/config.json +225 -0
  155. data/tracks/objective-c/exercises/largest-series-product/LargestSeriesProductExample.h +8 -0
  156. data/tracks/objective-c/exercises/largest-series-product/LargestSeriesProductExample.m +63 -0
  157. data/tracks/objective-c/exercises/largest-series-product/LargestSeriesProductTest.m +84 -0
  158. data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +18 -0
  159. data/tracks/ocaml/.travis-ci.sh +23 -0
  160. data/tracks/ocaml/.travis.yml +5 -1
  161. data/tracks/ocaml/Makefile +41 -0
  162. data/tracks/ocaml/config.json +18 -0
  163. data/tracks/ocaml/exercises/anagram/Makefile +1 -0
  164. data/tracks/ocaml/exercises/beer-song/Makefile +1 -0
  165. data/tracks/ocaml/exercises/beer-song/{beer.mli → beer_song.mli} +0 -0
  166. data/tracks/ocaml/exercises/beer-song/example.ml +1 -1
  167. data/tracks/ocaml/exercises/beer-song/test.ml +7 -6
  168. data/tracks/ocaml/exercises/bob/Makefile +1 -0
  169. data/tracks/ocaml/exercises/bowling/Makefile +1 -0
  170. data/tracks/ocaml/exercises/custom-set/Makefile +1 -0
  171. data/tracks/ocaml/exercises/difference-of-squares/.merlin +5 -0
  172. data/tracks/ocaml/exercises/difference-of-squares/Makefile +11 -0
  173. data/tracks/ocaml/exercises/difference-of-squares/difference_of_squares.mli +8 -0
  174. data/tracks/ocaml/exercises/difference-of-squares/example.ml +21 -0
  175. data/tracks/ocaml/exercises/difference-of-squares/test.ml +32 -0
  176. data/tracks/ocaml/exercises/grade-school/Makefile +1 -0
  177. data/tracks/ocaml/exercises/grade-school/{school.mli → grade_school.mli} +0 -0
  178. data/tracks/ocaml/exercises/grade-school/test.ml +27 -27
  179. data/tracks/ocaml/exercises/hamming/Makefile +1 -0
  180. data/tracks/ocaml/exercises/hangman/Makefile +1 -0
  181. data/tracks/ocaml/exercises/hello-world/Makefile +1 -1
  182. data/tracks/ocaml/exercises/hello-world/{hello.ml → hello_world.ml} +0 -0
  183. data/tracks/ocaml/exercises/hello-world/{hello.mli → hello_world.mli} +0 -0
  184. data/tracks/ocaml/exercises/hello-world/test.ml +1 -1
  185. data/tracks/ocaml/exercises/hexadecimal/Makefile +1 -0
  186. data/tracks/ocaml/exercises/leap/Makefile +1 -1
  187. data/tracks/ocaml/exercises/list-ops/Makefile +1 -0
  188. data/tracks/ocaml/exercises/luhn/Makefile +1 -0
  189. data/tracks/ocaml/exercises/minesweeper/Makefile +1 -0
  190. data/tracks/ocaml/exercises/nucleotide-count/Makefile +1 -0
  191. data/tracks/ocaml/exercises/nucleotide-count/{dna.mli → nucleotide_count.mli} +0 -0
  192. data/tracks/ocaml/exercises/nucleotide-count/test.ml +7 -7
  193. data/tracks/ocaml/exercises/phone-number/Makefile +1 -0
  194. data/tracks/ocaml/exercises/phone-number/{phone.mli → phone_number.mli} +0 -0
  195. data/tracks/ocaml/exercises/phone-number/test.ml +10 -10
  196. data/tracks/ocaml/exercises/point-mutations/Makefile +8 -0
  197. data/tracks/ocaml/exercises/point-mutations/example.ml +0 -0
  198. data/tracks/ocaml/exercises/prime-factors/Makefile +1 -0
  199. data/tracks/ocaml/exercises/raindrops/.merlin +5 -0
  200. data/tracks/ocaml/exercises/raindrops/Makefile +11 -0
  201. data/tracks/ocaml/exercises/raindrops/example.ml +11 -0
  202. data/tracks/ocaml/exercises/raindrops/raindrops.mli +7 -0
  203. data/tracks/ocaml/exercises/raindrops/test.ml +48 -0
  204. data/tracks/ocaml/exercises/rna-transcription/Makefile +1 -0
  205. data/tracks/ocaml/exercises/rna-transcription/{dna.mli → rna_transcription.mli} +0 -0
  206. data/tracks/ocaml/exercises/rna-transcription/test.ml +6 -6
  207. data/tracks/ocaml/exercises/roman-numerals/Makefile +1 -0
  208. data/tracks/ocaml/exercises/say/.gitignore +1 -0
  209. data/tracks/ocaml/exercises/say/.merlin +5 -0
  210. data/tracks/ocaml/exercises/say/Makefile +11 -0
  211. data/tracks/ocaml/exercises/say/example.ml +52 -0
  212. data/tracks/ocaml/exercises/say/say.mli +8 -0
  213. data/tracks/ocaml/exercises/say/test.ml +65 -0
  214. data/tracks/ocaml/exercises/space-age/Makefile +1 -0
  215. data/tracks/ocaml/exercises/word-count/Makefile +1 -0
  216. data/tracks/ocaml/exercises/word-count/example.ml +1 -1
  217. data/tracks/ocaml/exercises/zipper/HINT.md +5 -6
  218. data/tracks/ocaml/exercises/zipper/Makefile +1 -0
  219. data/tracks/ocaml/exercises/zipper/example.ml +2 -2
  220. data/tracks/ocaml/exercises/zipper/tree.ml +1 -1
  221. data/tracks/php/config.json +7 -1
  222. data/tracks/php/exercises/variable-length-quantity/example.php +56 -0
  223. data/tracks/php/exercises/variable-length-quantity/variable-length-quantity_test.php +149 -0
  224. data/tracks/python/config.json +1 -1
  225. data/tracks/ruby/.rubocop.yml +1915 -26
  226. data/tracks/ruby/bin/generate-acronym +7 -0
  227. data/tracks/ruby/bin/generate-nth-prime +7 -0
  228. data/tracks/ruby/config.json +482 -0
  229. data/tracks/ruby/exercises/acronym/.version +1 -0
  230. data/tracks/ruby/exercises/acronym/acronym_test.rb +45 -21
  231. data/tracks/ruby/exercises/acronym/example.rb +1 -1
  232. data/tracks/ruby/exercises/acronym/example.tt +19 -0
  233. data/tracks/ruby/exercises/anagram/anagram_test.rb +1 -1
  234. data/tracks/ruby/exercises/nth-prime/.version +1 -0
  235. data/tracks/ruby/exercises/nth-prime/example.rb +4 -0
  236. data/tracks/ruby/exercises/nth-prime/example.tt +23 -0
  237. data/tracks/ruby/exercises/nth-prime/nth_prime_test.rb +33 -10
  238. data/tracks/ruby/exercises/raindrops/.version +1 -1
  239. data/tracks/ruby/exercises/raindrops/example.rb +1 -1
  240. data/tracks/ruby/exercises/raindrops/raindrops_test.rb +20 -5
  241. data/tracks/ruby/lib/acronym_cases.rb +19 -0
  242. data/tracks/ruby/lib/generator.rb +3 -2
  243. data/tracks/ruby/lib/nth_prime_cases.rb +23 -0
  244. data/tracks/ruby/lib/raindrop_cases.rb +1 -1
  245. data/tracks/rust/README.md +1 -1
  246. data/tracks/scala/exercises/leap/src/test/scala/leap_test.scala +10 -0
  247. data/tracks/scala/exercises/prime-factors/example.scala +2 -5
  248. data/tracks/scala/exercises/prime-factors/src/test/scala/primefactors_test.scala +11 -13
  249. data/tracks/scheme/{anagram → exercises/anagram}/anagram-test.scm +0 -0
  250. data/tracks/scheme/{anagram → exercises/anagram}/anagram.scm +0 -0
  251. data/tracks/scheme/{anagram → exercises/anagram}/example.scm +0 -0
  252. data/tracks/scheme/{bob → exercises/bob}/bob-test.scm +0 -0
  253. data/tracks/scheme/{bob → exercises/bob}/bob.scm +0 -0
  254. data/tracks/scheme/{bob → exercises/bob}/example.scm +0 -0
  255. data/tracks/scheme/{difference-of-squares → exercises/difference-of-squares}/difference-of-squares-test.scm +0 -0
  256. data/tracks/scheme/{difference-of-squares → exercises/difference-of-squares}/example.scm +0 -0
  257. data/tracks/scheme/{difference-of-squares → exercises/difference-of-squares}/squares.scm +0 -0
  258. data/tracks/scheme/{grains → exercises/grains}/example.scm +0 -0
  259. data/tracks/scheme/{grains → exercises/grains}/grains-test.scm +0 -0
  260. data/tracks/scheme/{grains → exercises/grains}/grains.scm +0 -0
  261. data/tracks/scheme/{hamming → exercises/hamming}/example.scm +0 -0
  262. data/tracks/scheme/{hamming → exercises/hamming}/hamming-test.scm +0 -0
  263. data/tracks/scheme/{hamming → exercises/hamming}/hamming.scm +0 -0
  264. data/tracks/scheme/{hello-world → exercises/hello-world}/example.scm +0 -0
  265. data/tracks/scheme/{hello-world → exercises/hello-world}/hello-world-test.scm +0 -0
  266. data/tracks/scheme/{hello-world → exercises/hello-world}/hello-world.scm +0 -0
  267. data/tracks/scheme/{leap → exercises/leap}/example.scm +0 -0
  268. data/tracks/scheme/{leap → exercises/leap}/leap-test.scm +0 -0
  269. data/tracks/scheme/{leap → exercises/leap}/leap-year.scm +0 -0
  270. data/tracks/scheme/{list-ops → exercises/list-ops}/example.scm +0 -0
  271. data/tracks/scheme/{list-ops → exercises/list-ops}/list-ops-test.scm +0 -0
  272. data/tracks/scheme/{list-ops → exercises/list-ops}/list-ops.scm +0 -0
  273. data/tracks/scheme/{nucleotide-count → exercises/nucleotide-count}/example.scm +0 -0
  274. data/tracks/scheme/{nucleotide-count → exercises/nucleotide-count}/nucleotide-count-test.scm +0 -0
  275. data/tracks/scheme/{nucleotide-count → exercises/nucleotide-count}/nucleotide-count.scm +0 -0
  276. data/tracks/scheme/{phone-number → exercises/phone-number}/example.scm +0 -0
  277. data/tracks/scheme/{phone-number → exercises/phone-number}/phone-number-test.scm +0 -0
  278. data/tracks/scheme/{phone-number → exercises/phone-number}/phone-number.scm +0 -0
  279. data/tracks/scheme/{raindrops → exercises/raindrops}/example.scm +0 -0
  280. data/tracks/scheme/{raindrops → exercises/raindrops}/raindrops-test.scm +0 -0
  281. data/tracks/scheme/{raindrops → exercises/raindrops}/raindrops.scm +0 -0
  282. data/tracks/scheme/{rna-transcription → exercises/rna-transcription}/dna.scm +0 -0
  283. data/tracks/scheme/{rna-transcription → exercises/rna-transcription}/example.scm +0 -0
  284. data/tracks/scheme/{rna-transcription → exercises/rna-transcription}/rna-transcription-test.scm +0 -0
  285. data/tracks/scheme/{robot-name → exercises/robot-name}/example.scm +0 -0
  286. data/tracks/scheme/{robot-name → exercises/robot-name}/robot-name-test.scm +0 -0
  287. data/tracks/scheme/{robot-name → exercises/robot-name}/robot.scm +0 -0
  288. metadata +125 -64
@@ -67,6 +67,8 @@
67
67
  E951B6B91D429550009EB5B6 /* AllergiesTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E951B6B81D429550009EB5B6 /* AllergiesTest.m */; };
68
68
  E99D1D811D5533BF0006A303 /* SumOfMultiplesExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E99D1D801D5533BF0006A303 /* SumOfMultiplesExample.m */; };
69
69
  E99D1D831D5533D80006A303 /* SumOfMultiplesTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E99D1D821D5533D80006A303 /* SumOfMultiplesTest.m */; };
70
+ E9A7B2F71DA5AC37009056B6 /* LargestSeriesProductExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E9A7B2F61DA5AC37009056B6 /* LargestSeriesProductExample.m */; };
71
+ E9A7B2F91DA5AC55009056B6 /* LargestSeriesProductTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E9A7B2F81DA5AC55009056B6 /* LargestSeriesProductTest.m */; };
70
72
  E9C1C0231D9D993E0015E86E /* SecretHandshakeExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C1C0221D9D993E0015E86E /* SecretHandshakeExample.m */; };
71
73
  E9C1C0251D9D99620015E86E /* SecretHandshakeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C1C0241D9D99620015E86E /* SecretHandshakeTest.m */; };
72
74
  E9C1C0291D9DB16B0015E86E /* AcronymExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C1C0281D9DB16B0015E86E /* AcronymExample.m */; };
@@ -149,6 +151,9 @@
149
151
  E99D1D7F1D5533BF0006A303 /* SumOfMultiplesExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SumOfMultiplesExample.h; path = "../../exercises/sum-of-multiples/SumOfMultiplesExample.h"; sourceTree = "<group>"; };
150
152
  E99D1D801D5533BF0006A303 /* SumOfMultiplesExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SumOfMultiplesExample.m; path = "../../exercises/sum-of-multiples/SumOfMultiplesExample.m"; sourceTree = "<group>"; };
151
153
  E99D1D821D5533D80006A303 /* SumOfMultiplesTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SumOfMultiplesTest.m; path = "../../exercises/sum-of-multiples/SumOfMultiplesTest.m"; sourceTree = "<group>"; };
154
+ E9A7B2F51DA5AC37009056B6 /* LargestSeriesProductExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LargestSeriesProductExample.h; path = "../../exercises/largest-series-product/LargestSeriesProductExample.h"; sourceTree = "<group>"; };
155
+ E9A7B2F61DA5AC37009056B6 /* LargestSeriesProductExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LargestSeriesProductExample.m; path = "../../exercises/largest-series-product/LargestSeriesProductExample.m"; sourceTree = "<group>"; };
156
+ E9A7B2F81DA5AC55009056B6 /* LargestSeriesProductTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LargestSeriesProductTest.m; path = "../../exercises/largest-series-product/LargestSeriesProductTest.m"; sourceTree = "<group>"; };
152
157
  E9C1C0211D9D993E0015E86E /* SecretHandshakeExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SecretHandshakeExample.h; path = "../../exercises/secret-handshake/SecretHandshakeExample.h"; sourceTree = "<group>"; };
153
158
  E9C1C0221D9D993E0015E86E /* SecretHandshakeExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SecretHandshakeExample.m; path = "../../exercises/secret-handshake/SecretHandshakeExample.m"; sourceTree = "<group>"; };
154
159
  E9C1C0241D9D99620015E86E /* SecretHandshakeTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SecretHandshakeTest.m; path = "../../exercises/secret-handshake/SecretHandshakeTest.m"; sourceTree = "<group>"; };
@@ -189,6 +194,7 @@
189
194
  E9E8B6EE1D519DFE0012F12C /* GradeSchool */,
190
195
  E9E8B6EF1D519E040012F12C /* Hamming */,
191
196
  E9E8B6F01D519E0B0012F12C /* HelloWorld */,
197
+ E9A7B2F41DA5ABA3009056B6 /* LargestSeriesProduct */,
192
198
  E9E8B6F11D519E120012F12C /* Leap */,
193
199
  E92FCC0A1D78F2AA00061017 /* Meetup */,
194
200
  E9E8B6F21D519E180012F12C /* NucleotideCount */,
@@ -305,6 +311,16 @@
305
311
  name = SumOfMultiples;
306
312
  sourceTree = "<group>";
307
313
  };
314
+ E9A7B2F41DA5ABA3009056B6 /* LargestSeriesProduct */ = {
315
+ isa = PBXGroup;
316
+ children = (
317
+ E9A7B2F51DA5AC37009056B6 /* LargestSeriesProductExample.h */,
318
+ E9A7B2F61DA5AC37009056B6 /* LargestSeriesProductExample.m */,
319
+ E9A7B2F81DA5AC55009056B6 /* LargestSeriesProductTest.m */,
320
+ );
321
+ name = LargestSeriesProduct;
322
+ sourceTree = "<group>";
323
+ };
308
324
  E9C1C0201D9D98B80015E86E /* SecretHandshake */ = {
309
325
  isa = PBXGroup;
310
326
  children = (
@@ -595,6 +611,7 @@
595
611
  1EFACAB51CCCAF3D006F2E69 /* PhoneNumberExample.m in Sources */,
596
612
  E951B6B91D429550009EB5B6 /* AllergiesTest.m in Sources */,
597
613
  E9381D461D8EDFFA003F22A1 /* DifferenceOfSquaresExample.m in Sources */,
614
+ E9A7B2F71DA5AC37009056B6 /* LargestSeriesProductExample.m in Sources */,
598
615
  E907D0CA1D6B731600106C42 /* GigasecondExample.m in Sources */,
599
616
  E9381D521D8F2DCC003F22A1 /* ClockExample.m in Sources */,
600
617
  E99D1D811D5533BF0006A303 /* SumOfMultiplesExample.m in Sources */,
@@ -631,6 +648,7 @@
631
648
  E947A4DE1D81FE0F00633720 /* TriangleExample.m in Sources */,
632
649
  1EFACAAC1CCCAF3D006F2E69 /* HammingTest.m in Sources */,
633
650
  1EFACAA61CCCAF3D006F2E69 /* BobTest.m in Sources */,
651
+ E9A7B2F91DA5AC55009056B6 /* LargestSeriesProductTest.m in Sources */,
634
652
  1EFACAAF1CCCAF3D006F2E69 /* LeapExample.m in Sources */,
635
653
  E9C1C0251D9D99620015E86E /* SecretHandshakeTest.m in Sources */,
636
654
  E99D1D831D5533D80006A303 /* SumOfMultiplesTest.m in Sources */,
@@ -0,0 +1,23 @@
1
+ # Edit this for your own project dependencies
2
+ OPAM_DEPENDS="ocamlfind core ounit react"
3
+
4
+ case "$OCAML_VERSION,$OPAM_VERSION" in
5
+ 4.03.0,1.2.2) ppa=avsm/ocaml42+opam12 ;;
6
+ *) echo Unknown $OCAML_VERSION,$OPAM_VERSION; exit 1 ;;
7
+ esac
8
+
9
+ echo "yes" | sudo add-apt-repository ppa:$ppa
10
+ sudo apt-get update -qq
11
+ sudo apt-get install -qq ocaml ocaml-native-compilers camlp4-extra opam
12
+ export OPAMYES=1
13
+ export OPAMVERBOSE=1
14
+ echo OCaml version
15
+ ocaml -version
16
+ echo OPAM versions
17
+ opam --version
18
+ opam --git-version
19
+
20
+ opam init
21
+ opam install ${OPAM_DEPENDS}
22
+ eval `opam config env`
23
+ make test
@@ -1,5 +1,9 @@
1
- language: bash
1
+ language: c
2
2
 
3
3
  script:
4
+ - bash -ex .travis-ci.sh
4
5
  - bin/fetch-configlet
5
6
  - bin/configlet .
7
+
8
+ env:
9
+ - OCAML_VERSION=4.03.0 OPAM_VERSION=1.2.2
@@ -0,0 +1,41 @@
1
+ # assignments
2
+ ASSIGNMENT ?= ""
3
+ ASSIGNMENTS = $(shell find ./exercises -maxdepth 1 -mindepth 1 -type d | awk -F/ '{print $$NF}' | sort)
4
+
5
+ default: test
6
+
7
+ # output directories
8
+ TMPDIR ?= "/tmp/"
9
+ OUTDIR := $(shell mktemp -d "$(TMPDIR)$(ASSIGNMENT).XXXXXXXXXX")
10
+
11
+ # language specific config (tweakable per language)
12
+ FILEEXT := "ml"
13
+ EXAMPLE := "example.$(FILEEXT)"
14
+ SRCFILE := "$(shell echo $(ASSIGNMENT) | sed 's/-/_/g')"
15
+ TSTFILE := "$(SRCFILE)_test.$(FILEEXT)"
16
+ # Any additional arguments, such as -p for pretty output and others
17
+ ARGS ?= ""
18
+
19
+ # single test
20
+ test-assignment:
21
+ @echo ""
22
+ @echo ""
23
+ @echo "----------------------------------------------------------------"
24
+ @echo "running tests for: $(ASSIGNMENT)"
25
+ @cp -r ./exercises/$(ASSIGNMENT)/* $(OUTDIR)
26
+ @cp ./exercises/$(ASSIGNMENT)/$(EXAMPLE) $(OUTDIR)/$(SRCFILE).$(FILEEXT)
27
+ @make -C $(OUTDIR)
28
+ @rm -rf $(OUTDIR)
29
+
30
+ # all tests
31
+ test:
32
+ @for assignment in $(ASSIGNMENTS); do \
33
+ ASSIGNMENT=$$assignment $(MAKE) -s test-assignment || exit 1;\
34
+ done
35
+
36
+ clean:
37
+ @for assignment in $(ASSIGNMENTS); do \
38
+ make -C ./exercises/$$assignment clean;\
39
+ done
40
+
41
+ .PHONY: clean
@@ -6,6 +6,7 @@
6
6
  "problems": [
7
7
  "hello-world",
8
8
  "bob",
9
+ "difference-of-squares",
9
10
  "list-ops",
10
11
  "leap",
11
12
  "word-count",
@@ -13,6 +14,7 @@
13
14
  "beer-song",
14
15
  "nucleotide-count",
15
16
  "rna-transcription",
17
+ "raindrops",
16
18
  "hamming",
17
19
  "phone-number",
18
20
  "grade-school",
@@ -24,6 +26,7 @@
24
26
  "prime-factors",
25
27
  "hexadecimal",
26
28
  "luhn",
29
+ "say",
27
30
  "zipper",
28
31
  "hangman"
29
32
  ],
@@ -38,6 +41,11 @@
38
41
  "difficulty": 1,
39
42
  "topics": []
40
43
  },
44
+ {
45
+ "slug": "difference-of-squares",
46
+ "difficulty": 1,
47
+ "topics": []
48
+ },
41
49
  {
42
50
  "slug": "list-ops",
43
51
  "difficulty": 1,
@@ -73,6 +81,11 @@
73
81
  "difficulty": 1,
74
82
  "topics": []
75
83
  },
84
+ {
85
+ "slug": "raindrops",
86
+ "difficulty": 1,
87
+ "topics": []
88
+ },
76
89
  {
77
90
  "slug": "hamming",
78
91
  "difficulty": 1,
@@ -128,6 +141,11 @@
128
141
  "difficulty": 1,
129
142
  "topics": []
130
143
  },
144
+ {
145
+ "slug": "say",
146
+ "difficulty": 1,
147
+ "topics": []
148
+ },
131
149
  {
132
150
  "slug": "zipper",
133
151
  "difficulty": 1,
@@ -6,5 +6,6 @@ test.native: *.ml *.mli
6
6
 
7
7
  clean:
8
8
  rm -rf _build
9
+ rm -f test.native
9
10
 
10
11
  .PHONY: clean
@@ -6,5 +6,6 @@ test.native: *.ml *.mli
6
6
 
7
7
  clean:
8
8
  rm -rf _build
9
+ rm -f test.native
9
10
 
10
11
  .PHONY: clean
@@ -21,4 +21,4 @@ let verse = function
21
21
  let sing ~from:from ~until:until =
22
22
  List.map (List.range ~stride:(-1) ~stop:`inclusive from until)
23
23
  ~f:(fun n -> verse n ^ "\n")
24
- |> String.concat
24
+ |> String.concat ~sep:""
@@ -1,27 +1,28 @@
1
1
  open Core.Std
2
2
  open OUnit2
3
+ open Beer_song
3
4
 
4
5
  let ae exp got = assert_equal ~printer:String.to_string exp got
5
6
 
6
7
  let tests =
7
8
  ["a verse">:: (fun _ ->
8
9
  let exp = "8 bottles of beer on the wall, 8 bottles of beer.\nTake one down and pass it around, 7 bottles of beer on the wall.\n" in
9
- ae exp (Beer.verse 8));
10
+ ae exp (verse 8));
10
11
  "verse 1">:: (fun _ ->
11
12
  let exp = "1 bottle of beer on the wall, 1 bottle of beer.\nTake it down and pass it around, no more bottles of beer on the wall.\n" in
12
- ae exp (Beer.verse 1));
13
+ ae exp (verse 1));
13
14
  "verse 2">:: (fun _ ->
14
15
  let exp = "2 bottles of beer on the wall, 2 bottles of beer.\nTake one down and pass it around, 1 bottle of beer on the wall.\n" in
15
- ae exp (Beer.verse 2));
16
+ ae exp (verse 2));
16
17
  "verse 0">:: (fun _ ->
17
18
  let exp = "No more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n" in
18
- ae exp (Beer.verse 0));
19
+ ae exp (verse 0));
19
20
  "singing several verses">:: (fun _ ->
20
21
  let exp = "8 bottles of beer on the wall, 8 bottles of beer.\nTake one down and pass it around, 7 bottles of beer on the wall.\n\n7 bottles of beer on the wall, 7 bottles of beer.\nTake one down and pass it around, 6 bottles of beer on the wall.\n\n6 bottles of beer on the wall, 6 bottles of beer.\nTake one down and pass it around, 5 bottles of beer on the wall.\n\n" in
21
- ae exp (Beer.sing ~from:8 ~until:6));
22
+ ae exp (sing ~from:8 ~until:6));
22
23
  "sing all the rest of the verses">:: (fun _ ->
23
24
  let exp = "3 bottles of beer on the wall, 3 bottles of beer.\nTake one down and pass it around, 2 bottles of beer on the wall.\n\n2 bottles of beer on the wall, 2 bottles of beer.\nTake one down and pass it around, 1 bottle of beer on the wall.\n\n1 bottle of beer on the wall, 1 bottle of beer.\nTake it down and pass it around, no more bottles of beer on the wall.\n\nNo more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n\n" in
24
- ae exp (Beer.sing ~from:3 ~until:0))
25
+ ae exp (sing ~from:3 ~until:0))
25
26
  ]
26
27
 
27
28
  let () =
@@ -6,5 +6,6 @@ test.native: *.ml *.mli
6
6
 
7
7
  clean:
8
8
  rm -rf _build
9
+ rm -f test.native
9
10
 
10
11
  .PHONY: clean
@@ -6,5 +6,6 @@ test.native: *.ml *.mli
6
6
 
7
7
  clean:
8
8
  rm -rf _build
9
+ rm -f test.native
9
10
 
10
11
  .PHONY: clean
@@ -6,5 +6,6 @@ test.native: *.ml
6
6
 
7
7
  clean:
8
8
  rm -rf _build
9
+ rm -f test.native
9
10
 
10
11
  .PHONY: clean
@@ -0,0 +1,5 @@
1
+ PKG findlib
2
+ PKG core
3
+ PKG ounit
4
+ S *
5
+ B *
@@ -0,0 +1,11 @@
1
+ test: test.native
2
+ @./test.native
3
+
4
+ test.native: *.ml *.mli
5
+ @corebuild -r -quiet -pkg oUnit test.native
6
+
7
+ clean:
8
+ rm -rf _build
9
+ rm -f test.native
10
+
11
+ .PHONY: clean
@@ -0,0 +1,8 @@
1
+ (* Square the sum of the numbers up to the given number *)
2
+ val square_of_sum : int -> int
3
+
4
+ (* Sum the squares of the numbers up to the given number *)
5
+ val sum_of_squares : int -> int
6
+
7
+ (* Subtract sum of squares from square of sums *)
8
+ val difference_of_squares : int -> int
@@ -0,0 +1,21 @@
1
+ open Core.Std
2
+
3
+ let rec range a b =
4
+ if a > b then
5
+ []
6
+ else
7
+ a :: (range (a + 1) b)
8
+
9
+ let square_of_sum n =
10
+ let numbers = (range 1 n) in
11
+ let sum = (List.fold ~init:0 ~f:(fun s t -> s + t) numbers) in
12
+ sum * sum
13
+
14
+ let sum_of_squares n =
15
+ let numbers = (range 1 n) in
16
+ let square m = m * m in
17
+ let squares = (List.map ~f:square numbers) in
18
+ List.fold ~init:0 ~f:(fun s t -> s + t) squares
19
+
20
+ let difference_of_squares n =
21
+ (square_of_sum n) - (sum_of_squares n)
@@ -0,0 +1,32 @@
1
+ open Core.Std
2
+ open OUnit2
3
+ open Difference_of_squares
4
+
5
+ let ae exp got _test_ctxt = assert_equal exp got
6
+
7
+ let tests =
8
+ [
9
+ "square of sum 5">::
10
+ ae 225 (square_of_sum 5);
11
+ "square of sum 10">::
12
+ ae 3025 (square_of_sum 10);
13
+ "square of sum 100">::
14
+ ae 25502500 (square_of_sum 100);
15
+ "sum of squares 5">::
16
+ ae 55 (sum_of_squares 5);
17
+ "sum of squares 10">::
18
+ ae 385 (sum_of_squares 10);
19
+ "sum of squares 5">::
20
+ ae 338350 (sum_of_squares 100);
21
+ "difference of squares 0">::
22
+ ae 0 (difference_of_squares 0);
23
+ "difference of squares 5">::
24
+ ae 170 (difference_of_squares 5);
25
+ "difference of squares 10">::
26
+ ae 2640 (difference_of_squares 10);
27
+ "difference of squares 100">::
28
+ ae 25164150 (difference_of_squares 100);
29
+ ]
30
+
31
+ let () =
32
+ run_test_tt_main ("difference of squares tests" >::: tests)
@@ -6,5 +6,6 @@ test.native: *.ml *.mli
6
6
 
7
7
  clean:
8
8
  rm -rf _build
9
+ rm -f test.native
9
10
 
10
11
  .PHONY: clean
@@ -20,7 +20,7 @@ let ame exp got =
20
20
 
21
21
  (* The tests never reuse a school value, so if you like you can use destructive
22
22
  * modification (i.e. mutable data structures). For the same reason
23
- * School.create takes a unit argument.
23
+ * Grade_school.create takes a unit argument.
24
24
  *
25
25
  * For those who wonder why the test doesn't use objects, it's to not force
26
26
  * the use of objects. You can still use them internally though.
@@ -28,45 +28,45 @@ let ame exp got =
28
28
 
29
29
  let tests =
30
30
  ["add student">:: (fun _ ->
31
- let got = School.create ()
32
- |> School.add "Aimee" 2 in
31
+ let got = Grade_school.create ()
32
+ |> Grade_school.add "Aimee" 2 in
33
33
  ame (IMap.of_alist_exn [(2, ["Aimee"])])
34
- (School.to_map got));
34
+ (Grade_school.to_map got));
35
35
  "add more students in same class">:: (fun _ ->
36
- let got = School.create ()
37
- |> School.add "James" 2
38
- |> School.add "Blair" 2
39
- |> School.add "Paul" 2 in
36
+ let got = Grade_school.create ()
37
+ |> Grade_school.add "James" 2
38
+ |> Grade_school.add "Blair" 2
39
+ |> Grade_school.add "Paul" 2 in
40
40
  ame (IMap.of_alist_exn [(2, ["Blair"; "James"; "Paul"])])
41
- (School.to_map got |> Map.map ~f:(List.sort ~cmp:compare)));
41
+ (Grade_school.to_map got |> Map.map ~f:(List.sort ~cmp:compare)));
42
42
  "add students to different grades">:: (fun _ ->
43
- let got = School.create ()
44
- |> School.add "Chelsea" 3
45
- |> School.add "Logan" 7 in
43
+ let got = Grade_school.create ()
44
+ |> Grade_school.add "Chelsea" 3
45
+ |> Grade_school.add "Logan" 7 in
46
46
  ame (IMap.of_alist_exn [(3, ["Chelsea"]); (7, ["Logan"])])
47
- (School.to_map got |> Map.map ~f:(List.sort ~cmp:compare)));
47
+ (Grade_school.to_map got |> Map.map ~f:(List.sort ~cmp:compare)));
48
48
  "get students in a grade">:: (fun _ ->
49
- let got = School.create ()
50
- |> School.add "Franklin" 5
51
- |> School.add "Bradley" 5
52
- |> School.add "Jeff" 1
53
- |> School.grade 5 in
49
+ let got = Grade_school.create ()
50
+ |> Grade_school.add "Franklin" 5
51
+ |> Grade_school.add "Bradley" 5
52
+ |> Grade_school.add "Jeff" 1
53
+ |> Grade_school.grade 5 in
54
54
  ale ["Bradley"; "Franklin"]
55
55
  (List.sort ~cmp:compare got));
56
56
  "get students in a non existant grade">:: (fun _ ->
57
- ale [] (List.sort ~cmp:compare (School.create () |> School.grade 2)));
57
+ ale [] (List.sort ~cmp:compare (Grade_school.create () |> Grade_school.grade 2)));
58
58
  "sort school">:: (fun _ ->
59
- let got = School.create ()
60
- |> School.add "Christopher" 4
61
- |> School.add "Jennifer" 4
62
- |> School.add "Aaron" 4
63
- |> School.add "Kareem" 6
64
- |> School.add "Kyle" 3
65
- |> School.sort in
59
+ let got = Grade_school.create ()
60
+ |> Grade_school.add "Christopher" 4
61
+ |> Grade_school.add "Jennifer" 4
62
+ |> Grade_school.add "Aaron" 4
63
+ |> Grade_school.add "Kareem" 6
64
+ |> Grade_school.add "Kyle" 3
65
+ |> Grade_school.sort in
66
66
  ame (IMap.of_alist_exn [(3, ["Kyle"]);
67
67
  (4, ["Aaron"; "Christopher"; "Jennifer"]);
68
68
  (6, ["Kareem"])])
69
- (School.to_map got));
69
+ (Grade_school.to_map got));
70
70
  ]
71
71
 
72
72
  let () =