trackler 2.0.6.11 → 2.0.6.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. checksums.yaml +4 -4
  2. data/common/CONTRIBUTING.md +6 -1
  3. data/common/exercises/difference-of-squares/metadata.yml +1 -1
  4. data/common/exercises/luhn/canonical-data.json +2 -2
  5. data/common/exercises/rectangles/canonical-data.json +25 -0
  6. data/common/exercises/rectangles/description.md +11 -3
  7. data/lib/trackler/version.rb +1 -1
  8. data/tracks/ceylon/config.json +9 -0
  9. data/tracks/ceylon/exercises/anagram/source/anagram/AnagramTest.ceylon +38 -39
  10. data/tracks/ceylon/exercises/bracket-push/source/bracketpush/BracketsTest.ceylon +28 -29
  11. data/tracks/ceylon/exercises/largest-series-product/example/Series.ceylon +13 -0
  12. data/tracks/ceylon/exercises/largest-series-product/source/largestseriesproduct/Series.ceylon +5 -0
  13. data/tracks/ceylon/exercises/largest-series-product/source/largestseriesproduct/SeriesTest.ceylon +30 -0
  14. data/tracks/ceylon/exercises/largest-series-product/source/largestseriesproduct/module.ceylon +3 -0
  15. data/tracks/csharp/config.json +41 -0
  16. data/tracks/csharp/exercises/alphametics/AlphameticsTest.cs +122 -0
  17. data/tracks/csharp/exercises/alphametics/Example.cs +139 -0
  18. data/tracks/csharp/exercises/dot-dsl/DotDslTest.cs +91 -0
  19. data/tracks/csharp/exercises/dot-dsl/Example.cs +90 -0
  20. data/tracks/csharp/exercises/dot-dsl/HINTS.md +2 -0
  21. data/tracks/csharp/exercises/error-handling/ErrorHandlingTest.cs +65 -0
  22. data/tracks/csharp/exercises/error-handling/Example.cs +34 -0
  23. data/tracks/csharp/exercises/exercises.csproj +1 -1
  24. data/tracks/csharp/exercises/hangman/Example.cs +85 -0
  25. data/tracks/csharp/exercises/hangman/HangmanTest.cs +140 -0
  26. data/tracks/csharp/exercises/ledger/Example.cs +106 -0
  27. data/tracks/csharp/exercises/ledger/Ledger.cs +166 -0
  28. data/tracks/csharp/exercises/ledger/LedgerTest.cs +168 -0
  29. data/tracks/elixir/exercises/allergies/allergies_test.exs +2 -2
  30. data/tracks/elixir/exercises/markdown/example.exs +3 -3
  31. data/tracks/elixir/exercises/phone-number/example.exs +0 -2
  32. data/tracks/elixir/exercises/queen-attack/example.exs +1 -1
  33. data/tracks/elixir/exercises/wordy/example.exs +6 -6
  34. data/tracks/elixir/exercises/zipper/zipper_test.exs +12 -12
  35. data/tracks/elixir/mix.exs +1 -1
  36. data/tracks/fsharp/config.json +8 -8
  37. data/tracks/fsharp/docs/ABOUT.md +4 -0
  38. data/tracks/fsharp/exercises/alphametics/AlphameticsTest.fs +33 -13
  39. data/tracks/fsharp/exercises/alphametics/Example.fs +29 -64
  40. data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTreeTest.fs +14 -14
  41. data/tracks/fsharp/exercises/binary-search-tree/Example.fs +17 -14
  42. data/tracks/fsharp/exercises/triangle/TriangleTest.fs +0 -5
  43. data/tracks/go/README.md +3 -3
  44. data/tracks/go/config.json +10 -3
  45. data/tracks/go/exercises/acronym/acronym.go +5 -0
  46. data/tracks/go/exercises/bob/example_gen.go +1 -1
  47. data/tracks/go/exercises/clock/example_gen.go +1 -1
  48. data/tracks/go/exercises/connect/example_gen.go +1 -1
  49. data/tracks/go/exercises/custom-set/example_gen.go +1 -1
  50. data/tracks/go/exercises/gigasecond/example_gen.go +1 -1
  51. data/tracks/go/exercises/hamming/example_gen.go +1 -1
  52. data/tracks/go/exercises/largest-series-product/example_gen.go +1 -1
  53. data/tracks/go/exercises/leap/cases_test.go +5 -7
  54. data/tracks/go/exercises/leap/example.go +1 -1
  55. data/tracks/go/exercises/leap/example_gen.go +1 -1
  56. data/tracks/go/exercises/leap/leap.go +1 -1
  57. data/tracks/go/exercises/leap/leap_test.go +1 -1
  58. data/tracks/go/exercises/meetup/example_gen.go +1 -1
  59. data/tracks/go/exercises/nucleotide-count/nucleotide_count_test.go +0 -5
  60. data/tracks/go/exercises/pangram/pangram.go +5 -0
  61. data/tracks/go/exercises/raindrops/example_gen.go +1 -1
  62. data/tracks/go/exercises/rna-transcription/example_gen.go +1 -1
  63. data/tracks/go/exercises/roman-numerals/example_gen.go +1 -1
  64. data/tracks/go/exercises/word-count/example_gen.go +1 -1
  65. data/tracks/go/gen/gen.go +3 -2
  66. data/tracks/haskell/exercises/accumulate/src/Accumulate.hs +1 -1
  67. data/tracks/haskell/exercises/all-your-base/src/Base.hs +1 -1
  68. data/tracks/haskell/exercises/allergies/src/Allergies.hs +2 -2
  69. data/tracks/haskell/exercises/alphametics/src/Alphametics.hs +1 -1
  70. data/tracks/haskell/exercises/anagram/src/Anagram.hs +1 -1
  71. data/tracks/haskell/exercises/atbash-cipher/src/Atbash.hs +2 -2
  72. data/tracks/haskell/exercises/bank-account/src/BankAccount.hs +4 -4
  73. data/tracks/haskell/exercises/binary/src/Binary.hs +1 -1
  74. data/tracks/haskell/exercises/binary-search-tree/src/BST.hs +8 -8
  75. data/tracks/haskell/exercises/bob/src/Bob.hs +1 -1
  76. data/tracks/haskell/exercises/bowling/src/Bowling.hs +1 -1
  77. data/tracks/haskell/exercises/change/src/Change.hs +1 -1
  78. data/tracks/haskell/exercises/clock/src/Clock.hs +4 -4
  79. data/tracks/haskell/exercises/connect/src/Connect.hs +1 -1
  80. data/tracks/haskell/exercises/crypto-square/src/CryptoSquare.hs +1 -1
  81. data/tracks/haskell/exercises/custom-set/src/CustomSet.hs +13 -13
  82. data/tracks/haskell/exercises/difference-of-squares/src/Squares.hs +3 -3
  83. data/tracks/haskell/exercises/dominoes/src/Dominoes.hs +1 -1
  84. data/tracks/haskell/exercises/etl/src/ETL.hs +1 -1
  85. data/tracks/haskell/exercises/forth/src/Forth.hs +3 -3
  86. data/tracks/haskell/exercises/gigasecond/src/Gigasecond.hs +1 -1
  87. data/tracks/haskell/exercises/go-counting/src/Counting.hs +2 -2
  88. data/tracks/haskell/exercises/grade-school/src/School.hs +4 -4
  89. data/tracks/haskell/exercises/grains/src/Grains.hs +2 -2
  90. data/tracks/haskell/exercises/hamming/src/Hamming.hs +1 -1
  91. data/tracks/haskell/exercises/hexadecimal/src/Hexadecimal.hs +1 -1
  92. data/tracks/haskell/exercises/kindergarten-garden/src/Garden.hs +3 -3
  93. data/tracks/haskell/exercises/largest-series-product/src/Series.hs +1 -1
  94. data/tracks/haskell/exercises/leap/src/LeapYear.hs +1 -1
  95. data/tracks/haskell/exercises/lens-person/src/Person.hs +4 -4
  96. data/tracks/haskell/exercises/linked-list/src/Deque.hs +5 -5
  97. data/tracks/haskell/exercises/list-ops/src/ListOps.hs +8 -8
  98. data/tracks/haskell/exercises/luhn/src/Luhn.hs +5 -5
  99. data/tracks/haskell/exercises/matrix/src/Matrix.hs +10 -10
  100. data/tracks/haskell/exercises/meetup/src/Meetup.hs +1 -1
  101. data/tracks/haskell/exercises/minesweeper/src/Minesweeper.hs +1 -1
  102. data/tracks/haskell/exercises/nth-prime/src/Prime.hs +1 -1
  103. data/tracks/haskell/exercises/nucleotide-count/src/DNA.hs +2 -2
  104. data/tracks/haskell/exercises/ocr-numbers/src/OCR.hs +1 -1
  105. data/tracks/haskell/exercises/octal/src/Octal.hs +2 -2
  106. data/tracks/haskell/exercises/palindrome-products/src/Palindromes.hs +2 -2
  107. data/tracks/haskell/exercises/parallel-letter-frequency/src/Frequency.hs +1 -1
  108. data/tracks/haskell/exercises/pascals-triangle/src/Triangle.hs +1 -1
  109. data/tracks/haskell/exercises/phone-number/src/Phone.hs +3 -3
  110. data/tracks/haskell/exercises/pig-latin/src/PigLatin.hs +1 -1
  111. data/tracks/haskell/exercises/pov/src/POV.hs +2 -2
  112. data/tracks/haskell/exercises/prime-factors/src/PrimeFactors.hs +1 -1
  113. data/tracks/haskell/exercises/pythagorean-triplet/src/Triplet.hs +3 -3
  114. data/tracks/haskell/exercises/queen-attack/src/Queens.hs +2 -2
  115. data/tracks/haskell/exercises/raindrops/src/Raindrops.hs +1 -1
  116. data/tracks/haskell/exercises/rna-transcription/src/DNA.hs +1 -1
  117. data/tracks/haskell/exercises/robot-name/src/Robot.hs +3 -3
  118. data/tracks/haskell/exercises/robot-simulator/src/Robot.hs +6 -6
  119. data/tracks/haskell/exercises/roman-numerals/src/Roman.hs +1 -1
  120. data/tracks/haskell/exercises/run-length-encoding/src/RunLength.hs +2 -2
  121. data/tracks/haskell/exercises/saddle-points/src/Matrix.hs +1 -1
  122. data/tracks/haskell/exercises/say/src/Say.hs +1 -1
  123. data/tracks/haskell/exercises/scrabble-score/src/Scrabble.hs +2 -2
  124. data/tracks/haskell/exercises/secret-handshake/src/SecretHandshake.hs +1 -1
  125. data/tracks/haskell/exercises/series/src/Series.hs +1 -1
  126. data/tracks/haskell/exercises/sgf-parsing/src/Sgf.hs +1 -1
  127. data/tracks/haskell/exercises/sieve/src/Sieve.hs +1 -1
  128. data/tracks/haskell/exercises/simple-cipher/src/Cipher.hs +3 -3
  129. data/tracks/haskell/exercises/simple-linked-list/src/LinkedList.hs +8 -8
  130. data/tracks/haskell/exercises/space-age/src/SpaceAge.hs +1 -1
  131. data/tracks/haskell/exercises/strain/src/Strain.hs +2 -2
  132. data/tracks/haskell/exercises/sublist/src/Sublist.hs +1 -1
  133. data/tracks/haskell/exercises/sum-of-multiples/src/SumOfMultiples.hs +1 -1
  134. data/tracks/haskell/exercises/triangle/src/Triangle.hs +1 -1
  135. data/tracks/haskell/exercises/trinary/src/Trinary.hs +2 -2
  136. data/tracks/haskell/exercises/word-count/src/WordCount.hs +1 -1
  137. data/tracks/haskell/exercises/wordy/src/WordProblem.hs +1 -1
  138. data/tracks/haskell/exercises/zebra-puzzle/src/ZebraPuzzle.hs +1 -1
  139. data/tracks/haskell/exercises/zipper/src/Zipper.hs +9 -9
  140. data/tracks/java/docs/MAINTAINING.md +48 -0
  141. data/tracks/java/exercises/queen-attack/src/test/java/QueenAttackCalculatorTest.java +51 -51
  142. data/tracks/kotlin/exercises/etl/src/example/kotlin/ETL.kt +1 -1
  143. data/tracks/kotlin/exercises/etl/src/test/kotlin/ETLTest.kt +19 -19
  144. data/tracks/kotlin/exercises/pangram/src/test/kotlin/PangramTest.kt +5 -0
  145. data/tracks/lisp/docs/ABOUT.md +9 -0
  146. data/tracks/lua/exercises/transpose/example.lua +1 -1
  147. data/tracks/lua/exercises/transpose/transpose_spec.lua +16 -0
  148. data/tracks/pascal/config.json +36 -36
  149. data/tracks/pascal/exercises/bob/uBobTests.pas +0 -1
  150. data/tracks/pascal/exercises/hamming/uHammingTests.pas +0 -1
  151. data/tracks/pascal/exercises/leap/uLeapTests.pas +0 -1
  152. data/tracks/pascal/exercises/saddle-points/uSaddlePointsExample.pas +11 -0
  153. data/tracks/pascal/exercises/saddle-points/uSaddlePointsTests.pas +9 -1
  154. data/tracks/perl6/exercises/atbash-cipher/cipher.t +1 -1
  155. data/tracks/php/config.json +7 -0
  156. data/tracks/php/exercises/robot-simulator/example.php +148 -0
  157. data/tracks/php/exercises/robot-simulator/robot-simulator_test.php +168 -0
  158. data/tracks/pony/config.json +16 -7
  159. data/tracks/pony/exercises/roman-numerals/example.pony +35 -0
  160. data/tracks/pony/exercises/roman-numerals/test.pony +45 -0
  161. data/tracks/python/requirements-travis.txt +1 -1
  162. data/tracks/ruby/.rubocop.yml +1 -1
  163. data/tracks/ruby/bin/enable-executable +1 -1
  164. data/tracks/ruby/bin/executable-tests-check +1 -1
  165. data/tracks/ruby/exercises/acronym/example.tt +2 -3
  166. data/tracks/ruby/exercises/all-your-base/example.tt +2 -2
  167. data/tracks/ruby/exercises/alphametics/example.tt +2 -2
  168. data/tracks/ruby/exercises/anagram/example.tt +2 -3
  169. data/tracks/ruby/exercises/binary/example.tt +2 -3
  170. data/tracks/ruby/exercises/bowling/example.tt +2 -3
  171. data/tracks/ruby/exercises/bracket-push/example.tt +2 -3
  172. data/tracks/ruby/exercises/clock/example.tt +2 -3
  173. data/tracks/ruby/exercises/connect/example.rb +1 -1
  174. data/tracks/ruby/exercises/connect/example.tt +1 -1
  175. data/tracks/ruby/exercises/custom-set/example.tt +2 -3
  176. data/tracks/ruby/exercises/diamond/example.rb +1 -1
  177. data/tracks/ruby/exercises/difference-of-squares/example.tt +2 -3
  178. data/tracks/ruby/exercises/dominoes/example.tt +2 -2
  179. data/tracks/ruby/exercises/gigasecond/example.tt +2 -3
  180. data/tracks/ruby/exercises/grains/example.tt +2 -2
  181. data/tracks/ruby/exercises/hamming/example.tt +2 -3
  182. data/tracks/ruby/exercises/hello-world/example.tt +1 -2
  183. data/tracks/ruby/exercises/isogram/example.tt +2 -2
  184. data/tracks/ruby/exercises/largest-series-product/example.tt +2 -4
  185. data/tracks/ruby/exercises/leap/example.tt +2 -3
  186. data/tracks/ruby/exercises/nth-prime/example.tt +2 -4
  187. data/tracks/ruby/exercises/pangram/example.tt +2 -2
  188. data/tracks/ruby/exercises/queen-attack/example.tt +2 -3
  189. data/tracks/ruby/exercises/raindrops/example.tt +2 -3
  190. data/tracks/ruby/exercises/rna-transcription/example.tt +2 -3
  191. data/tracks/ruby/exercises/roman-numerals/example.tt +2 -3
  192. data/tracks/ruby/exercises/run-length-encoding/example.tt +2 -3
  193. data/tracks/ruby/exercises/sieve/example.tt +2 -4
  194. data/tracks/ruby/exercises/simple-linked-list/simple_linked_list_test.rb +6 -6
  195. data/tracks/ruby/exercises/tournament/example.tt +2 -3
  196. data/tracks/ruby/exercises/transpose/example.tt +2 -3
  197. data/tracks/ruby/exercises/triangle/example.tt +2 -3
  198. data/tracks/ruby/exercises/two-bucket/example.tt +2 -3
  199. data/tracks/ruby/exercises/word-count/example.tt +2 -3
  200. data/tracks/ruby/exercises/wordy/example.tt +2 -2
  201. data/tracks/ruby/lib/acronym_cases.rb +2 -0
  202. data/tracks/ruby/lib/all_your_base_cases.rb +3 -1
  203. data/tracks/ruby/lib/alphametics_cases.rb +6 -4
  204. data/tracks/ruby/lib/anagram_cases.rb +2 -0
  205. data/tracks/ruby/lib/binary_cases.rb +2 -0
  206. data/tracks/ruby/lib/bowling_cases.rb +2 -0
  207. data/tracks/ruby/lib/bracket_push_cases.rb +2 -0
  208. data/tracks/ruby/lib/clock_cases.rb +2 -0
  209. data/tracks/ruby/lib/connect_cases.rb +2 -0
  210. data/tracks/ruby/lib/custom_set_cases.rb +2 -0
  211. data/tracks/ruby/lib/difference_of_squares_cases.rb +2 -0
  212. data/tracks/ruby/lib/dominoes_cases.rb +2 -0
  213. data/tracks/ruby/lib/exercise_cases.rb +2 -0
  214. data/tracks/ruby/lib/generator/files/track_files.rb +3 -3
  215. data/tracks/ruby/lib/generator/files.rb +1 -1
  216. data/tracks/ruby/lib/generator/template_values.rb +5 -14
  217. data/tracks/ruby/lib/gigasecond_cases.rb +2 -0
  218. data/tracks/ruby/lib/grains_cases.rb +3 -1
  219. data/tracks/ruby/lib/hamming_cases.rb +2 -0
  220. data/tracks/ruby/lib/hello_world_cases.rb +2 -0
  221. data/tracks/ruby/lib/isogram_cases.rb +3 -1
  222. data/tracks/ruby/lib/largest_series_product_cases.rb +2 -0
  223. data/tracks/ruby/lib/leap_cases.rb +2 -0
  224. data/tracks/ruby/lib/nth_prime_cases.rb +2 -0
  225. data/tracks/ruby/lib/pangram_cases.rb +3 -1
  226. data/tracks/ruby/lib/queen_attack_cases.rb +2 -0
  227. data/tracks/ruby/lib/raindrops_cases.rb +2 -0
  228. data/tracks/ruby/lib/rna_transcription_cases.rb +2 -0
  229. data/tracks/ruby/lib/roman_numerals_cases.rb +2 -0
  230. data/tracks/ruby/lib/run_length_encoding_cases.rb +2 -0
  231. data/tracks/ruby/lib/sieve_cases.rb +2 -0
  232. data/tracks/ruby/lib/tournament_cases.rb +2 -0
  233. data/tracks/ruby/lib/transpose_cases.rb +2 -0
  234. data/tracks/ruby/lib/triangle_cases.rb +2 -0
  235. data/tracks/ruby/lib/two_bucket_cases.rb +2 -0
  236. data/tracks/ruby/lib/word_count_cases.rb +2 -0
  237. data/tracks/ruby/lib/wordy_cases.rb +2 -0
  238. data/tracks/ruby/test/fixtures/xruby/exercises/alpha/example.tt +2 -2
  239. data/tracks/ruby/test/fixtures/xruby/lib/alpha_cases.rb +1 -1
  240. data/tracks/ruby/test/generator/command_line_test.rb +1 -1
  241. data/tracks/ruby/test/generator/template_values_test.rb +7 -7
  242. data/tracks/rust/.travis.yml +4 -0
  243. data/tracks/rust/_test/check-exercises.sh +11 -2
  244. data/tracks/rust/config.json +9 -0
  245. data/tracks/rust/exercises/luhn/.gitignore +7 -0
  246. data/tracks/rust/exercises/luhn/Cargo.toml +3 -0
  247. data/tracks/rust/exercises/luhn/example.rs +13 -0
  248. data/tracks/rust/exercises/luhn/tests/luhn.rs +38 -0
  249. data/tracks/rust/exercises/parallel-letter-frequency/HINTS.md +32 -0
  250. data/tracks/rust/exercises/parallel-letter-frequency/benches/benchmark.rs +99 -0
  251. data/tracks/scala/config.json +57 -1
  252. data/tracks/scala/exercises/allergies/build.sbt +2 -2
  253. data/tracks/scala/exercises/atbash-cipher/build.sbt +2 -2
  254. data/tracks/scala/exercises/bank-account/build.sbt +3 -2
  255. data/tracks/scala/exercises/binary-search-tree/build.sbt +2 -2
  256. data/tracks/scala/exercises/clock/build.sbt +2 -2
  257. data/tracks/scala/exercises/crypto-square/build.sbt +2 -2
  258. data/tracks/scala/exercises/custom-set/build.sbt +3 -2
  259. data/tracks/scala/exercises/food-chain/build.sbt +3 -2
  260. data/tracks/scala/exercises/house/build.sbt +2 -2
  261. data/tracks/scala/exercises/kindergarten-garden/build.sbt +3 -2
  262. data/tracks/scala/exercises/largest-series-product/build.sbt +2 -2
  263. data/tracks/scala/exercises/linked-list/build.sbt +3 -2
  264. data/tracks/scala/exercises/matrix/build.sbt +2 -2
  265. data/tracks/scala/exercises/minesweeper/build.sbt +2 -2
  266. data/tracks/scala/exercises/nth-prime/build.sbt +2 -2
  267. data/tracks/scala/exercises/ocr-numbers/build.sbt +2 -2
  268. data/tracks/scala/exercises/palindrome-products/build.sbt +2 -2
  269. data/tracks/scala/exercises/prime-factors/build.sbt +3 -2
  270. data/tracks/scala/exercises/queen-attack/build.sbt +2 -2
  271. data/tracks/scala/exercises/raindrops/build.sbt +2 -2
  272. data/tracks/scala/exercises/robot-simulator/build.sbt +2 -2
  273. data/tracks/scala/exercises/triangle/build.sbt +2 -2
  274. data/tracks/scala/exercises/trinary/build.sbt +2 -2
  275. data/tracks/scala/exercises/wordy/build.sbt +3 -3
  276. metadata +33 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 80730bca62f82e148c9c102b1e1c19a0ab33cd53
