trackler 2.0.0.1 → 2.0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (226) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bump-content +3 -1
  3. data/bin/verify-metadata +2 -2
  4. data/common/exercises/alphametics/canonical-data.json +19 -9
  5. data/common/exercises/food-chain/canonical-data.json +7 -1
  6. data/common/exercises/grains/canonical-data.json +66 -0
  7. data/common/exercises/raindrops/description.md +4 -5
  8. data/common/exercises/triangle/canonical-data.json +81 -54
  9. data/lib/trackler/version.rb +1 -1
  10. data/tracks/c/config.json +26 -19
  11. data/tracks/c/exercises/allergies/makefile +15 -0
  12. data/tracks/c/exercises/allergies/src/allergies.h +21 -0
  13. data/tracks/c/exercises/allergies/src/example.c +32 -0
  14. data/tracks/c/exercises/allergies/src/example.h +26 -0
  15. data/tracks/c/exercises/allergies/test/test_allergies.c +203 -0
  16. data/tracks/c/exercises/allergies/test/vendor/unity.c +1300 -0
  17. data/tracks/c/exercises/allergies/test/vendor/unity.h +274 -0
  18. data/tracks/c/exercises/allergies/test/vendor/unity_internals.h +701 -0
  19. data/tracks/c/exercises/atbash-cipher/makefile +16 -0
  20. data/tracks/c/exercises/atbash-cipher/src/example.c +71 -0
  21. data/tracks/c/exercises/atbash-cipher/src/example.h +7 -0
  22. data/tracks/c/exercises/atbash-cipher/test/test_atbash_cipher.c +113 -0
  23. data/tracks/c/exercises/atbash-cipher/test/vendor/unity.c +1300 -0
  24. data/tracks/c/exercises/atbash-cipher/test/vendor/unity.h +274 -0
  25. data/tracks/c/exercises/atbash-cipher/test/vendor/unity_internals.h +701 -0
  26. data/tracks/c/exercises/phone-number/makefile +16 -0
  27. data/tracks/c/exercises/phone-number/src/example.c +66 -0
  28. data/tracks/c/exercises/phone-number/src/example.h +8 -0
  29. data/tracks/c/exercises/phone-number/test/test_phone_number.c +108 -0
  30. data/tracks/c/exercises/phone-number/test/vendor/unity.c +1300 -0
  31. data/tracks/c/exercises/phone-number/test/vendor/unity.h +274 -0
  32. data/tracks/c/exercises/phone-number/test/vendor/unity_internals.h +701 -0
  33. data/tracks/csharp/config.json +8 -0
  34. data/tracks/csharp/exercises/bowling/BowlingTest.cs +188 -33
  35. data/tracks/csharp/exercises/bowling/Example.cs +38 -9
  36. data/tracks/csharp/exercises/rectangles/Example.cs +91 -0
  37. data/tracks/csharp/exercises/rectangles/RectanglesTest.cs +133 -0
  38. data/tracks/elisp/docs/INSTALLATION.org +1 -1
  39. data/tracks/elixir/config.json +8 -66
  40. data/tracks/elixir/docs/LEARNING.md +1 -1
  41. data/tracks/elixir/exercises/diamond/diamond_test.exs +12 -12
  42. data/tracks/elixir/exercises/grep/example.exs +92 -0
  43. data/tracks/elixir/exercises/grep/grep.exs +6 -0
  44. data/tracks/elixir/exercises/grep/grep_test.exs +259 -0
  45. data/tracks/elixir/exercises/markdown/markdown.exs +59 -2
  46. data/tracks/elixir/exercises/nucleotide-count/nucleotide_count_test.exs +4 -4
  47. data/tracks/elixir/exercises/phone-number/phone_number_test.exs +5 -0
  48. data/tracks/fsharp/exercises/bowling/BowlingTest.fs +158 -43
  49. data/tracks/fsharp/exercises/bowling/Example.fs +53 -24
  50. data/tracks/go/config.json +5 -0
  51. data/tracks/go/exercises/diamond/diamond_test.go +227 -0
  52. data/tracks/go/exercises/diamond/example.go +47 -0
  53. data/tracks/go/exercises/food-chain/example.go +1 -1
  54. data/tracks/go/exercises/food-chain/food_chain_test.go +30 -6
  55. data/tracks/go/exercises/nucleotide-count/example.go +21 -8
  56. data/tracks/go/exercises/nucleotide-count/nucleotide_count_test.go +45 -37
  57. data/tracks/haskell/exercises/anagram/test/Tests.hs +1 -11
  58. data/tracks/java/bin/journey-test.sh +165 -128
  59. data/tracks/java/docs/ABOUT.md +5 -8
  60. data/tracks/java/exercises/hello-world/build.gradle +0 -6
  61. data/tracks/java/exercises/hello-world/src/test/java/HelloWorldTest.java +0 -1
  62. data/tracks/java/exercises/meetup/build.gradle +0 -1
  63. data/tracks/java/exercises/meetup/src/example/java/Meetup.java +9 -7
  64. data/tracks/java/exercises/meetup/src/test/java/MeetupTest.java +185 -188
  65. data/tracks/lua/config.json +0 -73
  66. data/tracks/lua/exercises/bowling/bowling_spec.lua +92 -48
  67. data/tracks/lua/exercises/bowling/example.lua +4 -1
  68. data/tracks/objective-c/config.json +9 -30
  69. data/tracks/objective-c/exercises/pangram/PangramExample.h +7 -0
  70. data/tracks/objective-c/exercises/pangram/PangramExample.m +21 -0
  71. data/tracks/objective-c/exercises/pangram/PangramTest.m +51 -0
  72. data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +18 -0
  73. data/tracks/ocaml/README.md +46 -1
  74. data/tracks/ocaml/SETUP.md +21 -2
  75. data/tracks/ocaml/config.json +48 -78
  76. data/tracks/perl5/README.md +15 -8
  77. data/tracks/perl5/testall.pl +5 -5
  78. data/tracks/php/config.json +26 -34
  79. data/tracks/php/docs/ABOUT.md +15 -0
  80. data/tracks/php/exercises/allergies/allergies_test.php +121 -0
  81. data/tracks/php/exercises/allergies/example.php +64 -0
  82. data/tracks/php/exercises/etl/etl_test.php +52 -0
  83. data/tracks/php/exercises/etl/example.php +12 -0
  84. data/tracks/php/exercises/nucleotide-count/example.php +25 -0
  85. data/tracks/php/exercises/nucleotide-count/nucleotide-count_test.php +36 -0
  86. data/tracks/php/exercises/pig-latin/example.php +25 -29
  87. data/tracks/php/exercises/pig-latin/pig-latin_test.php +26 -19
  88. data/tracks/php/exercises/space-age/example.php +65 -0
  89. data/tracks/php/exercises/space-age/space-age_test.php +70 -0
  90. data/tracks/php/exercises/triangle/example.php +43 -0
  91. data/tracks/php/exercises/triangle/triangle_test.php +140 -0
  92. data/tracks/pony/exercises/anagram/example.pony +6 -6
  93. data/tracks/pony/exercises/anagram/test.pony +3 -4
  94. data/tracks/pony/exercises/bob/test.pony +23 -23
  95. data/tracks/pony/exercises/difference-of-squares/test.pony +11 -11
  96. data/tracks/pony/exercises/hamming/example.pony +3 -3
  97. data/tracks/pony/exercises/hamming/test.pony +16 -16
  98. data/tracks/pony/exercises/hello-world/test.pony +5 -4
  99. data/tracks/pony/exercises/leap/test.pony +8 -8
  100. data/tracks/python/config.json +18 -0
  101. data/tracks/python/exercises/diamond/diamond_test.py +33 -0
  102. data/tracks/python/exercises/diamond/example.py +15 -0
  103. data/tracks/python/exercises/linked-list/example.py +47 -0
  104. data/tracks/python/exercises/linked-list/linked_list.py +13 -0
  105. data/tracks/python/exercises/linked-list/linked_list_test.py +49 -0
  106. data/tracks/python/exercises/list-ops/example.py +55 -0
  107. data/tracks/python/exercises/list-ops/list_ops.py +38 -0
  108. data/tracks/python/exercises/list-ops/list_ops_test.py +136 -0
  109. data/tracks/ruby/bin/generate +22 -2
  110. data/tracks/ruby/config.json +12 -83
  111. data/tracks/ruby/exercises/allergies/allergies_test.rb +0 -1
  112. data/tracks/ruby/exercises/atbash-cipher/atbash_cipher_test.rb +0 -1
  113. data/tracks/ruby/exercises/beer-song/beer_song_test.rb +1 -2
  114. data/tracks/ruby/exercises/binary/example.rb +0 -1
  115. data/tracks/ruby/exercises/binary-search-tree/binary_search_tree_test.rb +1 -1
  116. data/tracks/ruby/exercises/bowling/.version +1 -0
  117. data/tracks/ruby/exercises/bowling/bowling_test.rb +109 -133
  118. data/tracks/ruby/exercises/bowling/example.rb +7 -7
  119. data/tracks/ruby/exercises/bowling/example.tt +27 -0
  120. data/tracks/ruby/exercises/circular-buffer/circular_buffer_test.rb +0 -2
  121. data/tracks/ruby/exercises/clock/example.rb +0 -2
  122. data/tracks/ruby/exercises/connect/connect_test.rb +0 -1
  123. data/tracks/ruby/exercises/custom-set/custom_set_test.rb +0 -1
  124. data/tracks/ruby/exercises/diamond/diamond_test.rb +0 -1
  125. data/tracks/ruby/exercises/etl/etl_test.rb +1 -1
  126. data/tracks/ruby/exercises/house/house_test.rb +0 -1
  127. data/tracks/ruby/exercises/isogram/isogram_test.rb +2 -2
  128. data/tracks/ruby/exercises/largest-series-product/example.tt +0 -3
  129. data/tracks/ruby/exercises/largest-series-product/largest_series_product_test.rb +0 -4
  130. data/tracks/ruby/exercises/linked-list/linked_list_test.rb +1 -1
  131. data/tracks/ruby/exercises/meetup/meetup_test.rb +0 -1
  132. data/tracks/ruby/exercises/nth-prime/example.tt +0 -2
  133. data/tracks/ruby/exercises/nth-prime/nth_prime_test.rb +0 -2
  134. data/tracks/ruby/exercises/ocr-numbers/ocr_numbers_test.rb +1 -2
  135. data/tracks/ruby/exercises/protein-translation/protein_translation_test.rb +0 -1
  136. data/tracks/ruby/exercises/proverb/proverb_test.rb +1 -3
  137. data/tracks/ruby/exercises/queen-attack/example.rb +3 -1
  138. data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +34 -8
  139. data/tracks/ruby/exercises/robot-simulator/robot_simulator_test.rb +1 -1
  140. data/tracks/ruby/exercises/strain/strain_test.rb +2 -2
  141. data/tracks/ruby/exercises/tournament/.version +1 -0
  142. data/tracks/ruby/exercises/tournament/example.rb +54 -0
  143. data/tracks/ruby/exercises/tournament/example.tt +23 -0
  144. data/tracks/ruby/exercises/tournament/tournament_test.rb +92 -0
  145. data/tracks/ruby/exercises/transpose/.version +1 -0
  146. data/tracks/ruby/exercises/transpose/example.rb +14 -0
  147. data/tracks/ruby/exercises/transpose/example.tt +22 -0
  148. data/tracks/ruby/exercises/transpose/transpose_test.rb +303 -0
  149. data/tracks/ruby/lib/bowling_cases.rb +46 -0
  150. data/tracks/ruby/lib/isogram_cases.rb +1 -1
  151. data/tracks/ruby/lib/tournament_cases.rb +45 -0
  152. data/tracks/ruby/lib/transpose_cases.rb +45 -0
  153. data/tracks/rust/config.json +2 -0
  154. data/tracks/rust/exercises/bowling/.gitignore +7 -0
  155. data/tracks/rust/exercises/bowling/Cargo.toml +3 -0
  156. data/tracks/rust/exercises/bowling/example.rs +134 -0
  157. data/tracks/rust/exercises/bowling/tests/bowling.rs +373 -0
  158. data/tracks/rust/exercises/grains/.gitignore +7 -0
  159. data/tracks/rust/exercises/grains/Cargo.toml +3 -0
  160. data/tracks/rust/exercises/grains/example.rs +11 -0
  161. data/tracks/rust/exercises/grains/src/lib.rs +7 -0
  162. data/tracks/rust/exercises/grains/tests/grains.rs +63 -0
  163. data/tracks/rust/problems.md +2 -0
  164. data/tracks/scala/README.md +38 -0
  165. data/tracks/scala/config.json +20 -74
  166. data/tracks/scala/exercises/accumulate/src/test/scala/accumulate_test.scala +4 -0
  167. data/tracks/scala/exercises/allergies/src/test/scala/allergies_test.scala +11 -0
  168. data/tracks/scala/exercises/alphametics/build.sbt +6 -0
  169. data/tracks/scala/exercises/alphametics/example.scala +125 -0
  170. data/tracks/scala/exercises/alphametics/src/main/scala/.keep +0 -0
  171. data/tracks/scala/exercises/alphametics/src/test/scala/AlphameticsTest.scala +62 -0
  172. data/tracks/scala/exercises/atbash-cipher/src/test/scala/atbash_test.scala +8 -0
  173. data/tracks/scala/exercises/bank-account/src/test/scala/BankAccountTest.scala +4 -0
  174. data/tracks/scala/exercises/binary/src/test/scala/binary_test.scala +13 -0
  175. data/tracks/scala/exercises/binary-search-tree/src/test/scala/BstTest.scala +11 -0
  176. data/tracks/scala/exercises/bowling/Example.scala +116 -0
  177. data/tracks/scala/exercises/bowling/build.sbt +3 -0
  178. data/tracks/scala/exercises/bowling/src/main/scala/Bowling.scala +11 -0
  179. data/tracks/scala/exercises/bowling/src/test/scala/BowlingSuite.scala +237 -0
  180. data/tracks/scala/exercises/clock/src/test/scala/ClockTest.scala +50 -0
  181. data/tracks/scala/exercises/connect/README.md +17 -0
  182. data/tracks/scala/exercises/connect/src/test/scala/ConnectTest.scala +7 -0
  183. data/tracks/scala/exercises/crypto-square/src/test/scala/{CrytpoSquareTest.scala → CryptoSquareTest.scala} +9 -0
  184. data/tracks/scala/exercises/custom-set/src/test/scala/CustomSetTest.scala +36 -0
  185. data/tracks/scala/exercises/difference-of-squares/src/test/scala/squares_test.scala +8 -0
  186. data/tracks/scala/exercises/forth/src/test/scala/ForthTest.scala +22 -0
  187. data/tracks/scala/exercises/hexadecimal/src/test/scala/HexadecimalTest.scala +8 -0
  188. data/tracks/scala/exercises/kindergarten-garden/src/test/scala/GardenTest.scala +5 -0
  189. data/tracks/scala/exercises/largest-series-product/src/test/scala/SeriesTest.scala +2 -0
  190. data/tracks/scala/exercises/linked-list/src/test/scala/DequeTest.scala +4 -0
  191. data/tracks/scala/exercises/luhn/src/test/scala/LuhnTest.scala +4 -0
  192. data/tracks/scala/exercises/matrix/src/test/scala/MatrixTest.scala +2 -0
  193. data/tracks/scala/exercises/minesweeper/src/test/scala/MinesweeperTest.scala +6 -0
  194. data/tracks/scala/exercises/nth-prime/src/test/scala/PrimeTest.scala +5 -0
  195. data/tracks/scala/exercises/ocr-numbers/src/test/scala/OcrTest.scala +15 -0
  196. data/tracks/scala/exercises/octal/src/test/scala/OctalTest.scala +7 -0
  197. data/tracks/scala/exercises/parallel-letter-frequency/src/test/scala/FrequencyTest.scala +8 -0
  198. data/tracks/scala/exercises/pascals-triangle/src/test/scala/PascalsTriangleTest.scala +5 -0
  199. data/tracks/scala/exercises/pig-latin/src/test/scala/PigLatinTest.scala +4 -0
  200. data/tracks/scala/exercises/pythagorean-triplet/src/test/scala/PythagoreanTripletTest.scala +3 -0
  201. data/tracks/scala/exercises/queen-attack/src/test/scala/QueensTest.scala +5 -0
  202. data/tracks/scala/exercises/robot-simulator/src/test/scala/RobotTest.scala +16 -8
  203. data/tracks/scala/exercises/say/src/test/scala/SayTest.scala +34 -17
  204. data/tracks/scala/exercises/scrabble-score/src/test/scala/scrabble_score_test.scala +6 -0
  205. data/tracks/scala/exercises/secret-handshake/src/test/scala/SecretHandshakeTest.scala +18 -9
  206. data/tracks/scala/exercises/series/src/test/scala/SeriesTest.scala +4 -2
  207. data/tracks/scala/exercises/sieve/src/test/scala/SieveTest.scala +8 -4
  208. data/tracks/scala/exercises/simple-cipher/src/test/scala/CipherTest.scala +17 -9
  209. data/tracks/scala/exercises/sublist/src/test/scala/sublist_test.scala +17 -0
  210. data/tracks/scala/exercises/trinary/src/test/scala/TrinaryTest.scala +14 -7
  211. data/tracks/scala/exercises/wordy/src/test/scala/WordProblemTest.scala +28 -14
  212. data/tracks/scala/project/Build.scala +3 -3
  213. data/tracks/scala/testgen/src/main/scala/BowlingTestGenerator.scala +57 -0
  214. data/tracks/sml/config.json +41 -6
  215. data/tracks/sml/exercises/flatten-array/example.sml +6 -0
  216. data/tracks/sml/exercises/flatten-array/test_flatten_array.sml +10 -0
  217. data/tracks/sml/exercises/nth-prime/example.sml +46 -0
  218. data/tracks/sml/exercises/nth-prime/test_nth_prime.sml +14 -0
  219. data/tracks/sml/exercises/raindrops/example.sml +9 -0
  220. data/tracks/sml/exercises/raindrops/raindrops.sml +2 -0
  221. data/tracks/sml/exercises/raindrops/test_raindrops.sml +95 -0
  222. data/tracks/swift/config.json +269 -328
  223. data/tracks/swift/exercises/pangram/PangramExample.swift +17 -0
  224. data/tracks/swift/exercises/pangram/PangramTest.swift +43 -0
  225. data/tracks/swift/xcodeProject/xSwift.xcodeproj/project.pbxproj +16 -0
  226. metadata +95 -3
