trackler 2.2.1.45 → 2.2.1.46

Sign up to get free protection for your applications and to get access to all the features.
Files changed (508) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/complex-numbers/description.md +27 -0
  4. data/problem-specifications/exercises/crypto-square/canonical-data.json +39 -43
  5. data/problem-specifications/exercises/crypto-square/description.md +6 -4
  6. data/problem-specifications/exercises/hamming/canonical-data.json +5 -5
  7. data/problem-specifications/exercises/kindergarten-garden/description.md +10 -10
  8. data/problem-specifications/exercises/leap/canonical-data.json +2 -2
  9. data/problem-specifications/exercises/markdown/canonical-data.json +2 -2
  10. data/problem-specifications/exercises/nucleotide-count/canonical-data.json +12 -1
  11. data/problem-specifications/exercises/pangram/canonical-data.json +7 -1
  12. data/problem-specifications/exercises/queen-attack/canonical-data.json +83 -26
  13. data/problem-specifications/exercises/space-age/description.md +1 -2
  14. data/problem-specifications/exercises/zipper/canonical-data.json +671 -0
  15. data/tracks/bash/config.json +13 -1
  16. data/tracks/bash/exercises/atbash-cipher/README.md +45 -0
  17. data/tracks/bash/exercises/atbash-cipher/atbash_cipher_tests.sh +73 -0
  18. data/tracks/bash/exercises/atbash-cipher/example.sh +14 -0
  19. data/tracks/bash/exercises/gigasecond/.meta/hints.md +33 -0
  20. data/tracks/bash/exercises/two-fer/README.md +0 -22
  21. data/tracks/c/exercises/allergies/src/allergies.h +9 -9
  22. data/tracks/c/exercises/allergies/src/example.c +2 -2
  23. data/tracks/c/exercises/allergies/src/example.h +9 -9
  24. data/tracks/c/exercises/allergies/test/test_allergies.c +34 -34
  25. data/tracks/c/exercises/clock/test/test_clock.c +0 -52
  26. data/tracks/c/exercises/meetup/test/test_meetup.c +604 -114
  27. data/tracks/c/exercises/nucleotide-count/src/example.c +10 -10
  28. data/tracks/c/exercises/palindrome-products/src/example.c +8 -8
  29. data/tracks/c/exercises/palindrome-products/src/example.h +5 -5
  30. data/tracks/c/exercises/palindrome-products/test/test_palindrome_products.c +8 -6
  31. data/tracks/c/exercises/robot-simulator/src/example.c +19 -19
  32. data/tracks/c/exercises/robot-simulator/src/robot_simulator.h +24 -24
  33. data/tracks/c/exercises/robot-simulator/test/test_robot_simulator.c +35 -34
  34. data/tracks/c/exercises/series/src/example.c +10 -10
  35. data/tracks/c/exercises/series/src/series.h +5 -5
  36. data/tracks/c/exercises/series/test/test_series.c +77 -30
  37. data/tracks/c/exercises/sieve/src/example.c +17 -17
  38. data/tracks/c/exercises/sieve/src/sieve.h +2 -2
  39. data/tracks/c/exercises/sieve/test/test_sieve.c +6 -6
  40. data/tracks/c/exercises/space-age/src/example.c +1 -1
  41. data/tracks/c/exercises/space-age/src/example.h +3 -3
  42. data/tracks/c/exercises/space-age/test/test_space_age.c +2 -0
  43. data/tracks/c/exercises/sum-of-multiples/src/example.c +3 -1
  44. data/tracks/c/exercises/sum-of-multiples/test/test_sum_of_multiples.c +17 -0
  45. data/tracks/c/exercises/triangle/src/example.c +4 -4
  46. data/tracks/c/exercises/triangle/src/example.h +4 -4
  47. data/tracks/c/exercises/triangle/src/triangle.h +1 -1
  48. data/tracks/c/exercises/triangle/test/test_triangle.c +18 -16
  49. data/tracks/c/exercises/word-count/src/example.c +24 -24
  50. data/tracks/c/exercises/word-count/src/word_count.h +3 -3
  51. data/tracks/c/exercises/word-count/test/test_word_count.c +139 -139
  52. data/tracks/cfml/exercises/acronym/README.md +31 -0
  53. data/tracks/cfml/exercises/atbash-cipher/README.md +50 -0
  54. data/tracks/cfml/exercises/bob/README.md +34 -0
  55. data/tracks/cfml/exercises/diamond/README.md +75 -0
  56. data/tracks/cfml/exercises/difference-of-squares/README.md +35 -0
  57. data/tracks/cfml/exercises/flatten-array/README.md +34 -0
  58. data/tracks/cfml/exercises/gigasecond/README.md +27 -0
  59. data/tracks/cfml/exercises/grains/README.md +50 -0
  60. data/tracks/cfml/exercises/hamming/README.md +58 -0
  61. data/tracks/cfml/exercises/hello-world/README.md +37 -0
  62. data/tracks/cfml/exercises/isogram/README.md +35 -0
  63. data/tracks/cfml/exercises/largest-series-product/README.md +36 -0
  64. data/tracks/cfml/exercises/leap/README.md +16 -0
  65. data/tracks/cfml/exercises/luhn/README.md +87 -0
  66. data/tracks/cfml/exercises/markdown/README.md +34 -0
  67. data/tracks/cfml/exercises/nth-prime/README.md +31 -0
  68. data/tracks/cfml/exercises/pangram/README.md +31 -0
  69. data/tracks/cfml/exercises/pig-latin/README.md +40 -0
  70. data/tracks/cfml/exercises/raindrops/README.md +40 -0
  71. data/tracks/cfml/exercises/rna-transcription/README.md +41 -0
  72. data/tracks/cfml/exercises/saddle-points/README.md +49 -0
  73. data/tracks/cfml/exercises/scrabble-score/README.md +60 -0
  74. data/tracks/cfml/exercises/secret-handshake/README.md +51 -0
  75. data/tracks/cfml/exercises/space-age/README.md +41 -0
  76. data/tracks/cfml/exercises/sum-of-multiples/README.md +34 -0
  77. data/tracks/cfml/exercises/triangle/README.md +42 -0
  78. data/tracks/cfml/exercises/word-count/README.md +35 -0
  79. data/tracks/clojure/config.json +10 -0
  80. data/tracks/clojure/exercises/spiral-matrix/README.md +32 -0
  81. data/tracks/clojure/exercises/spiral-matrix/project.clj +4 -0
  82. data/tracks/clojure/exercises/spiral-matrix/src/example.clj +11 -0
  83. data/tracks/clojure/exercises/spiral-matrix/src/spiral_matrix.clj +3 -0
  84. data/tracks/clojure/exercises/spiral-matrix/test/spiral_matrix_test.clj +58 -0
  85. data/tracks/common-lisp/config.json +20 -0
  86. data/tracks/common-lisp/exercises/hello-world/README.md +68 -0
  87. data/tracks/common-lisp/exercises/hello-world/example.lisp +9 -0
  88. data/tracks/common-lisp/exercises/hello-world/hello-world-test.lisp +21 -0
  89. data/tracks/common-lisp/exercises/hello-world/hello-world.lisp +6 -0
  90. data/tracks/common-lisp/exercises/perfect-numbers/README.md +72 -0
  91. data/tracks/common-lisp/exercises/perfect-numbers/example.lisp +17 -0
  92. data/tracks/common-lisp/exercises/perfect-numbers/perfect-numbers-test.lisp +56 -0
  93. data/tracks/common-lisp/exercises/perfect-numbers/perfect-numbers.lisp +7 -0
  94. data/tracks/cpp/.travis.yml +34 -14
  95. data/tracks/cpp/docs/INSTALLATION.md +17 -28
  96. data/tracks/cpp/docs/TESTS.md +13 -21
  97. data/tracks/crystal/config.json +10 -0
  98. data/tracks/crystal/exercises/triangle/spec/triangle_spec.cr +60 -0
  99. data/tracks/crystal/exercises/triangle/src/example.cr +31 -0
  100. data/tracks/crystal/exercises/triangle/src/triangle.cr +1 -0
  101. data/tracks/crystal/generator/spec/remote_data_file_spec.cr +0 -1
  102. data/tracks/crystal/generator/src/generators/triangle.cr +38 -0
  103. data/tracks/crystal/generator/src/remote_data_file.cr +1 -1
  104. data/tracks/csharp/exercises/difference-of-squares/DifferenceOfSquares.cs +4 -4
  105. data/tracks/csharp/exercises/difference-of-squares/DifferenceOfSquaresTest.cs +22 -27
  106. data/tracks/csharp/exercises/difference-of-squares/Example.cs +5 -5
  107. data/tracks/csharp/exercises/error-handling/ErrorHandlingTest.cs +4 -4
  108. data/tracks/csharp/exercises/flatten-array/Example.cs +1 -1
  109. data/tracks/csharp/exercises/flatten-array/FlattenArray.cs +1 -1
  110. data/tracks/csharp/exercises/flatten-array/FlattenArrayTest.cs +106 -72
  111. data/tracks/csharp/exercises/largest-series-product/LargestSeriesProductTest.cs +24 -98
  112. data/tracks/csharp/exercises/minesweeper/Example.cs +3 -3
  113. data/tracks/csharp/exercises/minesweeper/Minesweeper.cs +1 -1
  114. data/tracks/csharp/exercises/minesweeper/MinesweeperTest.cs +155 -57
  115. data/tracks/csharp/generators/Exercises/DifferenceOfSquares.cs +25 -0
  116. data/tracks/csharp/generators/Exercises/FlattenArray.cs +36 -0
  117. data/tracks/csharp/generators/Exercises/LargestSeriesProduct.cs +18 -0
  118. data/tracks/csharp/generators/Exercises/Minesweeper.cs +32 -0
  119. data/tracks/d/docs/EXERCISE_README_INSERT.md +1 -1
  120. data/tracks/d/exercises/bob/README.md +1 -1
  121. data/tracks/d/exercises/circular-buffer/README.md +1 -1
  122. data/tracks/d/exercises/crypto-square/README.md +1 -1
  123. data/tracks/d/exercises/difference-of-squares/README.md +1 -1
  124. data/tracks/d/exercises/etl/README.md +1 -1
  125. data/tracks/d/exercises/gigasecond/README.md +1 -1
  126. data/tracks/d/exercises/hamming/README.md +1 -1
  127. data/tracks/d/exercises/hello-world/README.md +1 -1
  128. data/tracks/d/exercises/leap/README.md +1 -1
  129. data/tracks/d/exercises/nucleotide-count/README.md +1 -1
  130. data/tracks/d/exercises/pangram/README.md +1 -1
  131. data/tracks/d/exercises/raindrops/README.md +1 -1
  132. data/tracks/d/exercises/react/README.md +1 -1
  133. data/tracks/d/exercises/rna-transcription/README.md +1 -1
  134. data/tracks/d/exercises/robot-name/README.md +1 -1
  135. data/tracks/d/exercises/roman-numerals/README.md +1 -1
  136. data/tracks/d/exercises/series/README.md +1 -1
  137. data/tracks/d/exercises/triangle/README.md +1 -1
  138. data/tracks/dart/CONTRIBUTING.md +61 -0
  139. data/tracks/dart/README.md +10 -47
  140. data/tracks/dart/config.json +13 -1
  141. data/tracks/dart/exercises/anagram/README.md +10 -0
  142. data/tracks/dart/exercises/bob/README.md +11 -0
  143. data/tracks/dart/exercises/difference-of-squares/README.md +11 -0
  144. data/tracks/dart/exercises/gigasecond/README.md +11 -0
  145. data/tracks/dart/exercises/gigasecond/test/gigasecond_test.dart +56 -33
  146. data/tracks/dart/exercises/hamming/README.md +11 -0
  147. data/tracks/dart/exercises/hamming/lib/example.dart +2 -2
  148. data/tracks/dart/exercises/hamming/test/hamming_test.dart +41 -24
  149. data/tracks/dart/exercises/hello-world/README.md +11 -0
  150. data/tracks/dart/exercises/leap/README.md +12 -1
  151. data/tracks/dart/exercises/phone-number/README.md +56 -0
  152. data/tracks/dart/exercises/phone-number/lib/example.dart +45 -0
  153. data/tracks/dart/exercises/phone-number/lib/phone_number.dart +3 -0
  154. data/tracks/dart/exercises/phone-number/pubspec.lock +293 -0
  155. data/tracks/dart/exercises/phone-number/pubspec.yaml +3 -0
  156. data/tracks/dart/exercises/phone-number/test/phone_number_test.dart +66 -0
  157. data/tracks/dart/exercises/raindrops/README.md +35 -0
  158. data/tracks/dart/exercises/rna-transcription/README.md +11 -0
  159. data/tracks/dart/exercises/word-count/README.md +14 -3
  160. data/tracks/delphi/docs/RESOURCES.md +10 -11
  161. data/tracks/elixir/exercises/hello-world/hello_world.exs +1 -1
  162. data/tracks/elixir/exercises/secret-handshake/README.md +3 -5
  163. data/tracks/elm/exercises/isogram/Isogram.example.elm +4 -4
  164. data/tracks/erlang/config.json +10 -0
  165. data/tracks/erlang/exercises/sieve/README.md +88 -0
  166. data/tracks/erlang/exercises/sieve/include/exercism.hrl +11 -0
  167. data/tracks/erlang/exercises/sieve/rebar.config +30 -0
  168. data/tracks/erlang/exercises/sieve/src/example.erl +16 -0
  169. data/tracks/erlang/exercises/sieve/src/sieve.app.src +9 -0
  170. data/tracks/erlang/exercises/sieve/src/sieve.erl +8 -0
  171. data/tracks/erlang/exercises/sieve/test/sieve_tests.erl +38 -0
  172. data/tracks/fsharp/.gitignore +2 -1
  173. data/tracks/fsharp/exercises/crypto-square/CryptoSquareTest.fs +10 -6
  174. data/tracks/fsharp/exercises/leap/LeapTest.fs +2 -2
  175. data/tracks/fsharp/exercises/pangram/PangramTest.fs +5 -1
  176. data/tracks/fsharp/exercises/queen-attack/QueenAttackTest.fs +7 -7
  177. data/tracks/fsharp/exercises/run-length-encoding/Example.fs +2 -2
  178. data/tracks/fsharp/exercises/run-length-encoding/RunLengthEncodingTest.fs +42 -30
  179. data/tracks/fsharp/generators/Generators.fs +21 -8
  180. data/tracks/gnu-apl/test.apl +4 -4
  181. data/tracks/go/README.md +1 -2
  182. data/tracks/go/config/maintainers.json +5 -6
  183. data/tracks/groovy/config.json +23 -0
  184. data/tracks/groovy/exercises/binary-search/BinarySearch.groovy +14 -0
  185. data/tracks/groovy/exercises/binary-search/BinarySearchSpec.groovy +56 -0
  186. data/tracks/groovy/exercises/binary-search/Example.groovy +43 -0
  187. data/tracks/groovy/exercises/binary-search/README.md +59 -0
  188. data/tracks/groovy/exercises/triangle/Example.groovy +23 -0
  189. data/tracks/groovy/exercises/triangle/README.md +42 -0
  190. data/tracks/groovy/exercises/triangle/Triangle.groovy +15 -0
  191. data/tracks/groovy/exercises/triangle/TriangleSpec.groovy +66 -0
  192. data/tracks/haskell/config.json +9 -0
  193. data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
  194. data/tracks/haskell/exercises/all-your-base/test/Tests.hs +18 -18
  195. data/tracks/haskell/exercises/bowling/package.yaml +1 -1
  196. data/tracks/haskell/exercises/bowling/test/Tests.hs +9 -9
  197. data/tracks/haskell/exercises/change/package.yaml +1 -1
  198. data/tracks/haskell/exercises/change/test/Tests.hs +5 -0
  199. data/tracks/haskell/exercises/complex-numbers/README.md +92 -0
  200. data/tracks/haskell/exercises/complex-numbers/examples/success-standard/package.yaml +16 -0
  201. data/tracks/haskell/exercises/complex-numbers/examples/success-standard/src/ComplexNumbers.hs +50 -0
  202. data/tracks/haskell/exercises/complex-numbers/package.yaml +20 -0
  203. data/tracks/haskell/exercises/complex-numbers/src/ComplexNumbers.hs +45 -0
  204. data/tracks/haskell/exercises/complex-numbers/stack.yaml +1 -0
  205. data/tracks/haskell/exercises/complex-numbers/test/Tests.hs +194 -0
  206. data/tracks/haskell/exercises/crypto-square/package.yaml +1 -1
  207. data/tracks/haskell/exercises/crypto-square/test/Tests.hs +20 -12
  208. data/tracks/haskell/exercises/dominoes/package.yaml +1 -1
  209. data/tracks/haskell/exercises/forth/package.yaml +1 -1
  210. data/tracks/haskell/exercises/forth/test/Tests.hs +4 -3
  211. data/tracks/haskell/exercises/hamming/package.yaml +1 -1
  212. data/tracks/haskell/exercises/hamming/test/Tests.hs +6 -6
  213. data/tracks/haskell/exercises/isogram/package.yaml +1 -1
  214. data/tracks/haskell/exercises/isogram/test/Tests.hs +2 -2
  215. data/tracks/haskell/exercises/leap/package.yaml +1 -1
  216. data/tracks/haskell/exercises/leap/test/Tests.hs +1 -1
  217. data/tracks/haskell/exercises/pascals-triangle/package.yaml +1 -1
  218. data/tracks/haskell/exercises/pig-latin/examples/success-standard/src/PigLatin.hs +2 -0
  219. data/tracks/haskell/exercises/pig-latin/package.yaml +1 -1
  220. data/tracks/haskell/exercises/pig-latin/test/Tests.hs +8 -0
  221. data/tracks/haskell/exercises/queen-attack/package.yaml +1 -1
  222. data/tracks/haskell/exercises/rna-transcription/package.yaml +1 -1
  223. data/tracks/haskell/exercises/rna-transcription/test/Tests.hs +8 -8
  224. data/tracks/haskell/exercises/robot-simulator/package.yaml +1 -1
  225. data/tracks/haskell/exercises/secret-handshake/package.yaml +1 -1
  226. data/tracks/haskell/exercises/secret-handshake/test/Tests.hs +0 -3
  227. data/tracks/haskell/exercises/sum-of-multiples/package.yaml +1 -1
  228. data/tracks/haskell/exercises/sum-of-multiples/test/Tests.hs +4 -0
  229. data/tracks/haskell/exercises/zipper/package.yaml +1 -1
  230. data/tracks/haskell/exercises/zipper/test/Tests.hs +23 -0
  231. data/tracks/java/config.json +85 -13
  232. data/tracks/java/config/maintainers.json +1 -1
  233. data/tracks/java/exercises/accumulate/README.md +0 -3
  234. data/tracks/java/exercises/acronym/.meta/.version +1 -0
  235. data/tracks/java/exercises/acronym/README.md +0 -1
  236. data/tracks/java/exercises/acronym/src/test/java/AcronymTest.java +0 -3
  237. data/tracks/java/exercises/all-your-base/.meta/.version +1 -0
  238. data/tracks/java/exercises/all-your-base/README.md +1 -1
  239. data/tracks/java/exercises/all-your-base/src/test/java/BaseConverterTest.java +0 -3
  240. data/tracks/java/exercises/allergies/README.md +0 -1
  241. data/tracks/java/exercises/atbash-cipher/README.md +2 -1
  242. data/tracks/java/exercises/beer-song/README.md +1 -1
  243. data/tracks/java/exercises/binary/README.md +2 -0
  244. data/tracks/java/exercises/book-store/README.md +5 -5
  245. data/tracks/java/exercises/bowling/README.md +20 -6
  246. data/tracks/java/exercises/change/.meta/.version +1 -0
  247. data/tracks/java/exercises/change/README.md +1 -1
  248. data/tracks/java/exercises/change/src/test/java/ChangeCalculatorTest.java +0 -3
  249. data/tracks/java/exercises/circular-buffer/README.md +13 -6
  250. data/tracks/java/exercises/clock/.meta/.version +1 -0
  251. data/tracks/java/exercises/clock/src/test/java/ClockAddTest.java +0 -3
  252. data/tracks/java/exercises/clock/src/test/java/ClockCreationTest.java +0 -3
  253. data/tracks/java/exercises/clock/src/test/java/ClockEqualTest.java +0 -3
  254. data/tracks/java/exercises/collatz-conjecture/.meta/.version +1 -0
  255. data/tracks/java/exercises/collatz-conjecture/README.md +1 -1
  256. data/tracks/java/exercises/collatz-conjecture/src/test/java/CollatzCalculatorTest.java +0 -3
  257. data/tracks/java/exercises/complex-numbers/README.md +27 -0
  258. data/tracks/java/exercises/crypto-square/README.md +10 -8
  259. data/tracks/java/exercises/diamond/.meta/.version +1 -0
  260. data/tracks/java/exercises/diamond/README.md +6 -6
  261. data/tracks/java/exercises/diamond/src/test/java/DiamondPrinterTest.java +0 -3
  262. data/tracks/java/exercises/difference-of-squares/.meta/.version +1 -0
  263. data/tracks/java/exercises/difference-of-squares/src/test/java/DifferenceOfSquaresCalculatorTest.java +0 -3
  264. data/tracks/java/exercises/etl/README.md +2 -0
  265. data/tracks/java/exercises/flatten-array/.meta/.version +1 -0
  266. data/tracks/java/exercises/flatten-array/README.md +1 -2
  267. data/tracks/java/exercises/flatten-array/src/test/java/FlattenerTest.java +0 -3
  268. data/tracks/java/exercises/food-chain/README.md +1 -1
  269. data/tracks/java/exercises/forth/.meta/.version +1 -0
  270. data/tracks/java/exercises/forth/src/test/java/ForthEvaluatorTest.java +0 -3
  271. data/tracks/java/exercises/grade-school/README.md +0 -1
  272. data/tracks/java/exercises/hamming/.meta/.version +1 -0
  273. data/tracks/java/exercises/hamming/src/test/java/HammingTest.java +0 -3
  274. data/tracks/java/exercises/house/README.md +1 -2
  275. data/tracks/java/exercises/isogram/README.md +2 -1
  276. data/tracks/java/exercises/kindergarten-garden/README.md +13 -13
  277. data/tracks/java/exercises/linked-list/README.md +10 -10
  278. data/tracks/java/exercises/list-ops/.meta/.version +1 -0
  279. data/tracks/java/exercises/list-ops/README.md +4 -0
  280. data/tracks/java/exercises/list-ops/src/test/java/ListOpsTest.java +0 -3
  281. data/tracks/java/exercises/luhn/README.md +7 -7
  282. data/tracks/java/exercises/matrix/README.md +6 -4
  283. data/tracks/java/exercises/meetup/README.md +1 -2
  284. data/tracks/java/exercises/minesweeper/.meta/.version +1 -0
  285. data/tracks/java/exercises/minesweeper/src/test/java/MinesweeperBoardTest.java +0 -3
  286. data/tracks/java/exercises/nucleotide-count/README.md +8 -22
  287. data/tracks/java/exercises/ocr-numbers/README.md +5 -5
  288. data/tracks/java/exercises/octal/README.md +6 -2
  289. data/tracks/java/exercises/palindrome-products/README.md +15 -16
  290. data/tracks/java/exercises/pangram/.meta/.version +1 -0
  291. data/tracks/java/exercises/pangram/README.md +1 -1
  292. data/tracks/java/exercises/pangram/src/test/java/PangramCheckerTest.java +0 -3
  293. data/tracks/java/exercises/pascals-triangle/.meta/.version +1 -0
  294. data/tracks/java/exercises/pascals-triangle/README.md +1 -1
  295. data/tracks/java/exercises/pascals-triangle/src/test/java/PascalsTriangleGeneratorTest.java +0 -3
  296. data/tracks/java/exercises/perfect-numbers/.meta/.version +1 -0
  297. data/tracks/java/exercises/perfect-numbers/README.md +2 -2
  298. data/tracks/java/exercises/perfect-numbers/src/test/java/NaturalNumberTest.java +0 -3
  299. data/tracks/java/exercises/phone-number/README.md +3 -2
  300. data/tracks/java/exercises/pythagorean-triplet/README.md +3 -3
  301. data/tracks/java/exercises/queen-attack/README.md +1 -1
  302. data/tracks/java/exercises/rectangles/README.md +7 -7
  303. data/tracks/java/exercises/rna-transcription/.meta/.version +1 -0
  304. data/tracks/java/exercises/rna-transcription/src/test/java/RnaTranscriptionTest.java +0 -3
  305. data/tracks/java/exercises/roman-numerals/README.md +1 -1
  306. data/tracks/java/exercises/rotational-cipher/README.md +2 -1
  307. data/tracks/java/exercises/run-length-encoding/README.md +4 -4
  308. data/tracks/java/exercises/saddle-points/.meta/.version +1 -0
  309. data/tracks/java/exercises/saddle-points/README.md +1 -1
  310. data/tracks/java/exercises/saddle-points/src/test/java/MatrixTest.java +0 -3
  311. data/tracks/java/exercises/scrabble-score/.meta/.version +1 -0
  312. data/tracks/java/exercises/scrabble-score/README.md +3 -1
  313. data/tracks/java/exercises/scrabble-score/src/test/java/ScrabbleScoreTest.java +0 -3
  314. data/tracks/java/exercises/secret-handshake/README.md +1 -1
  315. data/tracks/java/exercises/simple-cipher/README.md +1 -1
  316. data/tracks/java/exercises/simple-linked-list/src/test/java/SimpleLinkedListTest.java +25 -25
  317. data/tracks/java/exercises/space-age/README.md +1 -1
  318. data/tracks/java/exercises/spiral-matrix/.meta/.version +1 -0
  319. data/tracks/java/exercises/spiral-matrix/README.md +2 -2
  320. data/tracks/java/exercises/spiral-matrix/src/test/java/SpiralMatrixBuilderTest.java +0 -3
  321. data/tracks/java/exercises/sum-of-multiples/README.md +0 -3
  322. data/tracks/java/exercises/tournament/README.md +6 -5
  323. data/tracks/java/exercises/transpose/README.md +7 -7
  324. data/tracks/java/exercises/triangle/README.md +9 -6
  325. data/tracks/java/exercises/trinary/README.md +1 -1
  326. data/tracks/java/exercises/twelve-days/README.md +1 -1
  327. data/tracks/java/exercises/two-fer/README.md +1 -2
  328. data/tracks/java/exercises/word-count/README.md +1 -2
  329. data/tracks/java/exercises/word-search/.meta/.version +1 -0
  330. data/tracks/java/exercises/word-search/README.md +1 -1
  331. data/tracks/java/exercises/word-search/src/test/java/WordSearcherTest.java +0 -3
  332. data/tracks/java/exercises/wordy/README.md +0 -5
  333. data/tracks/javascript/config.json +13 -0
  334. data/tracks/javascript/docs/TESTS.md +1 -1
  335. data/tracks/javascript/exercises/diffie-hellman/example.js +1 -1
  336. data/tracks/javascript/exercises/hello-world/example.js +2 -3
  337. data/tracks/javascript/exercises/meetup/example.js +24 -27
  338. data/tracks/javascript/exercises/meetup/meetup.spec.js +0 -6
  339. data/tracks/javascript/exercises/nucleotide-count/nucleotide-count.spec.js +1 -1
  340. data/tracks/javascript/exercises/protein-translation/README.md +73 -0
  341. data/tracks/javascript/exercises/protein-translation/example.js +68 -0
  342. data/tracks/javascript/exercises/protein-translation/protein-translation.spec.js +63 -0
  343. data/tracks/julia/README.md +1 -1
  344. data/tracks/kotlin/config.json +11 -0
  345. data/tracks/kotlin/exercises/acronym/README.md +0 -1
  346. data/tracks/kotlin/exercises/all-your-base/README.md +1 -1
  347. data/tracks/kotlin/exercises/allergies/README.md +0 -1
  348. data/tracks/kotlin/exercises/atbash-cipher/README.md +2 -1
  349. data/tracks/kotlin/exercises/beer-song/README.md +1 -1
  350. data/tracks/kotlin/exercises/binary/README.md +2 -0
  351. data/tracks/kotlin/exercises/change/README.md +1 -1
  352. data/tracks/kotlin/exercises/collatz-conjecture/README.md +1 -1
  353. data/tracks/kotlin/exercises/complex-numbers/README.md +27 -0
  354. data/tracks/kotlin/exercises/diamond/README.md +6 -6
  355. data/tracks/kotlin/exercises/etl/README.md +2 -0
  356. data/tracks/kotlin/exercises/flatten-array/README.md +1 -2
  357. data/tracks/kotlin/exercises/grade-school/README.md +0 -1
  358. data/tracks/kotlin/exercises/grains/README.md +0 -1
  359. data/tracks/kotlin/exercises/hello-world/.meta/hints.md +4 -0
  360. data/tracks/kotlin/exercises/hello-world/.meta/src/reference/kotlin/HelloWorld.kt +2 -2
  361. data/tracks/kotlin/exercises/hello-world/README.md +6 -0
  362. data/tracks/kotlin/exercises/hello-world/TUTORIAL.md +32 -434
  363. data/tracks/kotlin/exercises/hello-world/src/main/kotlin/HelloWorld.kt +1 -1
  364. data/tracks/kotlin/exercises/hello-world/src/test/kotlin/HelloWorldTest.kt +2 -21
  365. data/tracks/kotlin/exercises/isogram/README.md +2 -1
  366. data/tracks/kotlin/exercises/leap/README.md +1 -1
  367. data/tracks/kotlin/exercises/linked-list/README.md +10 -10
  368. data/tracks/kotlin/exercises/luhn/README.md +7 -7
  369. data/tracks/kotlin/exercises/meetup/README.md +1 -2
  370. data/tracks/kotlin/exercises/nucleotide-count/README.md +8 -22
  371. data/tracks/kotlin/exercises/pangram/README.md +1 -1
  372. data/tracks/kotlin/exercises/pascals-triangle/README.md +1 -1
  373. data/tracks/kotlin/exercises/perfect-numbers/README.md +2 -2
  374. data/tracks/kotlin/exercises/phone-number/README.md +3 -2
  375. data/tracks/kotlin/exercises/roman-numerals/README.md +1 -1
  376. data/tracks/kotlin/exercises/rotational-cipher/README.md +2 -1
  377. data/tracks/kotlin/exercises/saddle-points/README.md +1 -1
  378. data/tracks/kotlin/exercises/scrabble-score/README.md +3 -1
  379. data/tracks/kotlin/exercises/secret-handshake/README.md +1 -1
  380. data/tracks/kotlin/exercises/settings.gradle +1 -0
  381. data/tracks/kotlin/exercises/space-age/README.md +1 -2
  382. data/tracks/kotlin/exercises/spiral-matrix/README.md +2 -2
  383. data/tracks/kotlin/exercises/sum-of-multiples/README.md +0 -3
  384. data/tracks/kotlin/exercises/triangle/README.md +9 -6
  385. data/tracks/kotlin/exercises/two-fer/.meta/src/reference/kotlin/Twofer.kt +3 -0
  386. data/tracks/kotlin/exercises/two-fer/README.md +50 -0
  387. data/tracks/kotlin/exercises/two-fer/build.gradle +28 -0
  388. data/tracks/kotlin/exercises/two-fer/src/main/kotlin/.keep +0 -0
  389. data/tracks/kotlin/exercises/two-fer/src/test/kotlin/TwoferTest.kt +31 -0
  390. data/tracks/kotlin/exercises/word-count/README.md +1 -2
  391. data/tracks/ocaml/exercises/pangram/test.ml +3 -1
  392. data/tracks/perl5/.travis.yml +3 -1
  393. data/tracks/php/Makefile +2 -2
  394. data/tracks/php/README.md +4 -4
  395. data/tracks/php/config.json +15 -0
  396. data/tracks/php/exercises/transpose/example.php +30 -0
  397. data/tracks/php/exercises/transpose/transpose_test.php +116 -0
  398. data/tracks/php/{phpcs-xphp.xml → phpcs-php.xml} +0 -0
  399. data/tracks/python/.travis.yml +1 -1
  400. data/tracks/python/config.json +199 -39
  401. data/tracks/python/exercises/acronym/acronym_test.py +1 -1
  402. data/tracks/python/exercises/allergies/allergies_test.py +1 -1
  403. data/tracks/python/exercises/alphametics/alphametics_test.py +1 -1
  404. data/tracks/python/exercises/anagram/anagram_test.py +1 -1
  405. data/tracks/python/exercises/atbash-cipher/atbash_cipher_test.py +1 -1
  406. data/tracks/python/exercises/bob/bob.py +1 -1
  407. data/tracks/python/exercises/bob/bob_test.py +1 -1
  408. data/tracks/python/exercises/book-store/book_store_test.py +1 -1
  409. data/tracks/python/exercises/bracket-push/bracket_push.py +1 -1
  410. data/tracks/python/exercises/bracket-push/bracket_push_test.py +1 -1
  411. data/tracks/python/exercises/collatz-conjecture/collatz_conjecture_test.py +1 -1
  412. data/tracks/python/exercises/diamond/diamond_test.py +1 -1
  413. data/tracks/python/exercises/difference-of-squares/difference_of_squares_test.py +1 -1
  414. data/tracks/python/exercises/diffie-hellman/README.md +58 -0
  415. data/tracks/python/exercises/diffie-hellman/diffie_hellman.py +10 -0
  416. data/tracks/python/exercises/diffie-hellman/diffie_hellman_test.py +87 -0
  417. data/tracks/python/exercises/diffie-hellman/example.py +13 -0
  418. data/tracks/python/exercises/etl/etl_test.py +1 -1
  419. data/tracks/python/exercises/food-chain/README.md +81 -0
  420. data/tracks/python/exercises/food-chain/example.py +45 -0
  421. data/tracks/python/exercises/food-chain/food_chain.py +2 -0
  422. data/tracks/python/exercises/food-chain/food_chain_test.py +109 -0
  423. data/tracks/python/exercises/forth/README.md +43 -0
  424. data/tracks/python/exercises/forth/example.py +58 -0
  425. data/tracks/python/exercises/forth/forth.py +2 -0
  426. data/tracks/python/exercises/forth/forth_test.py +254 -0
  427. data/tracks/python/exercises/gigasecond/gigasecond_test.py +1 -1
  428. data/tracks/python/exercises/grep/grep_test.py +1 -1
  429. data/tracks/python/exercises/hello-world/hello_world_test.py +1 -1
  430. data/tracks/python/exercises/isogram/isogram_test.py +10 -10
  431. data/tracks/python/exercises/largest-series-product/largest_series_product_test.py +1 -1
  432. data/tracks/python/exercises/leap/leap_test.py +5 -5
  433. data/tracks/python/exercises/luhn/luhn_test.py +16 -16
  434. data/tracks/python/exercises/markdown/README.md +30 -0
  435. data/tracks/python/exercises/markdown/example.py +80 -0
  436. data/tracks/python/exercises/markdown/markdown.py +71 -0
  437. data/tracks/python/exercises/markdown/markdown_test.py +51 -0
  438. data/tracks/python/exercises/meetup/meetup_test.py +1 -1
  439. data/tracks/python/exercises/nth-prime/nth_prime_test.py +1 -1
  440. data/tracks/python/exercises/pascals-triangle/pascals_triangle_test.py +2 -2
  441. data/tracks/python/exercises/perfect-numbers/perfect_numbers_test.py +11 -11
  442. data/tracks/python/exercises/phone-number/phone_number_test.py +1 -1
  443. data/tracks/python/exercises/prime-factors/prime_factors_test.py +1 -1
  444. data/tracks/python/exercises/pythagorean-triplet/pythagorean_triplet_test.py +3 -3
  445. data/tracks/python/exercises/queen-attack/queen_attack_test.py +8 -8
  446. data/tracks/python/exercises/rail-fence-cipher/rail_fence_cipher_test.py +1 -1
  447. data/tracks/python/exercises/rectangles/rectangles_test.py +1 -1
  448. data/tracks/python/exercises/robot-simulator/robot_simulator.py +9 -1
  449. data/tracks/python/exercises/roman-numerals/roman_numerals_test.py +1 -1
  450. data/tracks/python/exercises/run-length-encoding/run_length_encoding_test.py +1 -1
  451. data/tracks/python/exercises/say/say_test.py +1 -1
  452. data/tracks/python/exercises/scrabble-score/scrabble_score_test.py +1 -1
  453. data/tracks/python/exercises/series/series.py +1 -1
  454. data/tracks/python/exercises/sieve/sieve_test.py +1 -1
  455. data/tracks/python/exercises/sublist/sublist_test.py +1 -1
  456. data/tracks/python/exercises/tournament/tournament_test.py +1 -1
  457. data/tracks/python/exercises/transpose/transpose_test.py +1 -1
  458. data/tracks/python/exercises/two-bucket/example.py +49 -54
  459. data/tracks/python/exercises/two-bucket/two_bucket_test.py +1 -1
  460. data/tracks/python/exercises/variable-length-quantity/variable_length_quantity_test.py +1 -1
  461. data/tracks/rust/config.json +24 -0
  462. data/tracks/rust/exercises/collatz-conjecture/Cargo.lock +4 -0
  463. data/tracks/rust/exercises/collatz-conjecture/Cargo.toml +3 -0
  464. data/tracks/rust/exercises/collatz-conjecture/README.md +65 -0
  465. data/tracks/rust/exercises/collatz-conjecture/example.rs +19 -0
  466. data/tracks/rust/exercises/collatz-conjecture/src/lib.rs +4 -0
  467. data/tracks/rust/exercises/collatz-conjecture/tests/collatz-conjecture.rs +32 -0
  468. data/tracks/rust/exercises/decimal/.gitignore +7 -0
  469. data/tracks/rust/exercises/decimal/.meta/description.md +19 -0
  470. data/tracks/rust/exercises/decimal/.meta/metadata.yml +3 -0
  471. data/tracks/rust/exercises/decimal/Cargo-example.toml +9 -0
  472. data/tracks/rust/exercises/decimal/Cargo.toml +6 -0
  473. data/tracks/rust/exercises/decimal/README.md +59 -0
  474. data/tracks/rust/exercises/decimal/example.rs +187 -0
  475. data/tracks/rust/exercises/decimal/src/lib.rs +10 -0
  476. data/tracks/rust/exercises/decimal/tests/decimal.rs +332 -0
  477. data/tracks/sml/exercises/accumulate/README.md +9 -1
  478. data/tracks/swift/exercises/luhn/Sources/LuhnExample.swift +17 -26
  479. data/tracks/swift/exercises/luhn/Tests/LinuxMain.swift +1 -1
  480. data/tracks/swift/exercises/luhn/Tests/LuhnTests/LuhnTests.swift +59 -35
  481. data/tracks/typescript/config.json +34 -0
  482. data/tracks/typescript/exercises/binary-search/README.md +67 -0
  483. data/tracks/typescript/exercises/binary-search/binary-search.example.ts +42 -0
  484. data/tracks/typescript/exercises/binary-search/binary-search.test.ts +27 -0
  485. data/tracks/typescript/exercises/binary-search/binary-search.ts +3 -0
  486. data/tracks/typescript/exercises/binary-search/package.json +36 -0
  487. data/tracks/typescript/exercises/binary-search/tsconfig.json +22 -0
  488. data/tracks/typescript/exercises/binary-search/tslint.json +127 -0
  489. data/tracks/typescript/exercises/binary-search/yarn.lock +2305 -0
  490. data/tracks/typescript/exercises/pascals-triangle/README.md +47 -0
  491. data/tracks/typescript/exercises/pascals-triangle/package.json +36 -0
  492. data/tracks/typescript/exercises/pascals-triangle/pascals-triangle.example.ts +32 -0
  493. data/tracks/typescript/exercises/pascals-triangle/pascals-triangle.test.ts +28 -0
  494. data/tracks/typescript/exercises/pascals-triangle/pascals-triangle.ts +2 -0
  495. data/tracks/typescript/exercises/pascals-triangle/tsconfig.json +22 -0
  496. data/tracks/typescript/exercises/pascals-triangle/tslint.json +127 -0
  497. data/tracks/typescript/exercises/pascals-triangle/yarn.lock +2305 -0
  498. data/tracks/typescript/exercises/rotational-cipher/README.md +63 -0
  499. data/tracks/typescript/exercises/rotational-cipher/package.json +36 -0
  500. data/tracks/typescript/exercises/rotational-cipher/rotational-cipher.example.ts +19 -0
  501. data/tracks/typescript/exercises/rotational-cipher/rotational-cipher.test.ts +56 -0
  502. data/tracks/typescript/exercises/rotational-cipher/rotational-cipher.ts +1 -0
  503. data/tracks/typescript/exercises/rotational-cipher/tsconfig.json +22 -0
  504. data/tracks/typescript/exercises/rotational-cipher/tslint.json +127 -0
  505. data/tracks/typescript/exercises/rotational-cipher/yarn.lock +2305 -0
  506. metadata +171 -5
  507. data/tracks/javascript/exercises/twelve-days/package.json +0 -69
  508. data/tracks/kotlin/exercises/hello-world/GETTING_STARTED.md +0 -50
