trackler 2.1.0.14 → 2.1.0.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/csharp/exercises/acronym/AcronymTest.cs +2 -2
  4. data/tracks/ecmascript/config.json +8 -1
  5. data/tracks/ecmascript/exercises/connect/connect.spec.js +110 -0
  6. data/tracks/ecmascript/exercises/connect/example.js +68 -0
  7. data/tracks/ecmascript/exercises/connect/package.json +82 -0
  8. data/tracks/haskell/exercises/difference-of-squares/package.yaml +1 -1
  9. data/tracks/haskell/exercises/difference-of-squares/test/Tests.hs +3 -4
  10. data/tracks/java/exercises/all-your-base/src/test/java/BaseConverterTest.java +1 -1
  11. data/tracks/java/exercises/bracket-push/src/test/java/BracketCheckerTest.java +1 -1
  12. data/tracks/java/exercises/wordy/src/test/java/WordProblemSolverTest.java +1 -1
  13. data/tracks/lisp/.travis.yml +12 -14
  14. data/tracks/lisp/README.md +16 -48
  15. data/tracks/objective-c/config.json +9 -0
  16. data/tracks/objective-c/exercises/luhn/LuhnExample.h +9 -0
  17. data/tracks/objective-c/exercises/luhn/LuhnExample.m +50 -0
  18. data/tracks/objective-c/exercises/luhn/LuhnTest.m +80 -0
  19. data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +18 -0
  20. data/tracks/php/config.json +397 -382
  21. data/tracks/php/exercises/binary-search/binary-search_test.php +58 -0
  22. data/tracks/php/exercises/binary-search/example.php +21 -0
  23. data/tracks/php/exercises/nth-prime/example.php +19 -0
  24. data/tracks/php/exercises/nth-prime/nth-prime_test.php +31 -0
  25. data/tracks/php/exercises/pascals-triangle/example.php +28 -0
  26. data/tracks/php/exercises/pascals-triangle/pascals-triangle_test.php +42 -0
  27. data/tracks/python/exercises/difference-of-squares/difference_of_squares_test.py +9 -12
  28. data/tracks/r/docs/INSTALLATION.md +2 -6
  29. data/tracks/rust/exercises/difference-of-squares/Cargo.toml +1 -1
  30. data/tracks/rust/exercises/difference-of-squares/tests/difference-of-square.rs +24 -6
  31. data/tracks/typescript/config.json +6 -0
  32. data/tracks/typescript/exercises/raindrops/package.json +36 -0
  33. data/tracks/typescript/exercises/raindrops/raindrops.example.ts +17 -0
  34. data/tracks/typescript/exercises/raindrops/raindrops.test.ts +38 -0
  35. data/tracks/typescript/exercises/raindrops/tsconfig.json +21 -0
  36. data/tracks/typescript/exercises/raindrops/tslint.json +127 -0
  37. data/tracks/typescript/exercises/raindrops/yarn.lock +2739 -0
  38. metadata +20 -3
  39. data/tracks/lisp/bin/cl-travis-install.sh +0 -325
@@ -330,6 +330,15 @@
330
330
  "Algorithms",
331
331
  "Transforming"
332
332
  ]
333
+ },
334
+ {
335
+ "difficulty": 5,
336
+ "slug": "luhn",
337
+ "topics": [
338
+ "Strings",
339
+ "Algorithms",
340
+ "Transforming"
341
+ ]
333
342
  }
334
343
  ],