@@ -3,36 +3,6 @@
3
3
  "language": "OCaml",
4
4
  "repository": "https://github.com/exercism/xocaml",
5
5
  "active": true,
6
- "problems": [
7
- "hello-world",
8
- "bob",
9
- "difference-of-squares",
10
- "list-ops",
11
- "leap",
12
- "word-count",
13
- "anagram",
14
- "beer-song",
15
- "nucleotide-count",
16
- "rna-transcription",
17
- "raindrops",
18
- "hamming",
19
- "phone-number",
20
- "grade-school",
21
- "space-age",
22
- "roman-numerals",
23
- "custom-set",
24
- "bowling",
25
- "minesweeper",
26
- "prime-factors",
27
- "etl",
28
- "hexadecimal",
29
- "atbash-cipher",
30
- "luhn",
31
- "say",
32
- "meetup",
33
- "zipper",
34
- "hangman"
35
- ],
36
6
  "exercises": [
37
7
  {
38
8
  "slug": "hello-world",
@@ -40,138 +10,138 @@
40
10
  "topics": []
41
11
  },
42
12
  {
43
- "slug": "bob",
13
+ "slug": "leap",
44
14
  "difficulty": 1,
45
15
  "topics": []
46
16
  },
47
17
  {
48
- "slug": "difference-of-squares",
49
- "difficulty": 1,
18
+ "slug": "hamming",
19
+ "difficulty": 2,
50
20
  "topics": []
51
21
  },
52
22
  {
53
- "slug": "list-ops",
54
- "difficulty": 1,
23
+ "slug": "raindrops",
24
+ "difficulty": 2,
55
25
  "topics": []
56
26
  },
57
27
  {
58
- "slug": "leap",
59
- "difficulty": 1,
28
+ "slug": "difference-of-squares",
29
+ "difficulty": 2,
60
30
  "topics": []
61
31
  },
62
32
  {
63
- "slug": "word-count",
64
- "difficulty": 1,
33
+ "slug": "rna-transcription",
34
+ "difficulty": 2,
65
35
  "topics": []
66
36
  },
67
37
  {
68
- "slug": "anagram",
69
- "difficulty": 1,
38
+ "slug": "nucleotide-count",
39
+ "difficulty": 2,
70
40
  "topics": []
71
41
  },
72
42
  {
73
- "slug": "beer-song",
74
- "difficulty": 1,
43
+ "slug": "etl",
44
+ "difficulty": 3,
75
45
  "topics": []
76
46
  },
77
47
  {
78
- "slug": "nucleotide-count",
79
- "difficulty": 1,
48
+ "slug": "grade-school",
49
+ "difficulty": 3,
80
50
  "topics": []
81
51
  },
82
52
  {
83
- "slug": "rna-transcription",
84
- "difficulty": 1,
53
+ "slug": "bob",
54
+ "difficulty": 3,
85
55
  "topics": []
86
56
  },
87
57
  {
88
- "slug": "raindrops",
89
- "difficulty": 1,
58
+ "slug": "hexadecimal",
59
+ "difficulty": 3,
90
60
  "topics": []
91
61
  },
92
62
  {
93
- "slug": "hamming",
94
- "difficulty": 1,
63
+ "slug": "anagram",
64
+ "difficulty": 3,
95
65
  "topics": []
96
66
  },
97
67
  {
98
- "slug": "phone-number",
99
- "difficulty": 1,
68
+ "slug": "space-age",
69
+ "difficulty": 3,
100
70
  "topics": []
101
71
  },
102
72
  {
103
- "slug": "grade-school",
104
- "difficulty": 1,
73
+ "slug": "bowling",
74
+ "difficulty": 4,
105
75
  "topics": []
106
76
  },
107
77
  {
108
- "slug": "space-age",
109
- "difficulty": 1,
78
+ "slug": "luhn",
79
+ "difficulty": 4,
110
80
  "topics": []
111
81
  },
112
82
  {
113
- "slug": "roman-numerals",
114
- "difficulty": 1,
83
+ "slug": "phone-number",
84
+ "difficulty": 4,
115
85
  "topics": []
116
86
  },
117
87
  {
118
- "slug": "custom-set",
119
- "difficulty": 1,
88
+ "slug": "word-count",
89
+ "difficulty": 4,
120
90
  "topics": []
121
91
  },
122
92
  {
123
- "slug": "bowling",
124
- "difficulty": 1,
93
+ "slug": "beer-song",
94
+ "difficulty": 4,
125
95
  "topics": []
126
96
  },
127
97
  {
128
- "slug": "minesweeper",
129
- "difficulty": 1,
98
+ "slug": "roman-numerals",
99
+ "difficulty": 5,
130
100
  "topics": []
131
101
  },
132
102
  {
133
103
  "slug": "prime-factors",
134
- "difficulty": 1,
104
+ "difficulty": 5,
135
105
  "topics": []
136
106
  },
137
107
  {
138
- "slug": "etl",
139
- "difficulty": 1,
108
+ "slug": "say",
109
+ "difficulty": 5,
140
110
  "topics": []
141
111
  },
142
112
  {
143
- "slug": "hexadecimal",
144
- "difficulty": 1,
113
+ "slug": "list-ops",
114
+ "difficulty": 6,
145
115
  "topics": []
146
116
  },
147
117
  {
148
118
  "slug": "atbash-cipher",
149
- "difficulty": 1,
119
+ "difficulty": 7,
150
120
  "topics": []
151
121
  },
152
122
  {
153
- "slug": "luhn",
154
- "difficulty": 1,
123
+ "slug": "minesweeper",
124
+ "difficulty": 7,
155
125
  "topics": []
156
126
  },
157
127
  {
158
- "slug": "say",
159
- "difficulty": 1,
128
+ "slug": "custom-set",
129
+ "difficulty": 8,
160
130
  "topics": []
161
131
  },
162
132
  {
163
133
  "slug": "meetup",
164
- "difficulty": 1,
134
+ "difficulty": 9,
165
135
  "topics": ["Dates"]
166
136
  },
167
137
  {
168
138
  "slug": "zipper",
169
- "difficulty": 1,
139
+ "difficulty": 10,
170
140
  "topics": []
171
141
  },
172
142
  {
173
143
  "slug": "hangman",
174
- "difficulty": 1,
144
+ "difficulty": 10,
175
145
  "topics": []
176
146
  }
177
147
  ],