4
- data.tar.gz: ffa6a9582c1d94ee6e33ed0e2c1bc745b2ebb9cb
3
+ metadata.gz: fa8f1408ac09a98a6c3586666f197c85efa0b7cb
4
+ data.tar.gz: 71653c98fd6b510de72b238db40cdee9ac0ed1d2
5
5
  SHA512:
6
- metadata.gz: 954c5a625d030d2892d93506fc9ad67c0117ad8cfedb037194e2cc8dcf9b4c6da18c6f2bd6c368a1ff1dec99afc61b0e20ad9582e9a00983508f231f47abc951
7
- data.tar.gz: ad66f22ee9eadabfee064cdb40d83743165106f1f1ff080b3c4383eee26215ccec5895c43704940ddf05bd7f3171a0e22f4a5881833d1fe620085bf7af0cca3e
6
+ metadata.gz: 3cceac782125c988061568125f85e50bccdb0da21583c36279a48e0b885b265bc3b47a542dbaf5379844b025a4d54c81e462b4e03cb051e7012471242b0aa0fc
7
+ data.tar.gz: 50ca76ed02285f8230a10d7f5c3b099ce78c18d10aa1bc93726cae239eae45e5a90cb1fbe11707bcf86c4066a9a51726fb235da36ca3469683a25c78ce91d350
@@ -337,7 +337,12 @@ The exercise should consist of, at minimum:
337
337
  * A test suite