335
344
  "deprecated": [
@@ -0,0 +1,9 @@
1
+ #import <Foundation/Foundation.h>
2
+
3
+ @interface Luhn : NSObject
4
+
5
+ @property (nonatomic, assign, readonly) BOOL isValid;
6
+
7
+ - (instancetype)initWithString:(NSString *)string;
8
+
9
+ @end
@@ -0,0 +1,50 @@
1
+ #import "LuhnExample.h"
2
+
3
+ @implementation Luhn
4
+
5
+ - (instancetype)initWithString:(NSString *)string {
6
+ self = [super init];
7
+
8
+ if (self) {
9
+ _isValid = [Luhn validateString:string];
10
+ }
11
+
12
+ return self;
13
+ }
14
+
15
+ + (BOOL)validateString:(NSString *)string {
16
+ string = [string stringByReplacingOccurrencesOfString:@" " withString:@""]; //!OCLint
17
+
18
+ if (string.length < 2) {
19
+ return NO;
20
+ }
21
+
22
+ NSCharacterSet *digitCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
23
+ if ([string rangeOfCharacterFromSet:digitCharacterSet].location != NSNotFound) {
24
+ return NO;
25
+ }
26
+
27
+ int total = 0;
28
+
29
+ for (int i = 1; i <= string.length; i++) {
30
+ NSString *character = [NSString stringWithFormat:@"%c", [string characterAtIndex:string.length - i]];
31
+ int digit = character.intValue;
32
+
33
+ if (i % 2 == 0) {
34
+ digit *= 2;
35
+ if (digit > 9) {
36
+ digit -= 9;
37
+ }
38
+ }
39
+
40
+ total += digit;
41
+ }
42
+
43
+ if (total % 10 == 0) {
44
+ return YES;
45
+ }
46
+
47
+ return NO;
48
+ }
49
+
50
+ @end
@@ -0,0 +1,80 @@
1
+ #import <XCTest/XCTest.h>
2
+
3
+ #if __has_include("LuhnExample.h")
4
+ # import "LuhnExample.h"
5
+ # else
6
+ # import "Luhn.h"
7
+ #endif
8
+
9
+ @interface LuhnTest : XCTestCase
10
+
11
+ @end
12
+
13
+ @implementation LuhnTest
14
+
15
+ - (void)testSingleDigitStringNotValid {
16
+ Luhn *luhn = [[Luhn alloc] initWithString:@"1"];
17
+ XCTAssertFalse(luhn.isValid);
18
+ }
19
+
20
+ - (void)testSingleZeroInvalid {
21
+ Luhn *luhn = [[Luhn alloc] initWithString:@"0"];
22
+ XCTAssertFalse(luhn.isValid);
23
+ }
24
+
25
+ - (void)testSimpleValidSINRemainsValidIfReversed {
26
+ Luhn *luhn = [[Luhn alloc] initWithString:@"059"];
27
+ XCTAssertTrue(luhn.isValid);
28
+ }
29
+
30
+ - (void)testSimpleValidSINInvalidIfReversed {
31
+ Luhn *luhn = [[Luhn alloc] initWithString:@"59"];
32
+ XCTAssertTrue(luhn.isValid);
33
+ }
34
+
35
+ - (void)testValidCanadianSIN {
36
+ Luhn *luhn = [[Luhn alloc] initWithString:@"055 444 285"];
37
+ XCTAssertTrue(luhn.isValid);
38
+ }
39
+
40
+ - (void)testInvalidCanadianSIN {
41
+ Luhn *luhn = [[Luhn alloc] initWithString:@"055 444 286"];
42
+ XCTAssertFalse(luhn.isValid);
43
+ }
44
+
45
+ - (void)testInvalidCreditCard {
46
+ Luhn *luhn = [[Luhn alloc] initWithString:@"8273 1232 7352 0569"];
47
+ XCTAssertFalse(luhn.isValid);
48
+ }
49
+
50
+ - (void)testValidStringsWithANonDigitInvalid {
51
+ Luhn *luhn = [[Luhn alloc] initWithString:@"055a 444 285"];
52
+ XCTAssertFalse(luhn.isValid);
53
+ }
54
+
55
+ - (void)testValidStringsWithPunctuationInvalid {
56
+ Luhn *luhn = [[Luhn alloc] initWithString:@"055-444-285"];
57
+ XCTAssertFalse(luhn.isValid);
58
+ }
59
+
60
+ - (void)testValidStringWithSymbolsInvalid {
61
+ Luhn *luhn = [[Luhn alloc] initWithString:@"055£ 444$ 285"];
62
+ XCTAssertFalse(luhn.isValid);
63
+ }
64
+
65
+ - (void)testSingleZeroWithSpaceInvalid {
66
+ Luhn *luhn = [[Luhn alloc] initWithString:@" 0"];
67
+ XCTAssertFalse(luhn.isValid);
68
+ }
69
+
70
+ - (void)testMoreThanOneZeroValid {
71
+ Luhn *luhn = [[Luhn alloc] initWithString:@"0000 0"];
72
+ XCTAssertTrue(luhn.isValid);
73
+ }
74
+
75
+ - (void)testInputDigit9CorrectConverted {
76
+ Luhn *luhn = [[Luhn alloc] initWithString:@"091"];
77
+ XCTAssertTrue(luhn.isValid);
78
+ }
79
+
80
+ @end
@@ -89,6 +89,8 @@
89
89
  E9B062201E9E7C6D000BE589 /* SieveTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E9B0621F1E9E7C6D000BE589 /* SieveTest.m */; };