@@ -2,6 +2,10 @@
2
2
 
3
3
  Exercism exercises in Perl 5
4
4
 
5
+ ## Dependencies
6
+
7
+ The tests depend on the JSON.pm module.
8
+
5
9
  ## Testing the Tests
6
10
 
7
11
  When the tests are run they expect a module with some real name (e.g. Anagram.pm)
@@ -12,23 +16,26 @@ If they are called /*example.*/i they won't be copied to the users. (which is a
12
16
 
13
17
  So the sample solutions are all called Example.pm.
14
18
 
15
- Each test file will look for the appropriate module name, but if the test are run as
19
+ ### Testing All the Exercises
16
20
 
17
- EXERCISM=1 perl file.t
21
+ Run the full tests with
18
22
 
19
- then they will expect a file called Example.pm
23
+ perl testall.pl
20
24
 
21
- ## Contributing Guide
25
+ ### Testing a Single Exercise
22
26
 
23
- Please see the [contributing guide](https://github.com/exercism/x-api/blob/master/CONTRIBUTING.md#the-exercise-data)
27
+ Each test file will look for the appropriate module name, but if the test are run as
24
28
 
25
- ## License
29
+ EXERCISM=1 perl file.t
26
30
 
27
- The MIT License (MIT)
31
+ then they will expect a file called Example.pm
28
32
 
29
- Copyright (c) 2014 Katrina Owen, _@kytrinyx.com
33
+ ## Contributing Guide
34
+
35
+ Please see the [contributing guide](https://github.com/exercism/x-common/blob/master/CONTRIBUTING.md)
30
36
 
31
37
  ### Perl 5 icon
38
+
32
39
  The onion is the logo of the Perl Foundation.
33
40
  It is trademarked, and we have adapted it--changing the color--with their permission.
34
41
  The Perl Foundation does not support or endorse Exercism.
@@ -9,10 +9,10 @@ close $dh;
9
9
  $ENV{EXERCISM} = 1;
10
10
  foreach my $d (@dirs) {
11
11
  say $d;
12
- chdir $d;
13
- opendir my $dh, '.' or die;
14
- my ($test) = grep { /\.t$/ } readdir $dh;
15
- close $dh;
12
+ chdir $d;
13
+ opendir my $dh, '.' or die;
14
+ my ($test) = grep { /\.t$/ } readdir $dh;
15
+ close $dh;
16
16
  system "prove $test";
17
- chdir '..';
17
+ chdir '..';
18
18
  }
@@ -3,39 +3,6 @@
3
3
  "language": "PHP",
4
4
  "repository": "https://github.com/exercism/xphp",
5
5
  "active": true,
6
- "problems": [
7
- "hello-world",
8
- "hamming",
9
- "gigasecond",
10
- "bob",
11
- "pangram",
12
- "rna-transcription",
13
- "raindrops",
14
- "isogram",
15
- "difference-of-squares",
16
- "largest-series-product",
17
- "roman-numerals",
18
- "pig-latin",
19
- "robot-name",
20
- "leap",
21
- "word-count",
22
- "anagram",
23
- "trinary",
24
- "bowling",
25
- "clock",
26
- "wordy",
27
- "connect",
28
- "minesweeper",
29
- "change",
30
- "phone-number",
31
- "beer-song",
32
- "atbash-cipher",
33
- "binary",
34
- "braket-push",
35
- "accumulate",
36
- "variable-length-quantity",
37
- "acronym"
38
- ],
39
6
  "deprecated": [
40
7
 
41
8
  ],
@@ -201,6 +168,31 @@
201
168
  "slug": "acronym",
202
169
  "difficulty": 1,
203
170
  "topics": []
171
+ },
172
+ {
173
+ "slug": "nucleotide-count",
174
+ "difficulty": 1,
175
+ "topics": []
176
+ },
177
+ {
178
+ "slug": "triangle",
179
+ "difficulty": 1,
180
+ "topics": []
181
+ },
182
+ {
183
+ "slug": "etl",
184
+ "difficulty": 1,
185
+ "topics": []
186
+ },
187
+ {
188
+ "slug": "space-age",
189
+ "difficulty": 1,
190
+ "topics": []
191
+ },
192
+ {
193
+ "slug": "allergies",
194
+ "difficulty": 3,
195
+ "topics": []
204
196
  }
205
- ]
197
+ ]
206
198
  }