338
338
  * A reference solution that passes the test (see [#reference-solution](#reference-solution))
339
339
 
340
- Each language track might have additional requirements; check the README in
340
+ You will need to add the exercise to `"exercises"` section of the `config.json` file in the track.
341
+ The order in which the exercises are listed there is the order in which they are fetched by default by `exercism fetch`.
342
+ Typically, exercises are ordered by difficulty, unless there is a particular reason to do otherwise.
343
+
344
+ Each language track might have additional guidance on how to order their
345
+ exercises or additional requirements on new exercise files; check the README in
341
346
  the repository for the track.
342
347
 
343
348
  ### Providing Feedback on the Site for an Exercise You Implemented
@@ -1,4 +1,4 @@
1
1
  ---
2
- blurb: "Find the difference between the sum of the squares and the square of the sums of the first N natural numbers."
2
+ blurb: "Find the difference between the sum of the squares and the square of the sum of the first N natural numbers."
3
3
  source: "Problem 6 at Project Euler"
4
4
  source_url: "http://projecteuler.net/problem=6"
@@ -26,8 +26,8 @@
26
26
  "expected": false
27
27
  },
28
28
  {
29
- "description": "strings that contain non-digits are not valid",
30
- "input": "827a 1232 7352 0569",
29
+ "description": "valid strings with a non-digit added become invalid",
30
+ "input": "046a 454 286",
31
31
  "expected": false
32
32
  }
33
33
  ]
