trackler 2.0.0.2 → 2.0.0.3

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 (197) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/forth/canonical-data.json +1 -1
  3. data/common/exercises/pangram/canonical-data.json +0 -10
  4. data/common/exercises/run-length-encoding/canonical-data.json +21 -11
  5. data/lib/trackler/version.rb +1 -1
  6. data/tracks/bash/SETUP.md +2 -39
  7. data/tracks/bash/config.json +0 -9
  8. data/tracks/bash/exercises/hello-world/HINTS.md +38 -0
  9. data/tracks/bash/exercises/hello-world/hello_world_test.sh +0 -14
  10. data/tracks/haskell/.travis.yml +2 -13
  11. data/tracks/haskell/README.md +2 -1
  12. data/tracks/haskell/config.json +6 -0
  13. data/tracks/haskell/exercises/accumulate/examples/success-standard/package.yaml +16 -0
  14. data/tracks/haskell/exercises/accumulate/{src/Example.hs → examples/success-standard/src/Accumulate.hs} +0 -0
  15. data/tracks/haskell/exercises/all-your-base/examples/success-standard/package.yaml +16 -0
  16. data/tracks/haskell/exercises/all-your-base/{src/Example.hs → examples/success-standard/src/Base.hs} +0 -0
  17. data/tracks/haskell/exercises/allergies/examples/success-standard/package.yaml +16 -0
  18. data/tracks/haskell/exercises/allergies/{src/Example.hs → examples/success-standard/src/Allergies.hs} +0 -0
  19. data/tracks/haskell/exercises/alphametics/HINTS.md +5 -0
  20. data/tracks/haskell/exercises/alphametics/examples/success-standard/package.yaml +18 -0
  21. data/tracks/haskell/exercises/alphametics/examples/success-standard/src/Alphametics.hs +116 -0
  22. data/tracks/haskell/exercises/alphametics/package.yaml +20 -0
  23. data/tracks/haskell/exercises/alphametics/src/Alphametics.hs +4 -0
  24. data/tracks/haskell/exercises/alphametics/stack.yaml +1 -0
  25. data/tracks/haskell/exercises/alphametics/test/Tests.hs +78 -0
  26. data/tracks/haskell/exercises/anagram/examples/{list-string → success-liststring}/package.yaml +0 -1
  27. data/tracks/haskell/exercises/anagram/examples/{list-string → success-liststring/src}/Anagram.hs +0 -0
  28. data/tracks/haskell/exercises/anagram/examples/{set-text → success-settext}/package.yaml +0 -0
  29. data/tracks/haskell/exercises/anagram/examples/{set-text → success-settext/src}/Anagram.hs +0 -0
  30. data/tracks/haskell/exercises/atbash-cipher/examples/success-standard/package.yaml +18 -0
  31. data/tracks/haskell/exercises/atbash-cipher/{src/Example.hs → examples/success-standard/src/Atbash.hs} +0 -0
  32. data/tracks/haskell/exercises/bank-account/examples/success-standard/package.yaml +18 -0
  33. data/tracks/haskell/exercises/bank-account/{src/Example.hs → examples/success-standard/src/BankAccount.hs} +0 -0
  34. data/tracks/haskell/exercises/beer-song/examples/success-standard/package.yaml +16 -0
  35. data/tracks/haskell/exercises/beer-song/{src/Example.hs → examples/success-standard/src/Beer.hs} +0 -0
  36. data/tracks/haskell/exercises/binary-search-tree/examples/success-standard/package.yaml +16 -0
  37. data/tracks/haskell/exercises/binary-search-tree/{src/Example.hs → examples/success-standard/src/BST.hs} +0 -0
  38. data/tracks/haskell/exercises/binary/examples/success-standard/package.yaml +16 -0
  39. data/tracks/haskell/exercises/binary/{src/Example.hs → examples/success-standard/src/Binary.hs} +0 -0
  40. data/tracks/haskell/exercises/bob/examples/success-standard/package.yaml +16 -0
  41. data/tracks/haskell/exercises/bob/{src/Example.hs → examples/success-standard/src/Bob.hs} +0 -0
  42. data/tracks/haskell/exercises/change/examples/success-standard/package.yaml +16 -0
  43. data/tracks/haskell/exercises/change/{src/Example.hs → examples/success-standard/src/Change.hs} +0 -0
  44. data/tracks/haskell/exercises/clock/examples/success-standard/package.yaml +16 -0
  45. data/tracks/haskell/exercises/clock/{src/Example.hs → examples/success-standard/src/Clock.hs} +0 -0
  46. data/tracks/haskell/exercises/connect/examples/success-standard/package.yaml +18 -0
  47. data/tracks/haskell/exercises/connect/{src/Example.hs → examples/success-standard/src/Connect.hs} +0 -0
  48. data/tracks/haskell/exercises/crypto-square/examples/success-standard/package.yaml +18 -0
  49. data/tracks/haskell/exercises/crypto-square/{src/Example.hs → examples/success-standard/src/CryptoSquare.hs} +0 -0
  50. data/tracks/haskell/exercises/custom-set/examples/success-standard/package.yaml +16 -0
  51. data/tracks/haskell/exercises/custom-set/{src/Example.hs → examples/success-standard/src/CustomSet.hs} +0 -0
  52. data/tracks/haskell/exercises/difference-of-squares/examples/success-standard/package.yaml +16 -0
  53. data/tracks/haskell/exercises/difference-of-squares/{src/Example.hs → examples/success-standard/src/Squares.hs} +0 -0
  54. data/tracks/haskell/exercises/etl/examples/success-standard/package.yaml +17 -0
  55. data/tracks/haskell/exercises/etl/{src/Example.hs → examples/success-standard/src/ETL.hs} +0 -0
  56. data/tracks/haskell/exercises/food-chain/examples/success-standard/package.yaml +18 -0
  57. data/tracks/haskell/exercises/food-chain/{src/Example.hs → examples/success-standard/src/FoodChain.hs} +0 -0
  58. data/tracks/haskell/exercises/forth/HINTS.md +2 -2
  59. data/tracks/haskell/exercises/forth/examples/success-standard/package.yaml +19 -0
  60. data/tracks/haskell/exercises/forth/{src/Example.hs → examples/success-standard/src/Forth.hs} +3 -3
  61. data/tracks/haskell/exercises/forth/package.yaml +0 -1
  62. data/tracks/haskell/exercises/forth/src/Forth.hs +3 -3
  63. data/tracks/haskell/exercises/forth/test/Tests.hs +120 -65
  64. data/tracks/haskell/exercises/gigasecond/examples/success-standard/package.yaml +17 -0
  65. data/tracks/haskell/exercises/gigasecond/{src/Example.hs → examples/success-standard/src/Gigasecond.hs} +0 -0
  66. data/tracks/haskell/exercises/go-counting/examples/success-standard/package.yaml +20 -0
  67. data/tracks/haskell/exercises/go-counting/{src/Example.hs → examples/success-standard/src/Counting.hs} +0 -0
  68. data/tracks/haskell/exercises/grade-school/examples/success-standard/package.yaml +18 -0
  69. data/tracks/haskell/exercises/grade-school/{src/Example.hs → examples/success-standard/src/School.hs} +0 -0
  70. data/tracks/haskell/exercises/grains/examples/success-standard/package.yaml +16 -0
  71. data/tracks/haskell/exercises/grains/{src/Example.hs → examples/success-standard/src/Grains.hs} +0 -0
  72. data/tracks/haskell/exercises/grains/test/Tests.hs +1 -2
  73. data/tracks/haskell/exercises/hamming/examples/success-standard/package.yaml +16 -0
  74. data/tracks/haskell/exercises/hamming/{src/Example.hs → examples/success-standard/src/Hamming.hs} +0 -0
  75. data/tracks/haskell/exercises/hexadecimal/examples/success-standard/package.yaml +16 -0
  76. data/tracks/haskell/exercises/hexadecimal/{src/Example.hs → examples/success-standard/src/Hexadecimal.hs} +0 -0
  77. data/tracks/haskell/exercises/house/examples/success-standard/package.yaml +16 -0
  78. data/tracks/haskell/exercises/house/{src/Example.hs → examples/success-standard/src/House.hs} +0 -0
  79. data/tracks/haskell/exercises/kindergarten-garden/examples/success-standard/package.yaml +19 -0
  80. data/tracks/haskell/exercises/kindergarten-garden/{src/Example.hs → examples/success-standard/src/Garden.hs} +0 -0
  81. data/tracks/haskell/exercises/largest-series-product/examples/success-standard/package.yaml +18 -0
  82. data/tracks/haskell/exercises/largest-series-product/{src/Example.hs → examples/success-standard/src/Series.hs} +0 -0
  83. data/tracks/haskell/exercises/leap/examples/success-standard/package.yaml +16 -0
  84. data/tracks/haskell/exercises/leap/{src/Example.hs → examples/success-standard/src/LeapYear.hs} +0 -0
  85. data/tracks/haskell/exercises/lens-person/examples/success-standard/package.yaml +19 -0
  86. data/tracks/haskell/exercises/lens-person/{src/Example.hs → examples/success-standard/src/Person.hs} +0 -0
  87. data/tracks/haskell/exercises/linked-list/examples/success-standard/package.yaml +18 -0
  88. data/tracks/haskell/exercises/linked-list/{src/Example.hs → examples/success-standard/src/Deque.hs} +0 -0
  89. data/tracks/haskell/exercises/list-ops/examples/success-standard/package.yaml +16 -0
  90. data/tracks/haskell/exercises/list-ops/{src/Example.hs → examples/success-standard/src/ListOps.hs} +0 -0
  91. data/tracks/haskell/exercises/luhn/examples/success-standard/package.yaml +16 -0
  92. data/tracks/haskell/exercises/luhn/{src/Example.hs → examples/success-standard/src/Luhn.hs} +0 -0
  93. data/tracks/haskell/exercises/matrix/examples/success-standard/package.yaml +17 -0
  94. data/tracks/haskell/exercises/matrix/{src/Example.hs → examples/success-standard/src/Matrix.hs} +0 -0
  95. data/tracks/haskell/exercises/meetup/examples/success-standard/package.yaml +17 -0
  96. data/tracks/haskell/exercises/meetup/{src/Example.hs → examples/success-standard/src/Meetup.hs} +0 -0
  97. data/tracks/haskell/exercises/minesweeper/examples/success-standard/package.yaml +16 -0
  98. data/tracks/haskell/exercises/minesweeper/{src/Example.hs → examples/success-standard/src/Minesweeper.hs} +0 -0
  99. data/tracks/haskell/exercises/nth-prime/examples/success-standard/package.yaml +16 -0
  100. data/tracks/haskell/exercises/nth-prime/{src/Example.hs → examples/success-standard/src/Prime.hs} +0 -0
  101. data/tracks/haskell/exercises/nucleotide-count/examples/success-standard/package.yaml +17 -0
  102. data/tracks/haskell/exercises/nucleotide-count/{src/Example.hs → examples/success-standard/src/DNA.hs} +0 -0
  103. data/tracks/haskell/exercises/ocr-numbers/examples/success-standard/package.yaml +19 -0
  104. data/tracks/haskell/exercises/ocr-numbers/{src/Example.hs → examples/success-standard/src/OCR.hs} +0 -0
  105. data/tracks/haskell/exercises/octal/examples/success-standard/package.yaml +17 -0
  106. data/tracks/haskell/exercises/octal/{src/Example.hs → examples/success-standard/src/Octal.hs} +0 -0
  107. data/tracks/haskell/exercises/palindrome-products/examples/success-standard/package.yaml +16 -0
  108. data/tracks/haskell/exercises/palindrome-products/{src/Example.hs → examples/success-standard/src/Palindromes.hs} +0 -0
  109. data/tracks/haskell/exercises/parallel-letter-frequency/examples/success-standard/package.yaml +20 -0
  110. data/tracks/haskell/exercises/parallel-letter-frequency/{src/Example.hs → examples/success-standard/src/Frequency.hs} +0 -0
  111. data/tracks/haskell/exercises/pascals-triangle/examples/success-standard/package.yaml +16 -0
  112. data/tracks/haskell/exercises/pascals-triangle/{src/Example.hs → examples/success-standard/src/Triangle.hs} +0 -0
  113. data/tracks/haskell/exercises/phone-number/examples/success-standard/package.yaml +16 -0
  114. data/tracks/haskell/exercises/phone-number/{src/Example.hs → examples/success-standard/src/Phone.hs} +0 -0
  115. data/tracks/haskell/exercises/pig-latin/examples/success-standard/package.yaml +16 -0
  116. data/tracks/haskell/exercises/pig-latin/{src/Example.hs → examples/success-standard/src/PigLatin.hs} +0 -0
  117. data/tracks/haskell/exercises/pig-latin/test/Tests.hs +2 -1
  118. data/tracks/haskell/exercises/pov/examples/success-standard/package.yaml +17 -0
  119. data/tracks/haskell/exercises/pov/{src/Example.hs → examples/success-standard/src/POV.hs} +0 -0
  120. data/tracks/haskell/exercises/pov/test/Tests.hs +34 -8
  121. data/tracks/haskell/exercises/prime-factors/examples/success-standard/package.yaml +16 -0
  122. data/tracks/haskell/exercises/prime-factors/{src/Example.hs → examples/success-standard/src/PrimeFactors.hs} +0 -0
  123. data/tracks/haskell/exercises/pythagorean-triplet/examples/success-standard/package.yaml +16 -0
  124. data/tracks/haskell/exercises/pythagorean-triplet/{src/Example.hs → examples/success-standard/src/Triplet.hs} +0 -0
  125. data/tracks/haskell/exercises/queen-attack/examples/success-standard/package.yaml +16 -0
  126. data/tracks/haskell/exercises/queen-attack/{src/Example.hs → examples/success-standard/src/Queens.hs} +0 -0
  127. data/tracks/haskell/exercises/raindrops/examples/success-standard/package.yaml +16 -0
  128. data/tracks/haskell/exercises/raindrops/{src/Example.hs → examples/success-standard/src/Raindrops.hs} +0 -0
  129. data/tracks/haskell/exercises/rna-transcription/examples/success-standard/package.yaml +18 -0
  130. data/tracks/haskell/exercises/rna-transcription/{src/Example.hs → examples/success-standard/src/DNA.hs} +0 -0
  131. data/tracks/haskell/exercises/robot-name/examples/success-standard/package.yaml +18 -0
  132. data/tracks/haskell/exercises/robot-name/{src/Example.hs → examples/success-standard/src/Robot.hs} +0 -0
  133. data/tracks/haskell/exercises/robot-simulator/examples/success-standard/package.yaml +16 -0
  134. data/tracks/haskell/exercises/robot-simulator/{src/Example.hs → examples/success-standard/src/Robot.hs} +0 -0
  135. data/tracks/haskell/exercises/roman-numerals/examples/success-standard/package.yaml +16 -0
  136. data/tracks/haskell/exercises/roman-numerals/{src/Example.hs → examples/success-standard/src/Roman.hs} +0 -0
  137. data/tracks/haskell/exercises/saddle-points/examples/success-standard/package.yaml +19 -0
  138. data/tracks/haskell/exercises/saddle-points/{src/Example.hs → examples/success-standard/src/Matrix.hs} +0 -0
  139. data/tracks/haskell/exercises/say/examples/success-standard/package.yaml +18 -0
  140. data/tracks/haskell/exercises/say/{src/Example.hs → examples/success-standard/src/Say.hs} +0 -0
  141. data/tracks/haskell/exercises/say/test/Tests.hs +4 -2
  142. data/tracks/haskell/exercises/scrabble-score/examples/success-standard/package.yaml +18 -0
  143. data/tracks/haskell/exercises/scrabble-score/{src/Example.hs → examples/success-standard/src/Scrabble.hs} +0 -0
  144. data/tracks/haskell/exercises/secret-handshake/examples/success-standard/package.yaml +16 -0
  145. data/tracks/haskell/exercises/secret-handshake/{src/Example.hs → examples/success-standard/src/SecretHandshake.hs} +0 -0
  146. data/tracks/haskell/exercises/series/examples/success-standard/package.yaml +16 -0
  147. data/tracks/haskell/exercises/series/{src/Example.hs → examples/success-standard/src/Series.hs} +0 -0
  148. data/tracks/haskell/exercises/sgf-parsing/examples/success-standard/package.yaml +20 -0
  149. data/tracks/haskell/exercises/sgf-parsing/{src/Example.hs → examples/success-standard/src/Sgf.hs} +0 -0
  150. data/tracks/haskell/exercises/sieve/examples/success-standard/package.yaml +18 -0
  151. data/tracks/haskell/exercises/sieve/{src/Example.hs → examples/success-standard/src/Sieve.hs} +0 -0
  152. data/tracks/haskell/exercises/simple-cipher/examples/success-standard/package.yaml +18 -0
  153. data/tracks/haskell/exercises/simple-cipher/{src/Example.hs → examples/success-standard/src/Cipher.hs} +0 -0
  154. data/tracks/haskell/exercises/simple-linked-list/examples/success-standard/package.yaml +16 -0
  155. data/tracks/haskell/exercises/simple-linked-list/{src/Example.hs → examples/success-standard/src/LinkedList.hs} +0 -0
  156. data/tracks/haskell/exercises/space-age/examples/success-double/package.yaml +0 -3
  157. data/tracks/haskell/exercises/space-age/examples/success-double/{SpaceAge.hs → src/SpaceAge.hs} +0 -0
  158. data/tracks/haskell/exercises/space-age/examples/success-rational/package.yaml +0 -3
  159. data/tracks/haskell/exercises/space-age/examples/success-rational/{SpaceAge.hs → src/SpaceAge.hs} +0 -0
  160. data/tracks/haskell/exercises/strain/examples/success-standard/package.yaml +16 -0
  161. data/tracks/haskell/exercises/strain/{src/Example.hs → examples/success-standard/src/Strain.hs} +0 -0
  162. data/tracks/haskell/exercises/sublist/examples/success-standard/package.yaml +16 -0
  163. data/tracks/haskell/exercises/sublist/{src/Example.hs → examples/success-standard/src/Sublist.hs} +0 -0
  164. data/tracks/haskell/exercises/sum-of-multiples/examples/success-standard/package.yaml +16 -0
  165. data/tracks/haskell/exercises/sum-of-multiples/{src/Example.hs → examples/success-standard/src/SumOfMultiples.hs} +0 -0
  166. data/tracks/haskell/exercises/triangle/examples/success-standard/package.yaml +18 -0
  167. data/tracks/haskell/exercises/triangle/{src/Example.hs → examples/success-standard/src/Triangle.hs} +0 -0
  168. data/tracks/haskell/exercises/trinary/examples/success-standard/package.yaml +17 -0
  169. data/tracks/haskell/exercises/trinary/{src/Example.hs → examples/success-standard/src/Trinary.hs} +0 -0
  170. data/tracks/haskell/exercises/word-count/examples/success-newtype/package.yaml +0 -2
  171. data/tracks/haskell/exercises/word-count/examples/success-newtype/{WordCount.hs → src/WordCount.hs} +0 -0
  172. data/tracks/haskell/exercises/word-count/examples/success-simple/package.yaml +0 -2
  173. data/tracks/haskell/exercises/word-count/examples/success-simple/{WordCount.hs → src/WordCount.hs} +0 -0
  174. data/tracks/haskell/exercises/wordy/examples/success-standard/package.yaml +19 -0
  175. data/tracks/haskell/exercises/wordy/{src/Example.hs → examples/success-standard/src/WordProblem.hs} +0 -0
  176. data/tracks/haskell/exercises/zebra-puzzle/examples/success-standard/package.yaml +16 -0
  177. data/tracks/haskell/exercises/zebra-puzzle/{src/Example.hs → examples/success-standard/src/ZebraPuzzle.hs} +0 -0
  178. data/tracks/haskell/exercises/zipper/examples/success-standard/package.yaml +16 -0
  179. data/tracks/haskell/exercises/zipper/{src/Example.hs → examples/success-standard/src/Zipper.hs} +0 -0
  180. data/tracks/java/config.json +7 -1
  181. data/tracks/java/exercises/difference-of-squares/build.gradle +17 -0
  182. data/tracks/java/exercises/difference-of-squares/src/example/java/.keep +0 -0
  183. data/tracks/java/exercises/difference-of-squares/src/example/java/Difference.java +20 -0
  184. data/tracks/java/exercises/difference-of-squares/src/main/java/.keep +0 -0
  185. data/tracks/java/exercises/difference-of-squares/src/main/java/Difference.java +5 -0
  186. data/tracks/java/exercises/difference-of-squares/src/test/java/DifferenceTest.java +87 -0
  187. data/tracks/java/exercises/settings.gradle +1 -0
  188. data/tracks/kotlin/docs/TESTS.md +97 -13
  189. data/tracks/ruby/exercises/alphametics/.version +1 -1
  190. data/tracks/ruby/exercises/alphametics/alphametics_test.rb +55 -45
  191. data/tracks/ruby/exercises/alphametics/example.rb +100 -63
  192. data/tracks/ruby/exercises/alphametics/example.tt +7 -6
  193. data/tracks/ruby/lib/alphametics_cases.rb +49 -13
  194. data/tracks/ruby/lib/generator.rb +2 -1
  195. data/tracks/rust/docs/LEARNING.md +1 -0
  196. data/tracks/rust/exercises/acronym/tests/acronym.rs +6 -0
  197. metadata +164 -80
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ecd79fc11b28fd57fad197537efd30d929a39a2
4
- data.tar.gz: a260adf3ee20c762dc65638fb762284607c54761
3
+ metadata.gz: 13d90971009884bd820bdbe76a985c6a084b4a71
4
+ data.tar.gz: 45d64cda7e36d7934c5fe4827525ff6aa0555eb6
5
5
  SHA512:
