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
         |