@@ -50,6 +50,31 @@
50
50
  ],
51
51
  "expected": 5
52
52
  },
53
+ {
54
+ "description": "rectangle of height 1 is counted",
55
+ "input": [
56
+ "+--+",
57
+ "+--+"
58
+ ],
59
+ "expected": 1
60
+ },
61
+ {
62
+ "description": "rectangle of width 1 is counted",
63
+ "input": [
64
+ "++",
65
+ "||",
66
+ "++"
67
+ ],
68
+ "expected": 1
69
+ },
70
+ {
71
+ "description": "1x1 square is counted",
72
+ "input": [
73
+ "++",
74
+ "++"
75
+ ],
76
+ "expected": 1
77
+ },
53
78
  {
54
79
  "description": "only complete rectangles are counted",
55
80
  "input": [
@@ -2,13 +2,13 @@ Create a program to count the rectangles in an ASCII diagram like the one below.
2
2
 
3
3
  ```
4
4
  +--+
5
- | |
6
- +--+--+
5
+ ++ |
6
+ +-++--+
7
7
  | | |
8
8
  +--+--+
9
9
  ```
10
10
 
11
- The above diagram contains 5 rectangles:
11
+ The above diagram contains 6 rectangles:
12
12
 
13
13
  ```
14
14
 
@@ -50,5 +50,13 @@ The above diagram contains 5 rectangles:
50
50
  +--+
51
51
  ```
52
52
 
53
+ ```
54
+
55
+ ++
56
+ ++
57
+
58
+
59
+ ```
60
+
53
61
  You may assume that the input is always a proper rectangle (i.e. the length of
54
62
  every line equals the length of the first line).
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.0.6.11"
2
+ VERSION = "2.0.6.12"
3
3
  end
@@ -27,6 +27,15 @@
27
27
  "Filtering"
28
28
  ]
29
29
  },