90
90
  E9B345F81DB93822006EFBE2 /* PangramExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E9B345F71DB93822006EFBE2 /* PangramExample.m */; };
91
91
  E9B345FA1DB93839006EFBE2 /* PangramTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E9B345F91DB93839006EFBE2 /* PangramTest.m */; };
92
+ E9B9F2D41E9EB39C00214076 /* LuhnExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E9B9F2D31E9EB39C00214076 /* LuhnExample.m */; };
93
+ E9B9F2D61E9EB50B00214076 /* LuhnTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E9B9F2D51E9EB50B00214076 /* LuhnTest.m */; };
92
94
  E9C1C0231D9D993E0015E86E /* SecretHandshakeExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C1C0221D9D993E0015E86E /* SecretHandshakeExample.m */; };
93
95
  E9C1C0251D9D99620015E86E /* SecretHandshakeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C1C0241D9D99620015E86E /* SecretHandshakeTest.m */; };
94
96
  E9C1C0291D9DB16B0015E86E /* AcronymExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C1C0281D9DB16B0015E86E /* AcronymExample.m */; };
@@ -208,6 +210,9 @@
208
210
  E9B345F61DB93822006EFBE2 /* PangramExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PangramExample.h; path = ../../exercises/pangram/PangramExample.h; sourceTree = "<group>"; };
209
211
  E9B345F71DB93822006EFBE2 /* PangramExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PangramExample.m; path = ../../exercises/pangram/PangramExample.m; sourceTree = "<group>"; };
210
212
  E9B345F91DB93839006EFBE2 /* PangramTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PangramTest.m; path = ../../exercises/pangram/PangramTest.m; sourceTree = "<group>"; };
213
+ E9B9F2D21E9EB39C00214076 /* LuhnExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LuhnExample.h; path = ../../exercises/luhn/LuhnExample.h; sourceTree = "<group>"; };
214
+ E9B9F2D31E9EB39C00214076 /* LuhnExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LuhnExample.m; path = ../../exercises/luhn/LuhnExample.m; sourceTree = "<group>"; };
215
+ E9B9F2D51E9EB50B00214076 /* LuhnTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LuhnTest.m; path = ../../exercises/luhn/LuhnTest.m; sourceTree = "<group>"; };
211
216
  E9C1C0211D9D993E0015E86E /* SecretHandshakeExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SecretHandshakeExample.h; path = "../../exercises/secret-handshake/SecretHandshakeExample.h"; sourceTree = "<group>"; };
212
217
  E9C1C0221D9D993E0015E86E /* SecretHandshakeExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SecretHandshakeExample.m; path = "../../exercises/secret-handshake/SecretHandshakeExample.m"; sourceTree = "<group>"; };
213
218
  E9C1C0241D9D99620015E86E /* SecretHandshakeTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SecretHandshakeTest.m; path = "../../exercises/secret-handshake/SecretHandshakeTest.m"; sourceTree = "<group>"; };
@@ -263,6 +268,7 @@
263
268
  E9F390041DFCA307005C5F46 /* Isogram */,
264
269
  E9A7B2F41DA5ABA3009056B6 /* LargestSeriesProduct */,
265
270
  E9E8B6F11D519E120012F12C /* Leap */,
271
+ E9B9F2D11E9EB37A00214076 /* Luhn */,
266
272
  E92FCC0A1D78F2AA00061017 /* Meetup */,
267
273
  E9E8B6F21D519E180012F12C /* NucleotideCount */,
268
274
  E9B345F51DB937E5006EFBE2 /* Pangram */,
@@ -493,6 +499,16 @@
493
499
  name = Pangram;
494
500
  sourceTree = "<group>";
