trackler 2.0.8.36 → 2.0.8.37
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.
- checksums.yaml +4 -4
- data/.gitmodules +3 -0
- data/lib/trackler/version.rb +1 -1
- data/tracks/c/config.json +7 -0
- data/tracks/c/exercises/perfect-numbers/makefile +16 -0
- data/tracks/c/exercises/perfect-numbers/src/example.c +28 -0
- data/tracks/c/exercises/perfect-numbers/src/example.h +13 -0
- data/tracks/c/exercises/perfect-numbers/src/perfect_numbers.h +11 -0
- data/tracks/c/exercises/perfect-numbers/test/test_perfect_numbers.c +87 -0
- data/tracks/c/exercises/perfect-numbers/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/perfect-numbers/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/perfect-numbers/test/vendor/unity_internals.h +701 -0
- data/tracks/ceylon/README.md +1 -1
- data/tracks/ceylon/docs/RESOURCES.md +5 -0
- data/tracks/ceylon/exercises/anagram/source/anagram/module.ceylon +1 -1
- data/tracks/ceylon/exercises/bracket-push/example/module.ceylon +2 -2
- data/tracks/ceylon/exercises/bracket-push/source/bracketpush/module.ceylon +1 -1
- data/tracks/ceylon/exercises/hamming/source/hamming/module.ceylon +1 -1
- data/tracks/ceylon/exercises/largest-series-product/source/largestseriesproduct/module.ceylon +1 -1
- data/tracks/ceylon/exercises/leap/source/leap/module.ceylon +1 -1
- data/tracks/ceylon/exercises/react/example/module.ceylon +2 -2
- data/tracks/ceylon/exercises/react/source/react/module.ceylon +1 -1
- data/tracks/ceylon/exercises/sieve/example/module.ceylon +2 -2
- data/tracks/ceylon/exercises/sieve/source/sieve/module.ceylon +1 -1
- data/tracks/clojurescript/.github/ISSUE_TEMPLATE.md +9 -0
- data/tracks/clojurescript/.gitignore +4 -0
- data/tracks/clojurescript/.travis.yml +5 -0
- data/tracks/clojurescript/LICENSE +21 -0
- data/tracks/clojurescript/README.md +72 -0
- data/tracks/clojurescript/bin/fetch-configlet +32 -0
- data/tracks/clojurescript/config.json +21 -0
- data/tracks/clojurescript/docs/ABOUT.md +0 -0
- data/tracks/clojurescript/docs/INSTALLATION.md +0 -0
- data/tracks/clojurescript/docs/LEARNING.md +0 -0
- data/tracks/clojurescript/docs/RESOURCES.md +0 -0
- data/tracks/clojurescript/docs/TESTS.md +0 -0
- data/tracks/clojurescript/exercises/TRACK_HINTS.md +0 -0
- data/tracks/clojurescript/img/.keep +0 -0
- data/tracks/csharp/exercises/grade-school/Example.cs +13 -1
- data/tracks/csharp/exercises/grade-school/GradeSchool.cs +1 -1
- data/tracks/csharp/exercises/grade-school/GradeSchoolTest.cs +42 -18
- data/tracks/go/README.md +8 -0
- data/tracks/go/exercises/twelve-days/HINTS.md +2 -0
- data/tracks/haskell/config.json +0 -1
- data/tracks/objective-c/config.json +9 -0
- data/tracks/objective-c/exercises/crypto-square/CryptoSquareExample.h +14 -0
- data/tracks/objective-c/exercises/crypto-square/CryptoSquareExample.m +96 -0
- data/tracks/objective-c/exercises/crypto-square/CryptoSquareTest.m +94 -0
- data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +18 -0
- data/tracks/purescript/.gitignore +2 -2
- data/tracks/purescript/bin/test-one.sh +58 -0
- data/tracks/purescript/bin/test.sh +13 -44
- data/tracks/purescript/config.json +7 -0
- data/tracks/purescript/exercises/bracket-push/bower.json +17 -0
- data/tracks/purescript/exercises/bracket-push/examples/src/BracketPush.purs +43 -0
- data/tracks/purescript/exercises/bracket-push/src/BracketPush.purs +3 -0
- data/tracks/purescript/exercises/bracket-push/test/Main.purs +64 -0
- data/tracks/scala/exercises/hello-world/HINTS.md +0 -4
- data/tracks/scala/exercises/hello-world/example.scala +1 -2
- data/tracks/scala/exercises/hello-world/src/test/scala/HelloWorldTest.scala +4 -11
- data/tracks/scala/testgen/build.sbt +9 -0
- data/tracks/scala/testgen/project/build.properties +2 -0
- data/tracks/scala/testgen/project/plugins.sbt +2 -0
- data/tracks/scala/testgen/src/main/scala/BeerSongTestGenerator.scala +15 -0
- data/tracks/scala/testgen/src/main/scala/BowlingTestGenerator.scala +23 -44
- data/tracks/scala/testgen/src/main/scala/FoodChainTestGenerator.scala +31 -0
- data/tracks/scala/testgen/src/main/scala/HelloWorldTestGenerator.scala +14 -0
- data/tracks/scala/testgen/src/main/scala/NucleotideCountTestGenerator.scala +15 -0
- data/tracks/scala/testgen/src/main/scala/PangramsTestGenerator.scala +20 -38
- data/tracks/scala/testgen/src/main/scala/SumOfMultiplesTestGenerator.scala +14 -0
- data/tracks/scala/testgen/src/main/scala/testgen/CanonicalDataParser.scala +105 -0
- data/tracks/scala/testgen/src/main/scala/testgen/TestSuiteBuilder.scala +111 -0
- data/tracks/scala/testgen/src/main/twirl/funSuiteTemplate.scala.txt +12 -0
- metadata +44 -4
- data/tracks/haskell/common/stack.yaml +0 -1
- data/tracks/haskell/exercises/pov/.dummylink +0 -1
@@ -0,0 +1,14 @@
|
|
1
|
+
#import <Foundation/Foundation.h>
|
2
|
+
|
3
|
+
@interface CryptoSquare : NSObject
|
4
|
+
|
5
|
+
@property (nonatomic, assign) int numberOfRows;
|
6
|
+
@property (nonatomic, assign) int numberOfColumns;
|
7
|
+
@property (nonatomic, strong) NSArray<NSString *> *plaintextSegments;
|
8
|
+
@property (nonatomic, strong) NSString *cipherText;
|
9
|
+
@property (nonatomic, strong) NSString *normalizedCipherText;
|
10
|
+
|
11
|
+
- (instancetype)initWithText:(NSString *)text;
|
12
|
+
- (NSString *)normalizePlaintext;
|
13
|
+
|
14
|
+
@end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
#import "CryptoSquareExample.h"
|
2
|
+
|
3
|
+
@interface CryptoSquare ()
|
4
|
+
|
5
|
+
@property (nonatomic, strong) NSString *text;
|
6
|
+
@property (nonatomic, strong) NSString *normalizedText;
|
7
|
+
|
8
|
+
@end
|
9
|
+
|
10
|
+
@implementation CryptoSquare
|
11
|
+
|
12
|
+
- (instancetype)initWithText:(NSString *)text {
|
13
|
+
self = [super init];
|
14
|
+
|
15
|
+
if (self) {
|
16
|
+
_text = text;
|
17
|
+
_normalizedText = [self normalizePlaintext];
|
18
|
+
[self getSquareSize];
|
19
|
+
_plaintextSegments = [self getPlaintextSegments];
|
20
|
+
_cipherText = [self getCipherText];
|
21
|
+
_normalizedCipherText = [self getNormalizedCipherText];
|
22
|
+
}
|
23
|
+
|
24
|
+
return self;
|
25
|
+
}
|
26
|
+
|
27
|
+
- (NSString *)normalizePlaintext {
|
28
|
+
NSCharacterSet *characterSet = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
|
29
|
+
NSArray<NSString *> *components = [self.text componentsSeparatedByCharactersInSet:characterSet];
|
30
|
+
NSString *rejoinedText = [components componentsJoinedByString:@""];
|
31
|
+
|
32
|
+
return [rejoinedText lowercaseString];
|
33
|
+
}
|
34
|
+
|
35
|
+
- (void)getSquareSize {
|
36
|
+
double length = (double)self.normalizedText.length;
|
37
|
+
double root = sqrt(length);
|
38
|
+
|
39
|
+
self.numberOfRows = (int)round(root);
|
40
|
+
self.numberOfColumns = (int)ceil(root);
|
41
|
+
}
|
42
|
+
|
43
|
+
- (NSArray<NSString *> *)getPlaintextSegments {
|
44
|
+
NSMutableArray<NSString *> *result = [[NSMutableArray alloc] init];
|
45
|
+
NSMutableString *segment = [[NSMutableString alloc] initWithString:@""];
|
46
|
+
|
47
|
+
for (int index = 0; index < self.normalizedText.length; index++) {
|
48
|
+
NSString *newCharacter = [NSString stringWithFormat:@"%C", [self.normalizedText characterAtIndex:index]];
|
49
|
+
[segment appendString:newCharacter];
|
50
|
+
|
51
|
+
int position = index + 1;
|
52
|
+
|
53
|
+
if (position % self.numberOfColumns == 0 || position == self.normalizedText.length) {
|
54
|
+
[result addObject:[segment copy]];
|
55
|
+
[segment setString:@""];
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
return result;
|
60
|
+
}
|
61
|
+
|
62
|
+
- (NSString *)getCipherText {
|
63
|
+
NSMutableString *result = [[NSMutableString alloc] initWithString:@""];
|
64
|
+
|
65
|
+
for (int column = 0; column < self.numberOfColumns; column++) {
|
66
|
+
for (NSString *segment in self.plaintextSegments) {
|
67
|
+
if (column < segment.length) {
|
68
|
+
NSString *newCharacter = [NSString stringWithFormat:@"%C", [segment characterAtIndex:column]];
|
69
|
+
[result appendString:newCharacter];
|
70
|
+
}
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
return result;
|
75
|
+
}
|
76
|
+
|
77
|
+
- (NSString *)getNormalizedCipherText {
|
78
|
+
NSMutableString *result = [[NSMutableString alloc] init];
|
79
|
+
int counter = 0;
|
80
|
+
|
81
|
+
for (int index = 0; index < self.cipherText.length; index++) {
|
82
|
+
NSString *newCharacter = [NSString stringWithFormat:@"%C", [self.cipherText characterAtIndex:index]];
|
83
|
+
|
84
|
+
if (counter % self.numberOfRows == 0 && counter != 0) {
|
85
|
+
[result appendFormat:@" %@", newCharacter];
|
86
|
+
} else {
|
87
|
+
[result appendString:newCharacter];
|
88
|
+
}
|
89
|
+
|
90
|
+
counter++;
|
91
|
+
}
|
92
|
+
|
93
|
+
return result;
|
94
|
+
}
|
95
|
+
|
96
|
+
@end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
#import <XCTest/XCTest.h>
|
2
|
+
#if __has_include("CryptoSquareExample.h")
|
3
|
+
# import "CryptoSquareExample.h"
|
4
|
+
# else
|
5
|
+
# import "CryptoSquare.h"
|
6
|
+
#endif
|
7
|
+
|
8
|
+
@interface CryptoSquareTest : XCTestCase
|
9
|
+
|
10
|
+
@end
|
11
|
+
|
12
|
+
@implementation CryptoSquareTest
|
13
|
+
|
14
|
+
- (void)testNormalizeStrangeCharacters {
|
15
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"s#$%^&plunk"];
|
16
|
+
XCTAssertEqualObjects(@"splunk", [crypto normalizePlaintext]);
|
17
|
+
}
|
18
|
+
|
19
|
+
- (void)testNormalizeUppercaseCharacters {
|
20
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"WHOA HEY!"];
|
21
|
+
XCTAssertEqualObjects(@"whoahey", [crypto normalizePlaintext]);
|
22
|
+
}
|
23
|
+
|
24
|
+
- (void)testNormalizeWithNumbers {
|
25
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"1, 2, 3 GO!"];
|
26
|
+
XCTAssertEqualObjects(@"123go", [crypto normalizePlaintext]);
|
27
|
+
}
|
28
|
+
|
29
|
+
- (void)testSizeOfSmallSquare {
|
30
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"1234"];
|
31
|
+
XCTAssertEqual(2, crypto.numberOfColumns);
|
32
|
+
}
|
33
|
+
|
34
|
+
- (void)testSizeOfSlightlyLargerSquare {
|
35
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"123456789"];
|
36
|
+
XCTAssertEqual(3, crypto.numberOfColumns);
|
37
|
+
}
|
38
|
+
|
39
|
+
- (void)testSizeOfNonPerfectSquare {
|
40
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"123456789abc"];
|
41
|
+
XCTAssertEqual(4, crypto.numberOfColumns);
|
42
|
+
}
|
43
|
+
|
44
|
+
- (void)testSizeIsDeterminedByNormalizedPlaintext {
|
45
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"Oh hey, this is nuts!"];
|
46
|
+
XCTAssertEqual(4, crypto.numberOfColumns);
|
47
|
+
}
|
48
|
+
|
49
|
+
- (void)testPlaintextSegments {
|
50
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"Never vex thine heart with idle woes"];
|
51
|
+
NSArray *expected = @[@"neverv", @"exthin", @"eheart", @"withid", @"lewoes"];
|
52
|
+
XCTAssertEqualObjects(expected, crypto.plaintextSegments);
|
53
|
+
}
|
54
|
+
|
55
|
+
- (void)testOtherPlaintextSegments {
|
56
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"ZOMG! ZOMBIES!!!"];
|
57
|
+
NSArray *expected = @[@"zomg", @"zomb", @"ies"];
|
58
|
+
XCTAssertEqualObjects(expected, crypto.plaintextSegments);
|
59
|
+
}
|
60
|
+
|
61
|
+
- (void)testCiphertext {
|
62
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"Time is an illusion. Lunchtime doubly so."];
|
63
|
+
XCTAssertEqualObjects(@"tasneyinicdsmiohooelntuillibsuuml", crypto.cipherText);
|
64
|
+
}
|
65
|
+
|
66
|
+
- (void)testAnotherCiphertext {
|
67
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"We all know interspecies romance is weird."];
|
68
|
+
XCTAssertEqualObjects(@"wneiaweoreneawssciliprerlneoidktcms", crypto.cipherText);
|
69
|
+
}
|
70
|
+
|
71
|
+
- (void)testNormalizedCiphertext {
|
72
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"Vampires are people too!"];
|
73
|
+
XCTAssertEqualObjects(@"vrel aepe mset paoo irpo", crypto.normalizedCipherText);
|
74
|
+
}
|
75
|
+
|
76
|
+
- (void)testNormalizedCiphertextSpillsIntoShortSegment {
|
77
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"Madness, and then illumination."];
|
78
|
+
XCTAssertEqualObjects(@"msemo aanin dninn dlaet ltshu i", crypto.normalizedCipherText);
|
79
|
+
}
|
80
|
+
|
81
|
+
- (void)testAnotherNormalizedCiphertext {
|
82
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:
|
83
|
+
@"If man was meant to stay on the ground god would have given us roots"];
|
84
|
+
NSString *expected = @"imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghns seoau";
|
85
|
+
XCTAssertEqualObjects(expected, crypto.normalizedCipherText);
|
86
|
+
}
|
87
|
+
|
88
|
+
- (void)testNormalizedCiphertextWithPunctuation {
|
89
|
+
CryptoSquare *crypto = [[CryptoSquare alloc] initWithText:@"Have a nice day. Feed the dog & chill out!"];
|
90
|
+
NSString *expected = @"hifei acedl veeol eddgo aatcu nyhht";
|
91
|
+
XCTAssertEqualObjects(expected, crypto.normalizedCipherText);
|
92
|
+
}
|
93
|
+
|
94
|
+
@end
|
@@ -79,6 +79,8 @@
|
|
79
79
|
E95C52561E81C82A0095D321 /* BinarySearchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E95C52541E81C82A0095D321 /* BinarySearchTest.m */; };
|
80
80
|
E96993981DF60E1E009EA223 /* TransposeExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E96993971DF60E1E009EA223 /* TransposeExample.m */; };
|
81
81
|
E969939A1DF60E5F009EA223 /* TransposeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E96993991DF60E5F009EA223 /* TransposeTest.m */; };
|
82
|
+
E9895B6E1E8DA8E8006AD25D /* CryptoSquareExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E9895B6D1E8DA8E8006AD25D /* CryptoSquareExample.m */; };
|
83
|
+
E9895B701E8DA914006AD25D /* CryptoSquareTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E9895B6F1E8DA914006AD25D /* CryptoSquareTest.m */; };
|
82
84
|
E99D1D811D5533BF0006A303 /* SumOfMultiplesExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E99D1D801D5533BF0006A303 /* SumOfMultiplesExample.m */; };
|
83
85
|
E99D1D831D5533D80006A303 /* SumOfMultiplesTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E99D1D821D5533D80006A303 /* SumOfMultiplesTest.m */; };
|
84
86
|
E9A7B2F71DA5AC37009056B6 /* LargestSeriesProductExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E9A7B2F61DA5AC37009056B6 /* LargestSeriesProductExample.m */; };
|
@@ -187,6 +189,9 @@
|
|
187
189
|
E96993961DF60E1E009EA223 /* TransposeExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TransposeExample.h; path = ../../exercises/transpose/TransposeExample.h; sourceTree = "<group>"; };
|
188
190
|
E96993971DF60E1E009EA223 /* TransposeExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TransposeExample.m; path = ../../exercises/transpose/TransposeExample.m; sourceTree = "<group>"; };
|
189
191
|
E96993991DF60E5F009EA223 /* TransposeTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TransposeTest.m; path = ../../exercises/transpose/TransposeTest.m; sourceTree = "<group>"; };
|
192
|
+
E9895B6C1E8DA8E8006AD25D /* CryptoSquareExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CryptoSquareExample.h; path = "../../exercises/crypto-square/CryptoSquareExample.h"; sourceTree = "<group>"; };
|
193
|
+
E9895B6D1E8DA8E8006AD25D /* CryptoSquareExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CryptoSquareExample.m; path = "../../exercises/crypto-square/CryptoSquareExample.m"; sourceTree = "<group>"; };
|
194
|
+
E9895B6F1E8DA914006AD25D /* CryptoSquareTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CryptoSquareTest.m; path = "../../exercises/crypto-square/CryptoSquareTest.m"; sourceTree = "<group>"; };
|
190
195
|
E99D1D7F1D5533BF0006A303 /* SumOfMultiplesExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SumOfMultiplesExample.h; path = "../../exercises/sum-of-multiples/SumOfMultiplesExample.h"; sourceTree = "<group>"; };
|
191
196
|
E99D1D801D5533BF0006A303 /* SumOfMultiplesExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SumOfMultiplesExample.m; path = "../../exercises/sum-of-multiples/SumOfMultiplesExample.m"; sourceTree = "<group>"; };
|
192
197
|
E99D1D821D5533D80006A303 /* SumOfMultiplesTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SumOfMultiplesTest.m; path = "../../exercises/sum-of-multiples/SumOfMultiplesTest.m"; sourceTree = "<group>"; };
|
@@ -237,6 +242,7 @@
|
|
237
242
|
E9E8B6EC1D519DEF0012F12C /* Bob */,
|
238
243
|
A09A906D1E28C1380087CCB7 /* BracketPush */,
|
239
244
|
E9381D4F1D8F2DA4003F22A1 /* Clock */,
|
245
|
+
E9895B6B1E8DA8AA006AD25D /* CryptoSquare */,
|
240
246
|
E9381D431D8EDFB8003F22A1 /* DifferenceOfSquares */,
|
241
247
|
E9E8B6ED1D519DF50012F12C /* Etl */,
|
242
248
|
A09A4C001E3875C200FEFB7A /* FlattenArray */,
|
@@ -425,6 +431,16 @@
|
|
425
431
|
name = Transpose;
|
426
432
|
sourceTree = "<group>";
|
427
433
|
};
|
434
|
+
E9895B6B1E8DA8AA006AD25D /* CryptoSquare */ = {
|
435
|
+
isa = PBXGroup;
|
436
|
+
children = (
|
437
|
+
E9895B6C1E8DA8E8006AD25D /* CryptoSquareExample.h */,
|
438
|
+
E9895B6D1E8DA8E8006AD25D /* CryptoSquareExample.m */,
|
439
|
+
E9895B6F1E8DA914006AD25D /* CryptoSquareTest.m */,
|
440
|
+
);
|
441
|
+
name = CryptoSquare;
|
442
|
+
sourceTree = "<group>";
|
443
|
+
};
|
428
444
|
E99D1D7B1D5532C50006A303 /* SumOfMultiples */ = {
|
429
445
|
isa = PBXGroup;
|
430
446
|
children = (
|
@@ -770,6 +786,7 @@
|
|
770
786
|
A09A4C031E38761A00FEFB7A /* FlattenArrayExample.m in Sources */,
|
771
787
|
A0BBFCC31E37728100230071 /* SublistTest.m in Sources */,
|
772
788
|
E9C1C02F1D9EC1130015E86E /* RunLengthEncodingExample.m in Sources */,
|
789
|
+
E9895B6E1E8DA8E8006AD25D /* CryptoSquareExample.m in Sources */,
|
773
790
|
E92FCC0F1D78F3B600061017 /* MeetupTest.m in Sources */,
|
774
791
|
E9381D4E1D8F2982003F22A1 /* RaindropsTest.m in Sources */,
|
775
792
|
E9381D541D8F2DE1003F22A1 /* ClockTest.m in Sources */,
|
@@ -807,6 +824,7 @@
|
|
807
824
|
E9386EEE1E0B692D0009A414 /* AtbashCipherExample.m in Sources */,
|
808
825
|
1EFACAA61CCCAF3D006F2E69 /* BobTest.m in Sources */,
|
809
826
|
E9B345FA1DB93839006EFBE2 /* PangramTest.m in Sources */,
|
827
|
+
E9895B701E8DA914006AD25D /* CryptoSquareTest.m in Sources */,
|
810
828
|
E9A7B2F91DA5AC55009056B6 /* LargestSeriesProductTest.m in Sources */,
|
811
829
|
1EFACAAF1CCCAF3D006F2E69 /* LeapExample.m in Sources */,
|
812
830
|
E9386EF01E0B694D0009A414 /* AtbashCipherTest.m in Sources */,
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
exercise_dir="$1"
|
4
|
+
if [[ -z "$exercise_dir" ]]; then
|
5
|
+
echo "Usage: $BASH_SOURCE <exercise>"
|
6
|
+
exit 1
|
7
|
+
fi
|
8
|
+
|
9
|
+
xpurescript=$(dirname "$BASH_SOURCE")
|
10
|
+
xpurescript=$(readlink -f "$xpurescript/..")
|
11
|
+
cd "$xpurescript"
|
12
|
+
|
13
|
+
cache_dir="$HOME"
|
14
|
+
if [ -z "$TRAVIS" ]; then
|
15
|
+
cache_dir="$xpurescript"
|
16
|
+
fi
|
17
|
+
cache_dir="$cache_dir/.exercise_cache"
|
18
|
+
|
19
|
+
declare -i TEST_RESULT=0
|
20
|
+
|
21
|
+
echo
|
22
|
+
echo -e "\e[1;34m----- Testing exercise \e[33m$exercise_dir\e[34m -----\e[0;39m"
|
23
|
+
echo
|
24
|
+
|
25
|
+
if [[ ! -f "exercises/$exercise_dir/bower.json" ]]; then
|
26
|
+
echo -e "\e[1;31mExercise \e[33m$exercise_dir\e[31m is missing bower.json, failing test\e[0;39m"
|
27
|
+
exit 1
|
28
|
+
fi
|
29
|
+
|
30
|
+
cd "exercises/$exercise_dir"
|
31
|
+
|
32
|
+
exercise_src=src
|
33
|
+
exercise_examples_src=examples/src
|
34
|
+
|
35
|
+
# Setup Travis cache
|
36
|
+
for dir in bower_components output; do
|
37
|
+
cache="$cache_dir/$exercise_dir/$dir"
|
38
|
+
|
39
|
+
mkdir -p "$cache"
|
40
|
+
ln -f -s "$cache"
|
41
|
+
done
|
42
|
+
|
43
|
+
mv "$exercise_src" "$exercise_src.impl"
|
44
|
+
mv "$exercise_examples_src" "$exercise_src"
|
45
|
+
|
46
|
+
bower install
|
47
|
+
pulp test
|
48
|
+
|
49
|
+
# capture result from last command (pulp test)
|
50
|
+
if [[ $? == 0 ]]; then
|
51
|
+
TEST_RESULT=1
|
52
|
+
fi
|
53
|
+
|
54
|
+
# be kind, rewind
|
55
|
+
mv "$exercise_src" "$exercise_examples_src"
|
56
|
+
mv "$exercise_src.impl" "$exercise_src"
|
57
|
+
|
58
|
+
exit $TEST_RESULT
|
@@ -1,18 +1,8 @@
|
|
1
1
|
#!/usr/bin/env bash
|
2
2
|
|
3
|
-
# TEST
|
4
|
-
|
5
3
|
xpurescript=$(dirname "$BASH_SOURCE")
|
6
4
|
xpurescript=$(readlink -f "$xpurescript/..")
|
7
5
|
cd "$xpurescript"
|
8
|
-
echo "xpurescript: $xpurescript"
|
9
|
-
|
10
|
-
cache_dir="$HOME"
|
11
|
-
if [ -z "$TRAVIS" ]; then
|
12
|
-
cache_dir="$xpurescript"
|
13
|
-
fi
|
14
|
-
cache_dir="$cache_dir/.exercise_cache"
|
15
|
-
echo "cache_dir: $cache_dir"
|
16
6
|
|
17
7
|
declare -i TEST_RESULT=0
|
18
8
|
FAILED_EXERCISES=''
|
@@ -21,44 +11,23 @@ cd exercises
|
|
21
11
|
|
22
12
|
for exercise_dir in *
|
23
13
|
do
|
24
|
-
|
25
|
-
echo "Testing $exercise_dir"
|
26
|
-
|
27
|
-
cd "$exercise_dir"
|
28
|
-
|
29
|
-
exercise_src=src
|
30
|
-
exercise_examples_src=examples/src
|
31
|
-
|
32
|
-
# Setup Travis cache
|
33
|
-
for dir in bower_components output; do
|
34
|
-
cache="$cache_dir/$exercise_dir/$dir"
|
35
|
-
|
36
|
-
mkdir -p "$cache"
|
37
|
-
ln -f -s "$cache"
|
38
|
-
echo "cache: $(ls -l "$dir")"
|
39
|
-
done
|
14
|
+
"$xpurescript/bin/test-one.sh" "$exercise_dir"
|
40
15
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
bower install
|
45
|
-
pulp test
|
46
|
-
|
47
|
-
# capture result from last command (pulp test)
|
48
|
-
if [ $? -ne 0 ]; then
|
49
|
-
TEST_RESULT=1
|
50
|
-
FAILED_EXERCISES+="$exercise_dir\n"
|
16
|
+
if [[ $? == 0 ]]; then
|
17
|
+
TEST_RESULT=1
|
18
|
+
FAILED_EXERCISES+="$exercise_dir\n"
|
51
19
|
fi
|
52
|
-
|
53
|
-
# be kind, rewind
|
54
|
-
mv "$exercise_src" "$exercise_examples_src"
|
55
|
-
mv "$exercise_src.impl" "$exercise_src"
|
56
|
-
|
57
|
-
cd -
|
58
20
|
done
|
59
21
|
|
60
|
-
|
61
|
-
|
22
|
+
echo
|
23
|
+
if [[ $TEST_RESULT == 0 ]]; then
|
24
|
+
echo -e "\e[1;32mAll exercises passed\e[0;39m"
|
25
|
+
else
|
26
|
+
echo -e "\e[1;31mThe following exercises failed"
|
27
|
+
|
28
|
+
echo -e "\e[1;33m"
|
62
29
|
printf $FAILED_EXERCISES
|
30
|
+
echo -e "\e[0;39m"
|
31
|
+
|
63
32
|
exit $TEST_RESULT
|
64
33
|
fi
|
@@ -0,0 +1,17 @@
|
|
1
|
+
{
|
2
|
+
"name": "bracket-push",
|
3
|
+
"ignore": [
|
4
|
+
"**/.*",
|
5
|
+
"node_modules",
|
6
|
+
"bower_components",
|
7
|
+
"output"
|
8
|
+
],
|
9
|
+
"dependencies": {
|
10
|
+
"purescript-prelude": "^2.5.0",
|
11
|
+
"purescript-lists": "^3.4.0"
|
12
|
+
},
|
13
|
+
"devDependencies": {
|
14
|
+
"purescript-psci-support": "^2.0.0",
|
15
|
+
"purescript-test-unit": "^10.1.0"
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module BracketPush
|
2
|
+
( isPaired
|
3
|
+
) where
|
4
|
+
|
5
|
+
import Prelude
|
6
|
+
import Data.Array (toUnfoldable)
|
7
|
+
import Data.List (List(..), filter, (:))
|
8
|
+
import Data.String (toCharArray)
|
9
|
+
|
10
|
+
data Bracket = Round | Square | Curly
|
11
|
+
|
12
|
+
derive instance eqBracket :: Eq Bracket
|
13
|
+
|
14
|
+
data Token = Open Bracket
|
15
|
+
| Close Bracket
|
16
|
+
| Other
|
17
|
+
|
18
|
+
derive instance eqToken :: Eq Token
|
19
|
+
|
20
|
+
token :: Char -> Token
|
21
|
+
token c
|
22
|
+
| c == '(' = Open Round
|
23
|
+
| c == '[' = Open Square
|
24
|
+
| c == '{' = Open Curly
|
25
|
+
| c == ')' = Close Round
|
26
|
+
| c == ']' = Close Square
|
27
|
+
| c == '}' = Close Curly
|
28
|
+
token _ = Other
|
29
|
+
|
30
|
+
walk :: List Token -> List Token -> Boolean
|
31
|
+
walk Nil Nil = true
|
32
|
+
walk xs (y@(Open c):ys) = walk (y:xs) ys
|
33
|
+
walk (Open x:xs) (Close y:ys)
|
34
|
+
| x == y = walk xs ys
|
35
|
+
| otherwise = false
|
36
|
+
walk _ _ = false
|
37
|
+
|
38
|
+
isPaired :: String -> Boolean
|
39
|
+
isPaired = toCharArray
|
40
|
+
>>> toUnfoldable
|
41
|
+
>>> map token
|
42
|
+
>>> filter ((/=) Other)
|
43
|
+
>>> walk Nil
|