30
+ {
31
+ "slug": "largest-series-product",
32
+ "difficulty": 4,
33
+ "topics": [
34
+ "Strings",
35
+ "Integers",
36
+ "Transforming"
37
+ ]
38
+ },
30
39
  {
31
40
  "slug": "bracket-push",
32
41
  "difficulty": 6,
@@ -1,44 +1,43 @@
1
1
  import ceylon.test { ... }
2
2
 
3
- {[String, {String*}, {String*}]*} cases =>
4
- {
5
- // no matches
6
- ["diaper", {"hello", "world", "zombies", "pants"}, {}],
7
- // detects simple anagram
8
- ["ant", {"tan", "stand", "at"}, {"tan"}],
9
- // does not detect false positives
10
- ["galea", {"eagle"}, {}],
11
- // detects multiple anagrams
12
- ["master", {"stream", "pigeon", "maters"}, {"stream", "maters"}],
13
- // does not detect anagram subsets
14
- ["good", {"dog", "goody"}, {}],
15
- // detects anagram
16
- ["listen", {"enlists", "google", "inlets", "banana"}, {"inlets"}],
17
- // detects multiple anagrams
18
- [
19
- "allergy",
20
- {"gallery", "ballerina", "regally", "clergy", "largely", "leading"},
21
- {"gallery", "regally", "largely"}
22
- ],
23
- // does not detect identical words
24
- ["corn", {"corn", "dark", "Corn", "rank", "CORN", "cron", "park"}, {"cron"}],
25
- // does not detect non-anagrams with identical checksum
26
- ["mass", {"last"}, {}],
27
- // detects anagrams case-insensitively
28
- ["Orchestra", {"cashregister", "Carthorse", "radishes"}, {"Carthorse"}],
29
- // detects anagrams using case-insensitive subject
30
- ["Orchestra", {"cashregister", "carthorse", "radishes"}, {"carthorse"}],
31
- // detects anagrams using case-insensitive possible matches
32
- ["orchestra", {"cashregister", "Carthorse", "radishes"}, {"Carthorse"}],
33
- // does not detect a word as its own anagram
34
- ["banana", {"Banana"}, {}],
35
- // does not detect a anagram if the original word is repeated
36
- ["go", {"go Go GO"}, {}],
37
- // anagrams must use all letters exactly once
38
- ["tapper", {"patter"}, {}],
39
- // capital word is not own anagram
40
- ["BANANA", {"Banana"}, {}]
41
- };
3
+ {[String, {String*}, {String*}]*} cases => {
4
+ // no matches
5
+ ["diaper", {"hello", "world", "zombies", "pants"}, {}],
6
+ // detects simple anagram
7
+ ["ant", {"tan", "stand", "at"}, {"tan"}],
8
+ // does not detect false positives
9
+ ["galea", {"eagle"}, {}],
10
+ // detects multiple anagrams
11
+ ["master", {"stream", "pigeon", "maters"}, {"stream", "maters"}],
12
+ // does not detect anagram subsets
13
+ ["good", {"dog", "goody"}, {}],
14
+ // detects anagram
15
+ ["listen", {"enlists", "google", "inlets", "banana"}, {"inlets"}],
16
+ // detects multiple anagrams
17
+ [
18
+ "allergy",
19
+ {"gallery", "ballerina", "regally", "clergy", "largely", "leading"},
20
+ {"gallery", "regally", "largely"}
21
+ ],
22
+ // does not detect identical words
23
+ ["corn", {"corn", "dark", "Corn", "rank", "CORN", "cron", "park"}, {"cron"}],
24
+ // does not detect non-anagrams with identical checksum
25
+ ["mass", {"last"}, {}],
26
+ // detects anagrams case-insensitively
27
+ ["Orchestra", {"cashregister", "Carthorse", "radishes"}, {"Carthorse"}],
28
+ // detects anagrams using case-insensitive subject
29
+ ["Orchestra", {"cashregister", "carthorse", "radishes"}, {"carthorse"}],
30
+ // detects anagrams using case-insensitive possible matches
31
+ ["orchestra", {"cashregister", "Carthorse", "radishes"}, {"Carthorse"}],
32
+ // does not detect a word as its own anagram
33
+ ["banana", {"Banana"}, {}],
34
+ // does not detect a anagram if the original word is repeated
35
+ ["go", {"go Go GO"}, {}],
36
+ // anagrams must use all letters exactly once
37
+ ["tapper", {"patter"}, {}],
38
+ // capital word is not own anagram
39
+ ["BANANA", {"Banana"}, {}]
40
+ };
42
41
 
43
42
  test
44
43
  parameters(`value cases`)
@@ -1,34 +1,33 @@
1
1
  import ceylon.test { ... }
2
2
 
3
- {[String, Boolean]*} cases =>
4
- {
5
- // paired square brackets
6
- ["[]", true],
7
- // empty string
8
- ["", true],
9
- // unpaired brackets
10
- ["[[", false],
11
- // wrong ordered brackets
12
- ["}{", false],
13
- // paired with whitespace
14
- ["{ }", true],
15
- // simple nested brackets
16
- ["{[]}", true],
17
- // several paired brackets
18
- ["{}[]", true],
19
- // paired and nested brackets
20
- ["([{}({}[])])", true],
21
- // unopened closing brackets
22
- ["{[)][]}", false],
23
- // unpaired and nested brackets
24
- ["([{])", false],
25
- // paired and wrong nested brackets
26
- ["[({]})", false],
27
- // math expression
28
- ["(((185 + 223.85) * 15) - 543)/2", true],
29
- // complex latex expression
30
- ["\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \\end{array}\\right)", true]
31
- };
3
+ {[String, Boolean]*} cases => {
4
+ // paired square brackets
5
+ ["[]", true],
6
+ // empty string
7
+ ["", true],
8
+ // unpaired brackets
9
+ ["[[", false],
10
+ // wrong ordered brackets
11
+ ["}{", false],
12
+ // paired with whitespace
13
+ ["{ }", true],
14
+ // simple nested brackets
15
+ ["{[]}", true],
16
+ // several paired brackets
17
+ ["{}[]", true],
18
+ // paired and nested brackets
19
+ ["([{}({}[])])", true],
20
+ // unopened closing brackets
21
+ ["{[)][]}", false],
22
+ // unpaired and nested brackets
23
+ ["([{])", false],
24
+ // paired and wrong nested brackets
25
+ ["[({]})", false],
26
+ // math expression
27
+ ["(((185 + 223.85) * 15) - 543)/2", true],
28
+ // complex latex expression
29
+ ["\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \\end{array}\\right)", true]
30
+ };
32
31
 
33
32
  test
34
33
  parameters(`value cases`)
@@ -0,0 +1,13 @@
1
+ class Error() {}
2
+
3
+ Integer|Error largestProduct(String digits, Integer window) {
4
+ if (window < 0 || window > digits.size) {
5
+ return Error();
6
+ }
7
+ value parsed = [for (d in digits) if (('0'..'9').contains(d)) d.integer - '0'.integer];
8
+ if (parsed.size < digits.size) {
9
+ return Error();
10
+ }
11
+ value ranges = {for (i in 0..(digits.size - window)) parsed[i:window]};
12
+ return max({for (r in ranges) r.fold(1)((acc, e) => acc * e)});
13
+ }
@@ -0,0 +1,5 @@
1
+ class Error() {}
2
+
3
+ Integer|Error largestProduct(String digits, Integer window) {
4
+ return nothing;
5
+ }
@@ -0,0 +1,30 @@
1
+ import ceylon.test { ... }
2
+
3
+ {[String, Integer, Integer?]*} cases => {
4
+ ["29", 2, 18],
5
+ ["0123456789", 2, 72],
6
+ ["576802143", 2, 48],
7
+ ["0123456789", 3, 504],
8
+ ["1027839564", 3, 270],
9
+ ["0123456789", 5, 15120],
10
+ ["73167176531330624919225119674426574742355349194934", 6, 23520],
11
+ ["0000", 2, 0],
12
+ ["99099", 3, 0],
13
+ ["123", 4, null],
14
+ ["", 0, 1],
15
+ ["123", 0, 1],
16
+ ["", 1, null],
17
+ ["1234a5", 2, null],
18
+ ["12345", -1, null]
19
+ };
20
+
21
+ test
22
+ parameters(`value cases`)
23
+ void testLargestProduct(String digits, Integer window, Integer? expected) {
24
+ value result = largestProduct(digits, window);
25
+ if (exists expected) {
26
+ assertEquals(result, expected);
27
+ } else if (!is Error result) {
28
+ fail("should have errored, but got ``result``");
29
+ }
30
+ }
@@ -0,0 +1,3 @@
1
+ module largestseriesproduct "1.0" {
2
+ import "ceylon.test" "1.3.1";
3
+ }
@@ -175,6 +175,13 @@
175
175
  "Classes"
176
176
  ]