@@ -0,0 +1,15 @@
1
+ PHP is a server-side language suited towards web development. The acronym is recursive, standing for *PHP: Hypertext Preprocessor*.
2
+
3
+ Considerably more versatile than CGI scripting, PHP is often used to add interactivity to plain HTML and bolster web frameworks.
4
+
5
+ The language can be employed on any operating system. PHP is supported by most common web servers and is often handled through an interpreter module. This combines static web code with dynamic inclusions.
6
+
7
+ PHP isn't just a web server framework. It's also useful for command-line scripting (headless parsing) and developing GUIs.
8
+
9
+ You should learn PHP because:
10
+
11
+ * it's an Open Source language
12
+ * it's well-documented and supported
13
+ * it's compatible with most common web servers
14
+ * it's easy to pick up and start learning
15
+ * it's highly scalable and extensible
@@ -0,0 +1,121 @@
1
+ <?php
2
+
3
+ require "allergies.php";
4
+
5
+ class AllergiesTest extends \PHPUnit_Framework_TestCase
6
+ {
7
+
8
+ /**
9
+ * @dataProvider provideListOfAllergen
10
+ */
11
+ public function testNoAllergiesMeansNotAllergicToAnything($allergen)
12
+ {
13
+ $allergies = new Allergies(0);
14
+
15
+ $this->assertFalse($allergies->isAllergicTo($allergen));
16
+ }
17
+
18
+ /**
19
+ * @dataProvider provideListOfAllergen
20
+ */
21
+ public function testAllergiesToOneAllergen($allergicTo)
22
+ {
23
+ $this->markTestSkipped();
24
+ $allergies = new Allergies($allergicTo->getScore());
25
+
26
+ $this->assertTrue($allergies->isAllergicTo($allergicTo));
27
+ $otherAllergen = array_filter(Allergen::allergenList(), function ($allergen) use ($allergicTo) {
28
+ return $allergen != $allergicTo;
29
+ });
30
+ $self = $this;
31
+ array_map(function ($allergen) use ($allergies, $self) {
32
+ $self->assertFalse($allergies->isAllergicTo($allergen));
33
+ }, $otherAllergen);
34
+ }
35
+
36
+ public function provideListOfAllergen()
37
+ {
38
+ return [
39
+ [new Allergen(Allergen::CATS), 'Only allergic to cats'],
40
+ [new Allergen(Allergen::CHOCOLATE), 'Only allergic to chocolate'],
41
+ [new Allergen(Allergen::EGGS), 'Only allergic to eggs'],
42
+ [new Allergen(Allergen::PEANUTS), 'Only allergic to peanuts'],
43
+ [new Allergen(Allergen::POLLEN), 'Only allergic to pollen'],
44
+ [new Allergen(Allergen::SHELLFISH), 'Only allergic to shellfish'],
45
+ [new Allergen(Allergen::STRAWBERRIES), 'Only allergic to strawberries'],
46
+ [new Allergen(Allergen::TOMATOES), 'Only allergic to tomatoes'],
47
+ ];
48
+ }
49
+
50
+ public function testAllergicToEggsInAdditionToOtherStuff()
51
+ {
52
+ $this->markTestSkipped();
53
+ $allergies = new Allergies(5);
54
+
55
+ $this->assertTrue($allergies->isAllergicTo(new Allergen(Allergen::EGGS)));
56
+ }
57
+
58
+
59
+ public function testIsAllergicToLotsOfStuffs()
60
+ {
61
+ $this->markTestSkipped();
62
+ $allergies = new Allergies(248);
63
+
64
+ $this->assertEquals([
65
+ new Allergen(Allergen::CATS),
66
+ new Allergen(Allergen::CHOCOLATE),
67
+ new Allergen(Allergen::POLLEN),
68
+ new Allergen(Allergen::STRAWBERRIES),
69
+ new Allergen(Allergen::TOMATOES),
70
+ ], $allergies->getList(), "\$canonicalize = true", $delta = 0.0, $maxDepth = 10, $canonicalize = true);
71
+ }
72
+
73
+ public function testIsAllergicToEggsAndPeanuts()
74
+ {
75
+ $this->markTestSkipped();
76
+ $allergies = new Allergies(3);
77
+
78
+ $this->assertEquals([
79
+ new Allergen(Allergen::EGGS),
80
+ new Allergen(Allergen::PEANUTS),
81
+ ], $allergies->getList(), "\$canonicalize = true", $delta = 0.0, $maxDepth = 10, $canonicalize = true);
82
+ }
83
+
84
+ public function testIsAllergicToEgssAndShellfish()
85
+ {
86
+ $this->markTestSkipped();
87
+ $allergies = new Allergies(5);
88
+
89
+ $this->assertEquals([
90
+ new Allergen(Allergen::EGGS),
91
+ new Allergen(Allergen::SHELLFISH),
92
+ ], $allergies->getList(), "\$canonicalize = true", $delta = 0.0, $maxDepth = 10, $canonicalize = true);
93
+ }
94
+
95
+ public function testIgnoreNonAllergenScorePart()
96
+ {
97
+ $this->markTestSkipped();
98
+ $allergies = new Allergies(509);
99
+
100
+ $this->assertEquals([
101
+ new Allergen(Allergen::CATS),
102
+ new Allergen(Allergen::CHOCOLATE),
103
+ new Allergen(Allergen::EGGS),
104
+ new Allergen(Allergen::POLLEN),
105
+ new Allergen(Allergen::SHELLFISH),
106
+ new Allergen(Allergen::STRAWBERRIES),
107
+ new Allergen(Allergen::TOMATOES),
108
+ ], $allergies->getList(), "\$canonicalize = true", $delta = 0.0, $maxDepth = 10, $canonicalize = true);
109
+ }
110
+
111
+ /**
112
+ * @dataProvider provideListOfAllergen
113
+ */
114
+ public function testIsAllergicToEverything($allergen)
115
+ {
116
+ $this->markTestSkipped();
117
+ $allergies = new Allergies(255);
118
+
119
+ $this->assertTrue($allergies->isAllergicTo($allergen));
120
+ }
121
+ }
@@ -0,0 +1,64 @@
1
+ <?php
2
+
3
+ class Allergies
4
+ {
5
+ private $score;
6
+
7
+ public function __construct($score)
8
+ {
9
+ $this->score = $score;
10
+ }
11
+
12
+ public function getList()
13
+ {
14
+ $score = $this->score;
15
+ return array_filter(Allergen::allergenList(), function ($allergen) use ($score) {
16
+ return $this->isAllergicTo($allergen);
17
+ });
18
+ }
19
+
20
+ public function isAllergicTo(Allergen $allergen)
21
+ {
22
+ return ($this->score & $allergen->getScore()) == $allergen->getScore();
23
+ }
24
+ }
25
+
26
+
27
+ class Allergen
28
+ {
29
+
30
+ const EGGS = 1;
31
+ const PEANUTS = 2;
32
+ const SHELLFISH = 4;
33
+ const STRAWBERRIES = 8;
34
+ const TOMATOES = 16;
35
+ const CHOCOLATE = 32;
36
+ const POLLEN = 64;
37
+ const CATS = 128;
38
+
39
+ private $score;
40
+
41
+ public function __construct($score)
42
+ {
43
+ $this->score = $score;
44
+ }
45
+
46
+ public function getScore()
47
+ {
48
+ return $this->score;
49
+ }
50
+
51
+ public static function allergenList()
52
+ {
53
+ return [
54
+ new Allergen(Allergen::CATS),
55
+ new Allergen(Allergen::CHOCOLATE),
56
+ new Allergen(Allergen::EGGS),
57
+ new Allergen(Allergen::PEANUTS),
58
+ new Allergen(Allergen::POLLEN),
59
+ new Allergen(Allergen::SHELLFISH),
60
+ new Allergen(Allergen::STRAWBERRIES),
61
+ new Allergen(Allergen::TOMATOES),
62
+ ];
63
+ }
64
+ }
@@ -0,0 +1,52 @@
1
+ <?php
2
+
3
+ require "etl.php";
4
+
5
+ class TransformTest extends PHPUnit_Framework_TestCase
6
+ {
7
+ public function testTransformOneValue()
8
+ {
9
+ $old = [ '1' => ['A'] ];
10
+ $expected = [ 'a' => 1 ];
11
+ $this->assertEquals($expected, transform($old));
12
+ }
13
+
14
+ public function testTransformMoreValues()
15
+ {
16
+ $this->markTestSkipped();
17
+ $old = [ '1' => str_split('AEIOU') ];
18
+ $expected = [ 'a' => 1, 'e' => 1, 'i' => 1, 'o' => 1, 'u' => 1 ];
19
+ $this->assertEquals($expected, transform($old));
20
+ }
21
+
22
+ public function testTransformMoreKeys()
23
+ {
24
+ $this->markTestSkipped();
25
+ $old = [ '1' => str_split('AE'), '2' => str_split('DG') ];
26
+ $expected = [ 'a' => 1, 'e' => 1, 'd' => 2, 'g' => 2 ];
27
+ $this->assertEquals($expected, transform($old));
28
+ }
29
+
30
+ public function testTransformFullDataset()
31
+ {
32
+ $this->markTestSkipped();
33
+ $old = [
34
+ '1' => str_split('AEIOULNRST'),
35
+ '2' => str_split('DG'),
36
+ '3' => str_split('BCMP'),
37
+ '4' => str_split('FHVWY'),
38
+ '5' => str_split('K'),
39
+ '8' => str_split('JX'),
40
+ '10' => str_split('QZ')
41
+ ];
42
+ $expected = [
43
+ 'a' => 1, 'b' => 3, 'c' => 3, 'd' => 2, 'e' => 1,
44
+ 'f' => 4, 'g' => 2, 'h' => 4, 'i' => 1, 'j' => 8,
45
+ 'k' => 5, 'l' => 1, 'm' => 3, 'n' => 1, 'o' => 1,
46
+ 'p' => 3, 'q' => 10, 'r' => 1, 's' => 1, 't' => 1,
47
+ 'u' => 1, 'v' => 4, 'w' => 4, 'x' => 8, 'y' => 4,
48
+ 'z' => 10
49
+ ];
50
+ $this->assertEquals($expected, transform($old));
51
+ }
52
+ }
@@ -0,0 +1,12 @@
1
+ <?php
2
+
3
+ function transform($old)
4
+ {
5
+ $new = [];
6
+ foreach ($old as $points => $letters) {
7
+ foreach ($letters as $letter) {
8
+ $new[strtolower($letter)] = $points;
9
+ }
10
+ }
11
+ return $new;
12
+ }
@@ -0,0 +1,25 @@
1
+ <?php
2
+
3
+
4
+ function nucleotideCount($dna)
5
+ {
6
+ $nucleotides = [];
7
+ if (strlen($dna) > 0) {
8
+ $nucleotides = str_split($dna);
9
+ }
10
+ $count = array_reduce($nucleotides, function ($count, $nucleotide) {
11
+ if (! in_array(strtolower($nucleotide), ['a', 'c', 'g', 't'])) {
12
+ throw new InvalidArgumentException(sprintf('The nucleotide %s does not exist in DNA', $nucleotide));
13
+ }
14
+ $count[strtolower($nucleotide)]++;
15
+
16
+ return $count;
17
+ }, [
18
+ 'a' => 0,
19
+ 'c' => 0,
20
+ 't' => 0,
21
+ 'g' => 0,
22
+ ]);
23
+
24
+ return $count;
25
+ }
@@ -0,0 +1,36 @@
1
+ <?php
2
+
3
+ require "nucleotide-count.php";
4
+
5
+ class NucleotideCountTest extends \PHPUnit_Framework_TestCase
6
+ {
7
+ public function testEmptyDNASequence()
8
+ {
9
+ $this->assertSame([
10
+ 'a' => 0,
11
+ 'c' => 0,
12
+ 't' => 0,
13
+ 'g' => 0,
14
+ ], nucleotideCount(''));
15
+ }
16
+
17
+ public function testRepetitiveDNASequence()
18
+ {
19
+ $this->assertSame([
20
+ 'a' => 9,
21
+ 'c' => 0,
22
+ 't' => 0,
23
+ 'g' => 0,
24
+ ], nucleotideCount('AAAAAAAAA'));
25
+ }
26
+
27
+ public function testDNASequence()
28
+ {
29
+ $this->assertSame([
30
+ 'a' => 20,
31
+ 'c' => 12,
32
+ 't' => 21,
33
+ 'g' => 17,
34
+ ], nucleotideCount('AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC'));
35
+ }
36
+ }