6
- metadata.gz: b74c1f2b78cfed39a431f5bdae4fa8822008aa987087985e9c1508d3f39710aaa32460d5e168c252d745ed579d319047734a533e38766b854e12e67a92ac8ddc
7
- data.tar.gz: 4d597f2e379ed5010ab9d881051991a20d7afe9b3200e4d8d38d6de3560727b7c096c960aa9762291255e04d45cf6034df034f7e7ff49fb66788ee070d8f215d
6
+ metadata.gz: fb8974eb51e067fd796d4cc65ed3fe25df92f865ef5db6b24517036b3121ea31b73c5f62d4b49774c6dcf06b1d6fecbcad776dbb7a68f5d3ac98b4ef83f6fd6c
7
+ data.tar.gz: fd4f843c2e21324070fab9e4925c40a85901e760d2a557b9e6088758304204328cc3a834fd1c705a72e8c9f76f197fe4f0e35cb87b35727eeb581d0007ecdbce
@@ -194,7 +194,7 @@
194
194
  "expected": []
195
195
  },
196
196
  {
197
- "description": "removes the top value on the stack if it not is the only one",
197
+ "description": "removes the top value on the stack if it is not the only one",
198
198
  "input": [
199
199
  "1 2 drop"
200
200
  ],
@@ -39,16 +39,6 @@
39
39
  "description": "pangram with mixed case and punctuation",
40
40
  "input": "\"Five quacking Zephyrs jolt my wax bed.\"",
41
41
  "expected": true
42
- },
43
- {
44
- "description": "pangram with non ascii characters",
45
- "input": "Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich.",
46
- "expected": true
47
- },
48
- {
49
- "description": "Panagram in alphabet other than ASCII",
50
- "input": "Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства.",
51
- "expected": false
52
42
  }