177
177
  },
178
+ {
179
+ "slug": "error-handling",
180
+ "difficulty": 3,
181
+ "topics": [
182
+ "Exception handling"
183
+ ]
184
+ },
178
185
  {
179
186
  "slug": "kindergarten-garden",
180
187
  "difficulty": 3,
@@ -535,6 +542,15 @@
535
542
  "Algorithms",
536
543
  "Transforming"
537
544
  ]
545
+ },
546
+ {
547
+ "slug": "ledger",
548
+ "difficulty": 5,
549
+ "topics": [
550
+ "Globalization",
551
+ "Text formatting",
552
+ "Refactoring"
553
+ ]
538
554
  },
539
555
  {
540
556
  "slug": "custom-set",
@@ -543,6 +559,15 @@
543
559
  "Sets"
544
560
  ]
545
561
  },
562
+ {
563
+ "slug": "dot-dsl",
564
+ "difficulty": 5,
565
+ "topics": [
566
+ "Domain-specific languages",
567
+ "Classes",
568
+ "Equality"
569
+ ]
570
+ },
546
571
  {
547
572
  "slug": "ocr-numbers",
548
573
  "difficulty": 5,
@@ -715,6 +740,14 @@
715
740
  "Logic"
716
741
  ]
717
742
  },
743
+ {
744
+ "slug": "hangman",
745
+ "difficulty": 8,
746
+ "topics": [
747
+ "Reactive programming",
748
+ "Events"
749
+ ]
750
+ },
718
751
  {
719
752
  "slug": "diamond",
720
753
  "difficulty": 8,
@@ -780,6 +813,14 @@
780
813
  "Parsing",
781
814
  "Transforming"
782
815
  ]