495
501
  };
502
+ E9B9F2D11E9EB37A00214076 /* Luhn */ = {
503
+ isa = PBXGroup;
504
+ children = (
505
+ E9B9F2D21E9EB39C00214076 /* LuhnExample.h */,
506
+ E9B9F2D31E9EB39C00214076 /* LuhnExample.m */,
507
+ E9B9F2D51E9EB50B00214076 /* LuhnTest.m */,
508
+ );
509
+ name = Luhn;
510
+ sourceTree = "<group>";
511
+ };
496
512
  E9C1C0201D9D98B80015E86E /* SecretHandshake */ = {
497
513
  isa = PBXGroup;
498
514
  children = (
@@ -851,6 +867,7 @@
851
867
  E92FCC0D1D78F30D00061017 /* MeetupExample.m in Sources */,
852
868
  E9381D4C1D8F2969003F22A1 /* RaindropsExample.m in Sources */,
853
869
  1EFACAAD1CCCAF3D006F2E69 /* HelloWorldExample.m in Sources */,
870
+ E9B9F2D61E9EB50B00214076 /* LuhnTest.m in Sources */,
854
871
  E9C1C02B1D9DB1830015E86E /* AcronymTest.m in Sources */,
855
872
  1EFACAB31CCCAF3D006F2E69 /* PerfectNumbersExample.m in Sources */,
856
873
  1EFACAB61CCCAF3D006F2E69 /* PhoneNumberTest.m in Sources */,
@@ -861,6 +878,7 @@
861
878
  1EFACAA61CCCAF3D006F2E69 /* BobTest.m in Sources */,
862
879
  E9B345FA1DB93839006EFBE2 /* PangramTest.m in Sources */,
863
880
  E9895B701E8DA914006AD25D /* CryptoSquareTest.m in Sources */,
881
+ E9B9F2D41E9EB39C00214076 /* LuhnExample.m in Sources */,
864
882
  E9A7B2F91DA5AC55009056B6 /* LargestSeriesProductTest.m in Sources */,
865
883
  1EFACAAF1CCCAF3D006F2E69 /* LeapExample.m in Sources */,
866
884
  E9386EF01E0B694D0009A414 /* AtbashCipherTest.m in Sources */,
@@ -1,382 +1,397 @@
1
- {
2
- "slug": "php",
3
- "language": "PHP",
4
- "repository": "https://github.com/exercism/xphp",
5
- "active": true,
6
- "deprecated": [
7
-
8
- ],
9
- "ignored": [
10
- "docs",
11
- "img"
12
- ],
13
- "foregone": [
14
-
15
- ],
16
- "exercises": [
17
- {
18
- "slug": "hello-world",
19
- "difficulty": 1,
20
- "topics": [
21
- "Text formatting",
22
- "Optional values"
23
- ]
24
- },
25
- {
26
- "slug": "hamming",
27
- "difficulty": 2,
28
- "topics": [
29
- "Strings",
30
- "Filtering"
31
- ]
32
- },
33
- {
34
- "slug": "gigasecond",
35
- "difficulty": 2,
36
- "topics": [
37
- "Dates"
38
- ]
39
- },
40
- {
41
- "slug": "bob",
42
- "difficulty": 4,
43
- "topics": [
44
- "Strings",
45
- "Control-flow (if-else statements)"
46
- ]
47
- },
48
- {
49
- "slug": "pangram",
50
- "difficulty": 4,
51
- "topics": [
52
- "Strings"
53
- ]
54
- },
55
- {
56
- "slug": "rna-transcription",
57
- "difficulty": 3,
58
- "topics": [
59
- "Strings",
60
- "Transforming"
61
- ]
62
- },
63
- {
64
- "slug": "raindrops",
65
- "difficulty": 6,
66
- "topics": [
67
- "Text formatting",
68
- "Filtering"
69
- ]
70
- },
71
- {
72
- "slug": "isogram",
73
- "difficulty": 4,
74
- "topics": [
75
- "Strings",
76
- "Filtering"
77
- ]
78
- },
79
- {
80
- "slug": "difference-of-squares",
81
- "difficulty": 2,
82
- "topics": [
83
- "Integers"
84
- ]
85
- },
86
- {
87
- "slug": "largest-series-product",
88
- "difficulty": 5,
89
- "topics": [
90
- "Strings",
91
- "Integers",
92
- "Transforming"
93
- ]
94
- },
95
- {
96
- "slug": "roman-numerals",
97
- "difficulty": 4,
98
- "topics": [
99
- "Control-flow (loops)",
100
- "Transforming"
101
- ]
102
- },
103
- {
104
- "slug": "sieve",
105
- "difficulty": 1,
106
- "topics": [
107
- "Filtering",
108
- "Mathematics"
109
- ]
110
- },
111
- {
112
- "slug": "pig-latin",
113
- "difficulty": 4,
114
- "topics": [
115
- "Strings",
116
- "Transforming"
117
- ]
118
- },
119
- {
120
- "slug": "robot-name",
121
- "difficulty": 3,
122
- "topics": [
123
- "Randomness",
124
- "Strings",
125
- "Classes"
126
- ]
127
- },
128
- {
129
- "slug": "leap",
130
- "difficulty": 1,
131
- "topics": [
132
- "Integers"
133
- ]
134
- },
135
- {
136
- "slug": "word-count",
137
- "difficulty": 1,
138
- "topics": [
139
- "Strings",
140
- "Dictionaries",
141
- "Transforming"
142
- ]
143
- },
144
- {
145
- "slug": "anagram",
146
- "difficulty": 1,
147
- "topics": [
148
- "Strings",
149
- "Filtering"
150
- ]
151
- },
152
- {
153
- "slug": "trinary",
154
- "difficulty": 1,
155
- "topics": []
156
- },
157
- {
158
- "slug": "bowling",
159
- "difficulty": 1,
160
- "topics": [
161
- "Algorithms",
162
- "Control-flow (loops)"
163
- ]
164
- },
165
- {
166
- "slug": "clock",
167
- "difficulty": 1,
168
- "topics": [
169
- "Time",
170
- "Structural equality"
171
- ]
172
- },
173
- {
174
- "slug": "wordy",
175
- "difficulty": 1,
176
- "topics": [
177
- "Parsing",
178
- "Strings",
179
- "Transforming"
180
- ]
181
- },
182
- {
183
- "slug": "connect",
184
- "difficulty": 1,
185
- "topics": []
186
- },
187
- {
188
- "slug": "minesweeper",
189
- "difficulty": 1,
190
- "topics": [
191
- "Parsing",
192
- "Transforming"
193
- ]
194
- },
195
- {
196
- "slug": "change",
197
- "difficulty": 1,
198
- "topics": [
199
- "Integers",
200
- "Arrays"
201
- ]
202
- },
203
- {
204
- "slug": "phone-number",
205
- "difficulty": 1,
206
- "topics": [
207
- "Parsing",
208
- "Transforming"
209
- ]
210
- },
211
- {
212
- "slug": "beer-song",
213
- "difficulty": 1,
214
- "topics": [
215
- "Text formatting",
216
- "Algorithms"
217
- ]
218
- },
219
- {
220
- "slug": "atbash-cipher",
221
- "difficulty": 1,
222
- "topics": [
223
- "Strings",
224
- "Algorithms",
225
- "Transforming"
226
- ]
227
- },
228
- {
229
- "slug": "bracket-push",
230
- "difficulty": 1,
231
- "topics": [
232
- "Parsing",
233
- "Strings"
234
- ]
235
- },
236
- {
237
- "slug": "binary",
238
- "difficulty": 1,
239
- "topics": []
240
- },
241
- {
242
- "slug": "accumulate",
243
- "difficulty": 1,
244
- "topics": [
245
- "Extension methods",
246
- "Sequences",
247
- "Transforming"
248
- ]
249
- },
250
- {
251
- "slug": "variable-length-quantity",
252
- "difficulty": 1,
253
- "topics": [
254
- "Bitwise operations",
255
- "Algorithms"
256
- ]
257
- },
258
- {
259
- "slug": "acronym",
260
- "difficulty": 1,
261
- "topics": [
262
- "Strings",
263
- "Transforming"
264
- ]
265
- },
266
- {
267
- "slug": "nucleotide-count",
268
- "difficulty": 1,
269
- "topics": [
270
- "Dictionaries",
271
- "Strings"
272
- ]
273
- },
274
- {
275
- "slug": "triangle",
276
- "difficulty": 1,
277
- "topics": [
278
- "Integers",
279
- "Enumerations"
280
- ]
281
- },
282
- {
283
- "slug": "etl",
284
- "difficulty": 1,
285
- "topics": [
286
- "Dictionaries",
287
- "Lists",
288
- "Transforming"
289
- ]
290
- },
291
- {
292
- "slug": "space-age",
293
- "difficulty": 1,
294
- "topics": [
295
- "Floating-point numbers"
296
- ]
297
- },
298
- {
299
- "slug": "allergies",
300
- "difficulty": 3,
301
- "topics": [
302
- "Bitwise operations",
303
- "Filtering"
304
- ]
305
- },
306
- {
307
- "slug": "markdown",
308
- "difficulty": 3,
309
- "topics": ["refactoring"]
310
- },
311
- {
312
- "slug": "grains",
313
- "difficulty": 3,
314
- "topics": [
315
- "Floating-point numbers",
316
- "Algorithms"
317
- ]
318
- },
319
- {
320
- "slug": "robot-simulator",
321
- "difficulty": 3,
322
- "topics": [
323
- "OOP"
324
- ]
325
- },
326
- {
327
- "slug": "ocr-numbers",
328
- "difficulty": 3,
329
- "topics": [
330
- "Strings",
331
- "Algorithms",
332
- "Transforming"
333
- ]
334
- },
335
- {
336
- "slug": "book-store",
337
- "difficulty": 3,
338
- "topics": [
339
- "Algorithms"
340
- ]
341
- },
342
- {
343
- "slug": "queen-attack",
344
- "difficulty": 2,
345
- "topics": [
346
- "Integers",
347
- "Mathematics"
348
- ]
349
- },
350
- {
351
- "slug": "scrabble-score",
352
- "difficulty": 2,
353
- "topics": [
354
- "Strings",
355
- "Control-flow (loops)",
356
- "Integers"
357
- ]
358
- },
359
- {
360
- "slug": "grade-school",
361
- "difficulty": 6,
362
- "topics": [
363
- "Arrays"
364
- ]
365
- },
366
- {
367
- "slug": "luhn",
368
- "difficulty": 4,
369
- "topics": []
370
- },
371
- {
372
- "slug": "perfect-numbers",
373
- "difficulty": 1,
374
- "topics": []
375
- },
376
- {
377
- "slug": "sum-of-multiples",
378
- "difficulty": 2,
379
- "topics" : []
380
- }
381
- ]
382
- }
1
+ {
2
+ "slug": "php",
3
+ "language": "PHP",
4
+ "repository": "https://github.com/exercism/xphp",
5
+ "active": true,
6
+ "deprecated": [
7
+
8
+ ],
9
+ "ignored": [
10
+ "docs",
11
+ "img"
12
+ ],
13
+ "foregone": [
14
+
15
+ ],
16
+ "exercises": [
17
+ {
18
+ "slug": "hello-world",
19
+ "difficulty": 1,
20
+ "topics": [
21
+ "Text formatting",
22
+ "Optional values"
23
+ ]
24
+ },
25
+ {
26
+ "slug": "hamming",
27
+ "difficulty": 2,
28
+ "topics": [
29
+ "Strings",
30
+ "Filtering"
31
+ ]
32
+ },
33
+ {
34
+ "slug": "gigasecond",
35
+ "difficulty": 2,
36
+ "topics": [
37
+ "Dates"
38
+ ]
39
+ },
40
+ {
41
+ "slug": "bob",
42
+ "difficulty": 4,
43
+ "topics": [
44
+ "Strings",
45
+ "Control-flow (if-else statements)"
46
+ ]
47
+ },
48
+ {
49
+ "slug": "pangram",
50
+ "difficulty": 4,
51
+ "topics": [
52
+ "Strings"
53
+ ]
54
+ },
55
+ {
56
+ "slug": "rna-transcription",
57
+ "difficulty": 3,
58
+ "topics": [
59
+ "Strings",
60
+ "Transforming"
61
+ ]
62
+ },
63
+ {
64
+ "slug": "raindrops",
65
+ "difficulty": 6,
66
+ "topics": [
67
+ "Text formatting",
68
+ "Filtering"
69
+ ]
70
+ },
71
+ {
72
+ "slug": "isogram",
73
+ "difficulty": 4,
74
+ "topics": [
75
+ "Strings",
76
+ "Filtering"
77
+ ]
78
+ },
79
+ {
80
+ "slug": "difference-of-squares",
81
+ "difficulty": 2,
82
+ "topics": [
83
+ "Integers"
84
+ ]
85
+ },
86
+ {
87
+ "slug": "largest-series-product",
88
+ "difficulty": 5,
89
+ "topics": [
90
+ "Strings",
91
+ "Integers",
92
+ "Transforming"
93
+ ]
94
+ },
95
+ {
96
+ "slug": "roman-numerals",
97
+ "difficulty": 4,
98
+ "topics": [
99
+ "Control-flow (loops)",
100
+ "Transforming"
101
+ ]
102
+ },
103
+ {
104
+ "slug": "sieve",
105
+ "difficulty": 1,
106
+ "topics": [
107
+ "Filtering",
108
+ "Mathematics"
109
+ ]
110
+ },
111
+ {
112
+ "slug": "pig-latin",
113
+ "difficulty": 4,
114
+ "topics": [
115
+ "Strings",
116
+ "Transforming"
117
+ ]
118
+ },
119
+ {
120
+ "slug": "robot-name",
121
+ "difficulty": 3,
122
+ "topics": [
123
+ "Randomness",
124
+ "Strings",
125
+ "Classes"
126
+ ]
127
+ },
128
+ {
129
+ "slug": "leap",
130
+ "difficulty": 1,
131
+ "topics": [
132
+ "Integers"
133
+ ]
134
+ },
135
+ {
136
+ "slug": "word-count",
137
+ "difficulty": 1,
138
+ "topics": [
139
+ "Strings",
140
+ "Dictionaries",
141
+ "Transforming"
142
+ ]
143
+ },
144
+ {
145
+ "slug": "anagram",
146
+ "difficulty": 1,
147
+ "topics": [
148
+ "Strings",
149
+ "Filtering"
150
+ ]
151
+ },
152
+ {
153
+ "slug": "trinary",
154
+ "difficulty": 1,
155
+ "topics": []
156
+ },
157
+ {
158
+ "slug": "bowling",
159
+ "difficulty": 1,
160
+ "topics": [
161
+ "Algorithms",
162
+ "Control-flow (loops)"
163
+ ]
164
+ },
165
+ {
166
+ "slug": "clock",
167
+ "difficulty": 1,
168
+ "topics": [
169
+ "Time",
170
+ "Structural equality"
171
+ ]
172
+ },
173
+ {
174
+ "slug": "wordy",
175
+ "difficulty": 1,
176
+ "topics": [
177
+ "Parsing",
178
+ "Strings",
179
+ "Transforming"
180
+ ]
181
+ },
182
+ {
183
+ "slug": "connect",
184
+ "difficulty": 1,
185
+ "topics": []
186
+ },
187
+ {
188
+ "slug": "minesweeper",
189
+ "difficulty": 1,
190
+ "topics": [
191
+ "Parsing",
192
+ "Transforming"
193
+ ]
194
+ },
195
+ {
196
+ "slug": "change",
197
+ "difficulty": 1,
198
+ "topics": [
199
+ "Integers",
200
+ "Arrays"
201
+ ]
202
+ },
203
+ {
204
+ "slug": "phone-number",
205
+ "difficulty": 1,
206
+ "topics": [
207
+ "Parsing",
208
+ "Transforming"
209
+ ]
210
+ },
211
+ {
212
+ "slug": "beer-song",
213
+ "difficulty": 1,
214
+ "topics": [
215
+ "Text formatting",
216
+ "Algorithms"
217
+ ]
218
+ },
219
+ {
220
+ "slug": "atbash-cipher",
221
+ "difficulty": 1,
222
+ "topics": [
223
+ "Strings",
224
+ "Algorithms",
225
+ "Transforming"
226
+ ]
227
+ },
228
+ {
229
+ "slug": "bracket-push",
230
+ "difficulty": 1,
231
+ "topics": [
232
+ "Parsing",
233
+ "Strings"
234
+ ]
235
+ },
236
+ {
237
+ "slug": "binary",
238
+ "difficulty": 1,
239
+ "topics": []
240
+ },
241
+ {
242
+ "slug": "accumulate",
243
+ "difficulty": 1,
244
+ "topics": [
245
+ "Extension methods",
246
+ "Sequences",
247
+ "Transforming"
248
+ ]
249
+ },
250
+ {
251
+ "slug": "variable-length-quantity",
252
+ "difficulty": 1,
253
+ "topics": [
254
+ "Bitwise operations",
255
+ "Algorithms"
256
+ ]
257
+ },
258
+ {
259
+ "slug": "acronym",
260
+ "difficulty": 1,
261
+ "topics": [
262
+ "Strings",
263
+ "Transforming"
264
+ ]
265
+ },
266
+ {
267
+ "slug": "nucleotide-count",
268
+ "difficulty": 1,
269
+ "topics": [
270
+ "Dictionaries",
271
+ "Strings"
272
+ ]
273
+ },
274
+ {
275
+ "slug": "triangle",
276
+ "difficulty": 1,
277
+ "topics": [
278
+ "Integers",
279
+ "Enumerations"
280
+ ]
281
+ },
282
+ {
283
+ "slug": "etl",
284
+ "difficulty": 1,
285
+ "topics": [
286
+ "Dictionaries",
287
+ "Lists",
288
+ "Transforming"
289
+ ]
290
+ },
291
+ {
292
+ "slug": "space-age",
293
+ "difficulty": 1,
294
+ "topics": [
295
+ "Floating-point numbers"
296
+ ]
297
+ },
298
+ {
299
+ "slug": "allergies",
300
+ "difficulty": 3,
301
+ "topics": [
302
+ "Bitwise operations",
303
+ "Filtering"
304
+ ]
305
+ },
306
+ {
307
+ "slug": "markdown",
308
+ "difficulty": 3,
309
+ "topics": ["refactoring"]
310
+ },
311
+ {
312
+ "slug": "grains",
313
+ "difficulty": 3,
314
+ "topics": [
315
+ "Floating-point numbers",
316
+ "Algorithms"
317
+ ]
318
+ },
319
+ {
320
+ "slug": "robot-simulator",
321
+ "difficulty": 3,
322
+ "topics": [
323
+ "OOP"
324
+ ]
325
+ },
326
+ {
327
+ "slug": "ocr-numbers",
328
+ "difficulty": 3,
329
+ "topics": [
330
+ "Strings",
331
+ "Algorithms",
332
+ "Transforming"
333
+ ]
334
+ },
335
+ {
336
+ "slug": "book-store",
337
+ "difficulty": 3,
338
+ "topics": [
339
+ "Algorithms"
340
+ ]
341
+ },
342
+ {
343
+ "slug": "queen-attack",
344
+ "difficulty": 2,
345
+ "topics": [
346
+ "Integers",
347
+ "Mathematics"
348
+ ]
349
+ },
350
+ {
351
+ "slug": "scrabble-score",
352
+ "difficulty": 2,
353
+ "topics": [
354
+ "Strings",
355
+ "Control-flow (loops)",
356
+ "Integers"
357
+ ]
358
+ },
359
+ {
360
+ "slug": "grade-school",
361
+ "difficulty": 6,
362
+ "topics": [
363
+ "Arrays"
364
+ ]
365
+ },
366
+ {
367
+ "slug": "luhn",
368
+ "difficulty": 4,
369
+ "topics": []
370
+ },
371
+ {
372
+ "slug": "perfect-numbers",
373
+ "difficulty": 1,
374
+ "topics": []
375
+ },
376
+ {
377
+ "slug": "sum-of-multiples",
378
+ "difficulty": 2,
379
+ "topics" : []
380
+ },
381
+ {
382
+ "slug": "pascals-triangle",
383
+ "difficulty": 3,
384
+ "topics" : []
385
+ },
386
+ {
387
+ "slug": "nth-prime",
388
+ "difficulty": 3,
389
+ "topics" : []
390
+ },
391
+ {
392
+ "slug": "binary-search",
393
+ "difficulty": 3,
394
+ "topics" : []
395
+ }
396
+ ]
397
+ }