53
43
  ]
54
44
  }
@@ -1,8 +1,28 @@
1
1
  {
2
2
  "#": [
3
- "The tests deliberately check that single characters are encoded without count."
3
+ "The tests deliberately check that single characters are encoded without count."
4
4
  ],
5
5
  "cases": [
6
+ {
7
+ "description": "encode empty string",
8
+ "input": "",
9
+ "expected": ""
10
+ },
11
+ {
12
+ "description": "encode single characters only",
13
+ "input": "XYZ",
14
+ "expected": "XYZ"
15
+ },
16
+ {
17
+ "description": "decode empty string",
18
+ "input": "",
19
+ "expected": ""
20
+ },
21
+ {
22
+ "description": "decode single characters only",
23
+ "input": "XYZ",
24
+ "expected": "XYZ"
25
+ },
6
26
  {
7
27
  "description": "encode simple",
8
28
  "input": "AABBBCCCC",
@@ -27,16 +47,6 @@
27
47
  "description": "decode(encode(...)) combination",
28
48
  "input": "zzz ZZ zZ",
29
49
  "expected": "zzz ZZ zZ"
30
- },
31
- {
32
- "description": "encode unicode",
33
- "input": "⏰⚽⚽⚽⭐⭐⏰",
34
- "expected": "⏰3⚽2⭐⏰"
35
- },
36
- {
37
- "description": "decode unicode",
38
- "input": "⏰3⚽2⭐⏰",
39
- "expected": "⏰⚽⚽⚽⭐⭐⏰"
40
50
  }
41
51
  ]
42
52
  }
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.0.0.2"
2
+ VERSION = "2.0.0.3"
3
3
  end