816
+ },
817
+ {
818
+ "slug": "alphametics",
819
+ "difficulty": 10,
820
+ "topics": [
821
+ "Parsing",
822
+ "Dictionaries"
823
+ ]
783
824
  }
784
825
  ],
785
826
  "deprecated": [
@@ -0,0 +1,122 @@
1
+ using NUnit.Framework;
2
+ using System.Collections.Generic;
3
+
4
+ public class AlphameticsTest
5
+ {
6
+ [Test]
7
+ public void Puzzle_with_three_letters()
8
+ {
9
+ var actual = Alphametics.Solve("I + BB == ILL");
10
+ var expected = new Dictionary<char, int>
11
+ {
12
+ ['I'] = 1,
13
+ ['B'] = 9,
14
+ ['L'] = 0
15
+ };
16
+ Assert.That(actual, Is.EqualTo(expected));
17
+ }
18
+
19
+ [Ignore("Remove to run test")]
20
+ [Test]
21
+ public void Solution_must_have_unique_value_for_each_letter()
22
+ {
23
+ Assert.That(() => Alphametics.Solve("A == B"), Throws.Exception);
24
+ }
25
+
26
+ [Ignore("Remove to run test")]
27
+ [Test]
28
+ public void Leading_zero_solution_is_invalid()
29
+ {
30
+ Assert.That(() => Alphametics.Solve("ACA + DD == BD"), Throws.Exception);
31
+ }
32
+
33
+ [Ignore("Remove to run test")]
34
+ [Test]
35
+ public void Puzzle_with_four_letters()
36
+ {
37
+ var actual = Alphametics.Solve("AS + A == MOM");
38
+ var expected = new Dictionary<char, int>
39
+ {
40
+ ['A'] = 9,
41
+ ['S'] = 2,
42
+ ['M'] = 1,
43
+ ['O'] = 0
44
+ };
45
+ Assert.That(actual, Is.EqualTo(expected));
46
+ }
47
+
48
+ [Ignore("Remove to run test")]
49
+ [Test]
50
+ public void Puzzle_with_six_letters()
51
+ {
52
+ var actual = Alphametics.Solve("NO + NO + TOO == LATE");
53
+ var expected = new Dictionary<char, int>
54
+ {
55
+ ['N'] = 7,
56
+ ['O'] = 4,
57
+ ['T'] = 9,
58
+ ['L'] = 1,
59
+ ['A'] = 0,
60
+ ['E'] = 2
61
+ };
62
+ Assert.That(actual, Is.EqualTo(expected));
63
+ }
64
+
65
+ [Ignore("Remove to run test")]
66
+ [Test]
67
+ public void Puzzle_with_seven_letters()
68
+ {
69
+ var actual = Alphametics.Solve("HE + SEES + THE == LIGHT");
70
+ var expected = new Dictionary<char, int>
71
+ {
72
+ ['E'] = 4,
73
+ ['G'] = 2,
74
+ ['H'] = 5,
75
+ ['I'] = 0,
76
+ ['L'] = 1,
77
+ ['S'] = 9,
78
+ ['T'] = 7,
79
+ };
80
+ Assert.That(actual, Is.EqualTo(expected));
81
+ }
82
+
83
+ [Ignore("Remove to run test")]
84
+ [Test]
85
+ public void Puzzle_with_eight_letters()
86
+ {
87
+ var actual = Alphametics.Solve("SEND + MORE == MONEY");
88
+ var expected = new Dictionary<char, int>
89
+ {
90
+ ['S'] = 9,
91
+ ['E'] = 5,
92
+ ['N'] = 6,
93
+ ['D'] = 7,
94
+ ['M'] = 1,
95
+ ['O'] = 0,
96
+ ['R'] = 8,
97
+ ['Y'] = 2,
98
+ };
99
+ Assert.That(actual, Is.EqualTo(expected));
100
+ }
101
+
102
+ [Ignore("Remove to run test")]
103
+ [Test]
104
+ public void Puzzle_with_ten_letters()
105
+ {
106
+ var actual = Alphametics.Solve("AND + A + STRONG + OFFENSE + AS + A + GOOD == DEFENSE");
107
+ var expected = new Dictionary<char, int>
108
+ {
109
+ ['A'] = 5,
110
+ ['D'] = 3,
111
+ ['E'] = 4,
112
+ ['F'] = 7,
113
+ ['G'] = 8,
114
+ ['N'] = 0,
115
+ ['O'] = 2,
116
+ ['R'] = 1,
117
+ ['S'] = 6,
118
+ ['T'] = 9,
119
+ };
120
+ Assert.That(actual, Is.EqualTo(expected));
121
+ }
122
+ }