@@ -0,0 +1,9 @@
1
+ (defpackage #:hello-world
2
+ (:use #:common-lisp)
3
+ (:export #:hello-world)
4
+ (:nicknames #:hw))
5
+
6
+ (in-package #:hello-world)
7
+
8
+ (defun hello-world (&optional name)
9
+ (format nil "Hello ~A!" (or name "World")))
@@ -0,0 +1,21 @@
1
+ (ql:quickload "lisp-unit")
2
+ #-xlisp-test (load "hello-world")
3
+
4
+ (defpackage #:hello-world-test
5
+ (:use #:common-lisp #:lisp-unit))
6
+
7
+ (in-package #:hello-world-test)
8
+
9
+ (define-test hello-world-test
10
+ (assert-equal "Hello World!" (hw:hello-world)))
11
+
12
+ (define-test hello-alice-test
13
+ (assert-equal "Hello Alice!" (hw:hello-world "Alice")))
14
+
15
+ (define-test hello-bob-test
16
+ (assert-equal "Hello Bob!" (hw:hello-world "Bob")))
17
+
18
+ #-xlisp-test
19
+ (let ((*print-errors* t)
20
+ (*print-failures* t))
21
+ (run-tests :all))
@@ -0,0 +1,6 @@
1
+ (defpackage #:hello-world
2
+ (:use #:common-lisp)
3
+ (:export #:hello-world)
4
+ (:nicknames #:hw))
5
+
6
+ (in-package #:hello-world)
@@ -0,0 +1,72 @@
1
+ # Perfect numbers
2
+
3
+ Determine if a number is perfect, abundant, or deficient based on
4
+ Nicomachus' (60 - 120 CE) classification scheme for natural numbers.
5
+
6
+ The Greek mathematician [Nicomachus](https://en.wikipedia.org/wiki/Nicomachus) devised a classification scheme for natural numbers, identifying each as belonging uniquely to the categories of **perfect**, **abundant**, or **deficient** based on their [aliquot sum](https://en.wikipedia.org/wiki/Aliquot_sum). The aliquot sum is defined as the sum of the factors of a number not including the number itself. For example, the aliquot sum of 15 is (1 + 3 + 5) = 9
7
+
8
+ - **Perfect**: aliquot sum = number
9
+ - 6 is a perfect number because (1 + 2 + 3) = 6
10
+ - 28 is a perfect number because (1 + 2 + 4 + 7 + 14) = 28
11
+ - **Abundant**: aliquot sum > number
12
+ - 12 is an abundant number because (1 + 2 + 3 + 4 + 6) = 16
13
+ - 24 is an abundant number because (1 + 2 + 3 + 4 + 6 + 8 + 12) = 36
14
+ - **Deficient**: aliquot sum < number
15
+ - 8 is a deficient number because (1 + 2 + 4) = 7
16
+ - Prime numbers are deficient
17
+
18
+ Implement a way to determine whether a given number is **perfect**. Depending on your language track, you may also need to implement a way to determine whether a given number is **abundant** or **deficient**.
19
+
20
+ ## Setup
21
+
22
+ Check out [Exercism Help](http://exercism.io/languages/lisp) for instructions to
23
+ get started writing Common Lisp. That page will explain how to install and setup
24
+ a Lisp implementation and how to run the tests.
25
+
26
+ ## Formatting
27
+
28
+ While Common Lisp doesn't care about indentation and layout of code,
29
+ nor whether you use spaces or tabs, this is an important consideration
30
+ for submissions to exercism.io. Excercism.io's code widget cannot
31
+ handle mixing of tab and space characters well so using only spaces is recommended to make
32
+ the code more readable to the human reviewers. Please review your
33
+ editors settings on how to accomplish this. Below are instructions for
34
+ popular editors for Common Lisp.
35
+
36
+ ### VIM
37
+
38
+ Use the following commands to ensure VIM uses only spaces for
39
+ indentation:
40
+
41
+ ```vimscript
42
+ :set tabstop=2
43
+ :set shiftwidth=2
44
+ :set expandtab
45
+ ```
46
+
47
+ (or as a oneliner `:set tabstop=2 shiftwidth=2 expandtab`). This can
48
+ be added to your `~/.vimrc` file to use it all the time.
49
+
50
+ ### Emacs
51
+
52
+ Emacs is very well suited for editing Common Lisp and has many
53
+ powerful add-on packages available. The only thing that one needs to
54
+ do with a stock emacs to make it work well with exercism.io is to
55
+ evaluate the following code:
56
+
57
+ `(setq indent-tab-mode nil)`
58
+
59
+ This can be placed in your `~/.emacs` (or `~/.emacs.d/init.el`) in
60
+ order to have it set whenever Emacs is launched.
61
+
62
+ One suggested add-on for Emacs and Common Lisp is
63
+ [SLIME](https://github.com/slime/slime) which offers tight integration
64
+ with the REPL; making iterative coding and testing very easy.
65
+
66
+
67
+ ## Source
68
+ Taken from Chapter 2 of Functional Thinking by Neal Ford.
69
+ [http://shop.oreilly.com/product/0636920029687.do](http://shop.oreilly.com/product/0636920029687.do)
70
+
71
+ ## Submitting Incomplete Solutions
72
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,17 @@
1
+ (defpackage #:perfect-numbers
2
+ (:use #:common-lisp)
3
+ (:export #:classify))
4
+
5
+ (in-package #:perfect-numbers)
6
+
7
+ (defun divisors (n)
8
+ (remove-if-not (lambda (x) (= 0 (rem n x)))
9
+ (loop for x from 1 to (floor n 2) collect x)))
10
+
11
+ (defun classify (n)
12
+ (if (> n 0)
13
+ (let ((div-sum (reduce #'+ (divisors n))))
14
+ (cond ((= n div-sum) "perfect")
15
+ ((< n div-sum) "abundant")
16
+ (T "deficient")))
17
+ (warn "Just defined for natural numbers")))
@@ -0,0 +1,56 @@
1
+ (ql:quickload "lisp-unit")
2
+ #-xlisp-test (load "perfect-numbers")
3
+
4
+ (defpackage #:perfect-numbers-test
5
+ (:use #:common-lisp #:lisp-unit))
6
+
7
+ (in-package #:perfect-numbers-test)
8
+
9
+
10
+ ;; Perfect numbers tests:
11
+ (define-test smallest-perfect-number
12
+ (assert-equal "perfect" (perfect-numbers:classify 6)))
13
+
14
+ (define-test medium-perfect-number
15
+ (assert-equal "perfect" (perfect-numbers:classify 28)))
16
+
17
+ (define-test large-perfect-number
18
+ (assert-equal "perfect" (perfect-numbers:classify 33550336)))
19
+
20
+
21
+ ;; Abundant numbers tests:
22
+ (define-test smallest-abundant-number
23
+ (assert-equal "abundant" (perfect-numbers:classify 12)))
24
+
25
+ (define-test medium-abundant-number
26
+ (assert-equal "abundant" (perfect-numbers:classify 30)))
27
+
28
+ (define-test large-abundant-number
29
+ (assert-equal "abundant" (perfect-numbers:classify 33550335)))
30
+
31
+
32
+ ;; Deficient numbers tests:
33
+ (define-test smallest-prime-deficient-number
34
+ (assert-equal "deficient" (perfect-numbers:classify 2)))
35
+
36
+ (define-test smallest-non-prime-deficient-number
37
+ (assert-equal "deficient" (perfect-numbers:classify 1)))
38
+
39
+ (define-test medium-deficient-number
40
+ (assert-equal "deficient" (perfect-numbers:classify 32)))
41
+
42
+ (define-test large-deficient-number
43
+ (assert-equal "deficient" (perfect-numbers:classify 33550337)))
44
+
45
+
46
+ ;; Undefined values of classify tests:
47
+ (define-test undefinded-0
48
+ (assert-equal NIL (perfect-numbers:classify 0)))
49
+
50
+ (define-test undefined-negative
51
+ (assert-equal NIL (perfect-numbers:classify -3)))
52
+
53
+ #-xlisp-test
54
+ (let ((*print-errors* t)
55
+ (*print-failures* t))
56
+ (run-tests :all))
@@ -0,0 +1,7 @@
1
+ (defpackage #:perfect-numbers
2
+ (:use #:common-lisp)
3
+ (:export #:classify))
4
+
5
+ (in-package #:perfect-numbers)
6
+
7
+ (defun classify (n))
@@ -1,19 +1,39 @@
1
- ---
2
1
  dist: trusty
3
- sudo: required
2
+ sudo: false
4
3
  language: cpp
5
- compiler:
6
- - gcc
7
- - clang
4
+
5
+ matrix:
6
+ include:
7
+ # GCC 4.9
8
+ - os: linux
9
+ addons:
10
+ apt:
11
+ sources:
12
+ - ubuntu-toolchain-r-test
13
+ packages:
14
+ - g++-4.9
15
+ env: MATRIX_EVAL="CC=gcc-4.9 && CXX=g++-4.9"
16
+
17
+ # Clang 3.8
18
+ - os: linux
19
+ addons:
20
+ apt:
21
+ sources:
22
+ - ubuntu-toolchain-r-test
23
+ - llvm-toolchain-precise-3.8
24
+ packages:
25
+ - clang-3.8
26
+ env: MATRIX_EVAL="CC=clang-3.8 && CXX=clang++-3.8"
27
+
8
28
  before_install:
9
- - sudo add-apt-repository -y ppa:samuel-bachmann/boost
10
- - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
11
- - sudo apt-get -qq -d update
29
+ - sudo add-apt-repository -y ppa:samuel-bachmann/boost
30
+ - sudo apt-get -y -d update
31
+ - eval "${MATRIX_EVAL}"
12
32
  install:
13
- - sudo apt-get -qq install boost1.60 cmake g++-4.8
14
- - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90
33
+ - sudo apt-get -y install libboost-regex1.60-dev libboost-test1.60-dev libboost-date-time1.60-dev
15
34
  script:
16
- - bin/fetch-configlet
17
- - bin/configlet lint .
18
- - cmake -G "Unix Makefiles"
19
- - make
35
+ - bin/fetch-configlet
36
+ - bin/configlet lint .
37
+ - cmake -G "Unix Makefiles"
38
+ - make
39
+
@@ -14,42 +14,33 @@ as separate command-line tools.
14
14
 
15
15
  ### Prerequisite: A Modern C++11 Compiler
16
16
 
17
- This language track assumes [C++11](http://en.wikipedia.org/wiki/C%2B%2B11),
18
- the latest version of the ISO C++ standard that is
19
- [widely supported](http://en.cppreference.com/w/cpp/compiler_support) on all
20
- major platforms (Linux, Windows and MacOS).
21
- [C++14](http://en.wikipedia.org/wiki/C%2B%2B14) has been recently ratified
22
- as the most recent version of the ISO standard. The language track will
23
- be updated to C++14 once support is sufficiently mature in the development
24
- environments across all major platforms.
25
-
26
- Free compilers exist for C++11 on all major platforms, although the version
27
- of the C++ compiler installed on your system may be an older version that
28
- doesn't fully support C++11. A comparison chart of
29
- [C++ compiler support](http://en.cppreference.com/w/cpp/compiler_support)
30
- and related [discussion](http://en.cppreference.com/w/Talk:cpp/compiler_support)
31
- shows that most of the major features of C++11 are available on all major
32
- platforms.
17
+ This language track requires a compiler with [C++11](http://en.wikipedia.org/wiki/C%2B%2B11)
18
+ support, which was release in 2011. All major compilers released in the last few years should
19
+ be compatible, so as long as you are on a fairly recent version you should be fine.
20
+ Specifically, GCC version 5.1 or later, Clang version 3.8 or later, or Visual
21
+ Studio 2015 or later.
33
22
 
34
23
  #### Linux
35
24
 
36
- Linux users will need gcc 4.8 or later or clang 3.4 or later for the compiler
37
- and `make` will be needed for the native build. Make is pre-installed on most
38
- unix systems, but is available via `sudo apt-get install make` if not present.
39
- Gcc 4.8 supports C++11 with the `-std=c++11` argument and can be installed and
40
- set as the default compiler with the following recipe:
25
+ Ubuntu 16.04 and later have compatible compilers in the package manager, so
26
+ installing the necessary compiler can be done with `sudo apt-get install gcc`.
27
+ If you're on an older version of Ubuntu, you should be able to install a newer
28
+ GCC version using the following:
41
29
 
42
30
  ```bash
43
31
  $ sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
44
32
  $ sudo apt-get -qq -d update
45
- $ sudo apt-get -qq install g++-4.8
46
- $ # make g++ 4.8 the default g++ executable
47
- $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90
33
+ $ sudo apt-get -qq install g++-5
34
+ $ # make g++ 5 the default g++ executable
35
+ $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 90
48
36
  ```
49
37
 
38
+ For other distributions, you should be able to acquire the compiler through your
39
+ package manager.
40
+
50
41
  #### MacOS
51
42
 
52
- MacOS users can install gcc 4.8 with [Homebrew](http://brew.sh/) via
43
+ MacOS users can install GCC with [Homebrew](http://brew.sh/) via
53
44
  `brew install gcc`.
54
45
 
55
46
  #### Windows
@@ -87,9 +78,7 @@ improve the CMake support.
87
78
 
88
79
  The unit tests use Boost.Test, the unit testing framework included with
89
80
  [Boost](http://www.boost.org/index.html). You may find other libraries
90
- in Boost useful to you as you work through the exercises. In particular,
91
- gcc 4.8 does not have a proper implementation of the standard regular
92
- expression library, but you can find a compatible library in Boost.
81
+ in Boost useful to you as you work through the exercises.
93
82
  You will need to download and install Boost. As of this writing Boost
94
83
  1.59+ is the required version. You will need a compiled version of the
95
84
  boost libraries Boost.Test, Boost.DateTime and Boost.Regex, or you will
@@ -52,7 +52,7 @@ Once the build environment has been created by CMake, you can build your
52
52
  code using the appropriate command for your environment:
53
53
 
54
54
  * Linux with make: `make`
55
- * Windows with Visual Studio 2013: Select Build / Build Solution from the menu.
55
+ * Windows with Visual Studio: Select Build / Build Solution from the menu.
56
56
  * MacOS with Xcode: Select Build from the toolbar
57
57
 
58
58
  Examples of running CMake for different environments are shown below.
@@ -77,36 +77,32 @@ Simply type make in the build directory to compile the tests. This should
77
77
  generate compile time errors. Once the errors are fixed make will build and
78
78
  run the tests.
79
79
 
80
- #### Windows with Visual Studio 2013
80
+ #### Windows with Visual Studio 2017
81
81
 
82
- The generator name for CMake is `Visual Studio 12`. The same generator
83
- supports all editions of Visual Studio 2013: Express, Professional,
84
- Ultimate, etc.
85
- Assuming the current exercise is `bob` and we're in the exercise folder:
82
+ The generator name for CMake is `Visual Studio 15`. The same generator
83
+ supports all IDE editions of Visual Studio 2017: Community, Professional,
84
+ and Enterprise. Assuming the current exercise is `bob` and we're in the
85
+ exercise folder:
86
86
 
87
87
  ```
88
88
  > copy nul: bob.h
89
89
  > copy nul: bob.cpp
90
90
  > mkdir build
91
91
  > cd build
92
- > cmake -G "Visual Studio 12" ..
92
+ > cmake -G "Visual Studio 15" ..
93
93
  ```
94
94
 
95
95
  This example shows creating empty files for the implementation before
96
96
  running CMake.
97
97
 
98
- On Linux and MacOS boost packages install the headers and libraries to
99
- a standard global location on the system. On Windows, you unpack the
100
- binaries wherever you like or build from source wherever you like and
101
- there is no standard install location on the system.
102
-
103
- If you get complaints from CMake about not being able to find Boost, you
98
+ If you installed boost to the default location, Cmake may be able to
99
+ find it for you automatically. If it can't find it, you will need to
104
100
  need to supply additional arguments to tell CMake where to find it by
105
101
  setting the `BOOST_INCLUDEDIR` variable on the command-line. Here is an
106
- example using the Visual Studio 2013 generator:
102
+ example using the Visual Studio 2017 generator:
107
103
 
108
104
  ```
109
- > cmake -G "Visual Studio 12" -DBOOST_INCLUDEDIR:PATH=D:/Code/boost/boost_1_59_0 ..
105
+ > cmake -G "Visual Studio 15" -DBOOST_INCLUDEDIR:PATH=D:/Code/boost/boost_1_59_0 ..
110
106
  ```
111
107
 
112
108
  **Note:** Path locations passed to CMake always use slash (`/`) as the
@@ -129,10 +125,6 @@ running CMake.
129
125
 
130
126
  ## Boost.Test Documentation
131
127
 
132
- The Boost.Test documentation is being rewritten to improve usability
133
- and is nearly complete.
134
- Prefer the documentation rewrite to look up something if you're unfamiliar
135
- with Boost.Test and want to know more.
128
+ If you need to consult the Boost.Test documentation you can find it here:
136
129
 
137
- * [Boost.Test documentation rewrite](http://user.xmission.com/~legalize/boost.test/)
138
- * [Boost.Test 1.55 official documentation](http://www.boost.org/doc/libs/1_55_0/libs/test/doc/html/index.html)
130
+ * [Boost.Test 1.59 official documentation](http://www.boost.org/doc/libs/1_59_0/libs/test/doc/html/index.html)
@@ -73,6 +73,16 @@
73
73
 
74
74
  ]
75
75
  },
76
+ {
77
+ "uuid": "64f8e403-9a3d-4094-9114-f1bee88c072b",
78
+ "slug": "triangle",
79
+ "core": false,
80
+ "unlocked_by": null,
81
+ "difficulty": 1,
82
+ "topics": [
83
+
84
+ ]
85
+ },
76
86
  {
77
87
  "uuid": "19298c02-b34f-4f11-aad6-5da4838967a0",
78
88
  "slug": "difference-of-squares",
@@ -0,0 +1,60 @@
1
+ require "spec"
2
+ require "../src/*"
3
+
4
+ describe "Triangle" do
5
+ it "true if all sides are equal" do
6
+ Triangle.new([2, 2, 2]).equilateral?.should eq(true)
7
+ end
8
+
9
+ pending "false if any side is unequal" do
10
+ Triangle.new([2, 3, 2]).equilateral?.should eq(false)
11
+ end
12
+
13
+ pending "false if no sides are equal" do
14
+ Triangle.new([5, 4, 6]).equilateral?.should eq(false)
15
+ end
16
+
17
+ pending "All zero sides are illegal, so the triangle is not equilateral" do
18
+ Triangle.new([0, 0, 0]).equilateral?.should eq(false)
19
+ end
20
+
21
+ pending "true if last two sides are equal" do
22
+ Triangle.new([3, 4, 4]).isosceles?.should eq(true)
23
+ end
24
+
25
+ pending "true if first two sides are equal" do
26
+ Triangle.new([4, 4, 3]).isosceles?.should eq(true)
27
+ end
28
+
29
+ pending "true if first and last sides are equal" do
30
+ Triangle.new([4, 3, 4]).isosceles?.should eq(true)
31
+ end
32
+
33
+ pending "equilateral triangles are also isosceles" do
34
+ Triangle.new([4, 4, 4]).isosceles?.should eq(true)
35
+ end
36
+
37
+ pending "false if no sides are equal" do
38
+ Triangle.new([2, 3, 4]).isosceles?.should eq(false)
39
+ end
40
+
41
+ pending "Sides that violate triangle inequality are not isosceles, even if two are equal" do
42
+ Triangle.new([1, 1, 3]).isosceles?.should eq(false)
43
+ end
44
+
45
+ pending "true if no sides are equal" do
46
+ Triangle.new([5, 4, 6]).scalene?.should eq(true)
47
+ end
48
+
49
+ pending "false if all sides are equal" do
50
+ Triangle.new([4, 4, 4]).scalene?.should eq(false)
51
+ end
52
+
53
+ pending "false if two sides are equal" do
54
+ Triangle.new([4, 4, 3]).scalene?.should eq(false)
55
+ end
56
+
57
+ pending "Sides that violate triangle inequality are not scalene, even if they are all different" do
58
+ Triangle.new([7, 3, 2]).scalene?.should eq(false)
59
+ end
60
+ end