data/tracks/bash/SETUP.md CHANGED
@@ -1,40 +1,3 @@
1
- # Welcome to Bash!
1
+ Run the tests with:
2
2
 
3
- Unlike many other languages here, bash is a bit of a special snowflake.
4
- If you are on a Mac or other unix-y platform, you almost definitely
5
- already have bash. In fact, anything you type into the terminal is
6
- likely going through bash.
7
-
8
- The downside to this is that there isn't much of a development
9
- ecosystem around bash like there is for other languages, and there are
10
- multiple verions of bash that can be frustratingly incompatible. Luckily
11
- we shouldn't hit those differences for these basic examples, and if you
12
- can get the tests to pass on your machine, we are doing great.
13
-
14
- ## Installation
15
-
16
- As I said above, if you are on a unix-like OS (Mac OS X, Linux, Solaris,
17
- etc), you probably already have bash.
18
-
19
- ## Testing
20
-
21
- As there isn't much of a bash ecosystem, there also isn't really a de
22
- facto leader in the bash testing area. For these examples we are using
23
- [bats](https://github.com/sstephenson/bats). You should be able to
24
- install it from your favorite package manager, on OS X with homebrew
25
- this would look something like this:
26
-
27
- ```
28
- $ brew install bats
29
- ==> Downloading
30
- https://github.com/sstephenson/bats/archive/v0.4.0.tar.gz
31
- ==> Downloading from
32
- https://codeload.github.com/sstephenson/bats/tar.gz/v0.4.0
33
- ########################################################################
34
- 100.0%
35
- ==> ./install.sh /opt/boxen/homebrew/Cellar/bats/0.4.0
36
- 🍺 /opt/boxen/homebrew/Cellar/bats/0.4.0: 10 files, 60K, built in 2
37
- seconds
38
- ```
39
-
40
- Run the tests with `bats whatever_test.sh`.
3
+ bats whatever_test.sh
@@ -4,15 +4,6 @@
4
4
  "repository": "https://github.com/exercism/xbash",
5
5
  "checklist_issue": 4,
6
6
  "active": false,
7
- "problems": [
8
- "hello-world",
9
- "gigasecond",
10
- "leap",
11
- "hamming",
12
- "rna-transcription",
13
- "raindrops",
14
- "bob"
15
- ],
16
7
  "exercises": [
17
8
  {
18
9
  "slug": "hello-world" ,
@@ -0,0 +1,38 @@
1
+ # Welcome to Bash!
2
+
3
+ Unlike many other languages here, bash is a bit of a special snowflake.
4
+ If you are on a Mac or other unix-y platform, you almost definitely
5
+ already have bash. In fact, anything you type into the terminal is
6
+ likely going through bash.
7
+
8
+ The downside to this is that there isn't much of a development
9
+ ecosystem around bash like there is for other languages, and there are
10
+ multiple verions of bash that can be frustratingly incompatible. Luckily
11
+ we shouldn't hit those differences for these basic examples, and if you
12
+ can get the tests to pass on your machine, we are doing great.
13
+
14
+ ## Installation
15
+
16
+ As I said above, if you are on a unix-like OS (Mac OS X, Linux, Solaris,
17
+ etc), you probably already have bash.
18
+
19
+ ## Testing
20
+
21
+ As there isn't much of a bash ecosystem, there also isn't really a de
22
+ facto leader in the bash testing area. For these examples we are using
23
+ [bats](https://github.com/sstephenson/bats). You should be able to
24
+ install it from your favorite package manager, on OS X with homebrew
25
+ this would look something like this:
26
+
27
+ ```
28
+ $ brew install bats
29
+ ==> Downloading
30
+ https://github.com/sstephenson/bats/archive/v0.4.0.tar.gz
31
+ ==> Downloading from
32
+ https://codeload.github.com/sstephenson/bats/tar.gz/v0.4.0
33
+ ########################################################################
34
+ 100.0%
35
+ ==> ./install.sh /opt/boxen/homebrew/Cellar/bats/0.4.0
36
+ 🍺 /opt/boxen/homebrew/Cellar/bats/0.4.0: 10 files, 60K, built in 2
37
+ seconds
38
+ ```
@@ -18,17 +18,3 @@
18
18
  [ "$status" -eq 0 ]
19
19
  [ "$output" = "Hello, Bob!" ]
20
20
  }
21
-
22
- @test 'When given an empty string it should have a space and punctuation, though admittedly this is strange.' {
23
- run bash hello_world.sh ""
24
-
25
- [ "$status" -eq 0 ]
26
- [ "$output" = "Hello, !" ]
27
- }
28
-
29
- @test 'When given "Alice and Bob" it greets them both' {
30
- run bash hello_world.sh Alice and Bob
31
-
32
- [ "$status" -eq 0 ]
33
- [ "$output" = "Hello, Alice and Bob!" ]
34
- }
@@ -52,18 +52,7 @@ script:
52
52
  for exercise in ${TRAVIS_BUILD_DIR}/exercises/* ; do
53
53
  pushd ${exercise}
54
54
 
55
- if [ -f src/Example.hs ]; then
56
- # `stack --work-dir` fails if not targeting a subdirectory, so we just
57
- # symbolic-link `.stack-work` to a subfolder in the cache directory.
58
- mkdir -p "${HOME}/.foldercache/${exercise}/.stack-work"
59
- ln -f -s "${HOME}/.foldercache/${exercise}/.stack-work"
60
-
61
- # Here we prepare the exercise to be tested by Stack.
62
- MODULE=`sed -n 's/ *module \+\([a-zA-Z0-9]\+\).*/\1/p' src/Example.hs`
63
- mv src/Example.hs "src/${MODULE}.hs"
64
-
65
- test_exercise
66
- elif ! stat -t examples/*/ > /dev/null 2>&1; then
55
+ if ! stat -t examples/*/ > /dev/null 2>&1; then
67
56
  echo "No examples for ${exercise}!"
68
57
  exit 1
69
58
  else
@@ -74,7 +63,7 @@ script:
74
63
 
75
64
  echo "testing ${example}"
76
65
  rm -f src/*.hs
77
- mv ${example}/*.hs src
66
+ mv ${example}/src/*.hs src
78
67
  mv ${example}/package.yaml .
79
68
 
80
69
  test_exercise
@@ -22,8 +22,9 @@ All exercises have the following structure:
22
22
  resolver for all the exercises.
23
23
  - `package.yaml` is a file in the [hpack](https://github.com/sol/hpack#readme)
24
24
  format that has all dependencies and build instructions for an exercise.
25
- - `src/Example.hs` is a sample solution passing the tests.
26
25
  - `src/ModuleName.hs` is a *stub solution*.
26
+ - `src/examples/success-foo/package.yaml` has dependencies for the example solution named `foo`.
27
+ - `src/examples/success-foo/src/ModuleName.hs` is the source code of the sample solution.
27
28
  - `test/Tests.hs` is the test suite.
28
29
  - `HINTS.md` is an optional file containing instructions and/or hints.
29
30
 
@@ -370,6 +370,12 @@
370
370
  "topics": [
371
371
  ]
372
372
  },
373
+ {
374
+ "slug": "alphametics",
375
+ "difficulty": 7,
376
+ "topics": [
377
+ ]
378
+ },
373
379
  {
374
380
  "slug": "connect",
375
381
  "difficulty": 8,
@@ -0,0 +1,16 @@
1
+ name: accumulate
2
+
3
+ dependencies:
4
+ - base
5
+
6
+ library:
7
+ exposed-modules: Accumulate
8
+ source-dirs: src
9
+
10
+ tests:
11
+ test:
12
+ main: Tests.hs
13
+ source-dirs: test
14
+ dependencies:
15
+ - accumulate
16
+ - hspec
@@ -0,0 +1,16 @@
1
+ name: all-your-base
2
+
3
+ dependencies:
4
+ - base
5
+
6
+ library:
7
+ exposed-modules: Base
8
+ source-dirs: src
9
+
10
+ tests:
11
+ test:
12
+ main: Tests.hs
13
+ source-dirs: test
14
+ dependencies:
15
+ - all-your-base
16
+ - hspec
@@ -0,0 +1,16 @@
1
+ name: allergies
2
+
3
+ dependencies:
4
+ - base
5
+
6
+ library:
7
+ exposed-modules: Allergies
8
+ source-dirs: src
9
+
10
+ tests:
11
+ test:
12
+ main: Tests.hs
13
+ source-dirs: test
14
+ dependencies:
15
+ - allergies
16
+ - hspec
@@ -0,0 +1,5 @@
1
+ ## Hints
2
+
3
+ You can solve this exercise with a brute force algorithm, but this will possibly have a poor runtime performance.
4
+ Try to find a more sophisticated solution. Hint: You could try the column-wise addition algorithm that is usually taught in high school.
5
+
@@ -0,0 +1,18 @@
1
+ name: alphametics
2
+
3
+ dependencies:
4
+ - base
5
+
6
+ library:
7
+ exposed-modules: Alphametics
8
+ source-dirs: src
9
+ dependencies:
10
+ - parsec
11
+
12
+ tests:
13
+ test:
14
+ main: Tests.hs
15
+ source-dirs: test
16
+ dependencies:
17
+ - alphametics
18
+ - hspec
@@ -0,0 +1,116 @@
1
+ {-# LANGUAGE GADTs #-}
2
+ module Alphametics (solve) where
3
+
4
+ import Control.Monad (guard)
5
+ import Data.List (foldl', find, union)
6
+ import Data.Maybe (fromJust, isJust, listToMaybe)
7
+ import Prelude hiding (Word)
8
+ import Text.Parsec
9
+ import Text.Parsec.String
10
+
11
+ type Solution = [(Char, Int)]
12
+
13
+ solve :: String -> Maybe Solution
14
+ solve puzzle = do
15
+ boolTerm' <- parseTerm puzzle
16
+ let columns = [0..maxLength boolTerm' - 1]
17
+ emptySolutions = [([], (0, 0))]
18
+ solutions = foldl' (flip $ partialSolutions boolTerm') emptySolutions columns
19
+ fst <$> listToMaybe solutions
20
+
21
+ parseTerm :: String -> Maybe (Term Bool)
22
+ parseTerm str = either (const Nothing) Just parseResult
23
+ where parseResult = parse boolTerm "boolTerm" str
24
+
25
+ type PartialResult = (Integer, Integer) -- (result, carry)
26
+ type PartialSolution = (Solution, PartialResult)
27
+
28
+ partialSolutions :: Term a -> Int -> [PartialSolution] -> [PartialSolution]
29
+ partialSolutions (Word xs) col solutionsSoFar
30
+ | col >= length xs = solutionsSoFar -- pass, no more constraints from this word
31
+ | otherwise = mergePartialSolutions takeChar charSolutions solutionsSoFar
32
+ where
33
+ charSolutions = toCharSolution <$> [if firstChar then 1 else 0..9]
34
+ char' = reverse xs !! col -- process from the right
35
+ firstChar = head xs == char'
36
+ toCharSolution x = ([(char', x)], (toInteger x, 0))
37
+ takeChar (x, _) (_, y) = Just (x, y)
38
+ partialSolutions (Plus left right) col solutionsSoFar =
39
+ mergePartialSolutions addResults leftSolutions rightSolutions
40
+ where
41
+ leftSolutions = partialSolutions left col solutionsSoFar
42
+ rightSolutions = partialSolutions right col solutionsSoFar
43
+ addResults (x1, x2) (y1, _) = Just (x1 + y1, x2)
44
+ partialSolutions (Equals left right) col solutionsSoFar =
45
+ mergePartialSolutions equateResults leftSolutions rightSolutions
46
+ where
47
+ equateResults (leftResult, leftCarry) (rightResult, _)
48
+ | rightResult == requiredResult = Just (0, carry)
49
+ | otherwise = Nothing
50
+ where (carry, requiredResult) = (leftResult + leftCarry) `divMod` 10
51
+ leftSolutions = partialSolutions left col solutionsSoFar
52
+ rightSolutions = partialSolutions right col solutionsSoFar
53
+
54
+ mergePartialSolutions :: (PartialResult -> PartialResult -> Maybe PartialResult) ->
55
+ [PartialSolution] -> [PartialSolution] -> [PartialSolution]
56
+ mergePartialSolutions mergeResults xs ys = do
57
+ (xSolution, xResult) <- xs
58
+ (ySolution, yResult) <- ys
59
+ let mergedSolution = mergeSolutions xSolution ySolution
60
+ guard $ (not . null) mergedSolution
61
+ let mergedResult = mergeResults xResult yResult
62
+ guard $ isJust mergedResult
63
+ return (mergedSolution, fromJust mergedResult)
64
+ where
65
+ mergeSolutions :: Solution -> Solution -> Solution
66
+ mergeSolutions s1 s2
67
+ | any conflict s1 = []
68
+ | otherwise = s1 `union` s2
69
+ where
70
+ conflict (k1, v1) =
71
+ maybe False (/= v1) (lookup k1 s2) ||
72
+ maybe False ((/= k1) . fst) (find ((== v1) . snd) s2)
73
+
74
+ data Term a where
75
+ Word :: String -> Term Integer
76
+ Equals :: (Eq a) => Term a -> Term a -> Term Bool
77
+ Plus :: Term Integer -> Term Integer -> Term Integer
78
+
79
+ maxLength :: Term a -> Int
80
+ maxLength (Word xs) = length xs
81
+ maxLength (Equals l r) = max (maxLength l) (maxLength r)
82
+ maxLength (Plus l r) = max (maxLength l) (maxLength r)
83
+
84
+ -- Term Parser
85
+ boolTerm :: Parser (Term Bool)
86
+ boolTerm = do
87
+ left <- integerTerm
88
+ _ <- trimmed (string "==")
89
+ right <- integerTerm
90
+ return $ Equals left right
91
+
92
+ integerTerm :: Parser (Term Integer)
93
+ integerTerm = try integerOperation <|> simpleIntegerTerm
94
+
95
+ integerOperation :: Parser (Term Integer)
96
+ integerOperation = do
97
+ left <- simpleIntegerTerm
98
+ op <- integerOperator
99
+ right <- integerTerm
100
+ return $ op left right
101
+
102
+ simpleIntegerTerm :: Parser (Term Integer)
103
+ simpleIntegerTerm = word
104
+
105
+ integerOperator :: Parser (Term Integer -> Term Integer -> Term Integer)
106
+ integerOperator = plus
107
+
108
+ word :: Parser (Term Integer)
109
+ word = Word <$> many1 upper
110
+
111
+ plus :: Parser (Term Integer -> Term Integer -> Term Integer)
112
+ plus = trimmed (char '+') *> pure Plus
113
+
114
+ trimmed :: Parser a -> Parser a
115
+ trimmed p = spaces *> p <* spaces
116
+