trackler 2.0.6.19 → 2.0.6.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/csharp/config.json +8 -0
  4. data/tracks/csharp/exercises/forth/Example.cs +257 -0
  5. data/tracks/csharp/exercises/forth/ForthTest.cs +134 -0
  6. data/tracks/fsharp/config.json +7 -1
  7. data/tracks/fsharp/exercises/exercises.fsproj +20 -0
  8. data/tracks/fsharp/exercises/lens-person/Example.fs +50 -0
  9. data/tracks/fsharp/exercises/lens-person/HINTS.md +2 -0
  10. data/tracks/fsharp/exercises/lens-person/LensPerson.fs +24 -0
  11. data/tracks/fsharp/exercises/lens-person/LensPersonTest.fs +43 -0
  12. data/tracks/fsharp/exercises/paket.references +2 -1
  13. data/tracks/fsharp/paket.dependencies +1 -0
  14. data/tracks/fsharp/paket.lock +1 -0
  15. data/tracks/javascript/exercises/{bob/bob.js → leap/leap.js} +3 -3
  16. data/tracks/julia/README.md +16 -0
  17. data/tracks/objective-c/config.json +17 -0
  18. data/tracks/objective-c/exercises/bracket-push/BracketPushExample.h +8 -0
  19. data/tracks/objective-c/exercises/bracket-push/BracketPushExample.m +386 -0
  20. data/tracks/objective-c/exercises/bracket-push/BracketPushTest.m +84 -0
  21. data/tracks/objective-c/exercises/sublist/SublistExample.h +7 -0
  22. data/tracks/objective-c/exercises/sublist/SublistExample.m +67 -0
  23. data/tracks/objective-c/exercises/sublist/SublistTest.m +139 -0
  24. data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +55 -2
  25. data/tracks/ocaml/exercises/dominoes/test.ml +11 -5
  26. data/tracks/ocaml/exercises/luhn/test.ml +3 -3
  27. data/tracks/ocaml/tools/test-generator/templates/dominoes/template.ml +11 -5
  28. data/tracks/pascal/config.json +1 -1
  29. data/tracks/pascal/docs/INSTALLATION.md +52 -0
  30. data/tracks/pascal/docs/img/00delphiwelcomepage.png +0 -0
  31. data/tracks/pascal/docs/img/01delphiclicktools.png +0 -0
  32. data/tracks/pascal/docs/img/02delphiclickoptions.png +0 -0
  33. data/tracks/pascal/docs/img/03delphioptionsenvironmentvariables.png +0 -0
  34. data/tracks/pascal/docs/img/04delphioptionsenvironmentvariablesclicknew.png +0 -0
  35. data/tracks/pascal/docs/img/05delphinewuservariable.png +0 -0
  36. data/tracks/pascal/docs/img/06delphioptionslibrary.png +0 -0
  37. data/tracks/pascal/docs/img/07delphiclicklibrarypathbutton.png +0 -0
  38. data/tracks/pascal/docs/img/08delphidirectoriesinputvarnameclickadd.png +0 -0
  39. data/tracks/pascal/docs/img/09delphidirectoriesclickok.png +0 -0
  40. data/tracks/pascal/docs/img/10delphioptonsclickok.png +0 -0
  41. data/tracks/pascal/exercises/nucleotide-count/uNucleotideCountExample.pas +9 -18
  42. data/tracks/pascal/exercises/nucleotide-count/uNucleotideCountTest.pas +16 -16
  43. data/tracks/php/config.json +7 -0
  44. data/tracks/php/exercises/book-store/book-store_test.php +146 -0
  45. data/tracks/php/exercises/book-store/example.php +38 -0
  46. data/tracks/swift/docs/TESTS.md +40 -35
  47. data/tracks/swift/docs/img/tests-fail.png +0 -0
  48. data/tracks/swift/docs/img/tests-pass.png +0 -0
  49. data/tracks/swift/docs/img/tests.png +0 -0
  50. metadata +28 -3
@@ -55,6 +55,26 @@
55
55
  </Otherwise>
56
56
  </Choose>
57
57
  <Import Project="$(FSharpTargetsPath)" Condition="Exists('$(FSharpTargetsPath)')" />
58
+ <Choose>
59
+ <When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v3.5' Or $(TargetFrameworkVersion) == 'v4.0' Or $(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3')">
60
+ <ItemGroup>
61
+ <Reference Include="Aether">
62
+ <HintPath>..\packages\Aether\lib\net35\Aether.dll</HintPath>
63
+ <Private>True</Private>
64
+ <Paket>True</Paket>
65
+ </Reference>
66
+ </ItemGroup>
67
+ </When>
68
+ <When Condition="($(TargetFrameworkIdentifier) == 'WindowsPhoneApp') Or ($(TargetFrameworkIdentifier) == '.NETCore') Or ($(TargetFrameworkIdentifier) == '.NETStandard' And ($(TargetFrameworkVersion) == 'v1.0' Or $(TargetFrameworkVersion) == 'v1.1' Or $(TargetFrameworkVersion) == 'v1.2' Or $(TargetFrameworkVersion) == 'v1.3' Or $(TargetFrameworkVersion) == 'v1.4' Or $(TargetFrameworkVersion) == 'v1.5' Or $(TargetFrameworkVersion) == 'v1.6')) Or ($(TargetFrameworkIdentifier) == '.NETCoreApp' And $(TargetFrameworkVersion) == 'v1.0') Or ($(TargetFrameworkIdentifier) == 'WindowsPhone' And ($(TargetFrameworkVersion) == 'v8.0' Or $(TargetFrameworkVersion) == 'v8.1')) Or ($(TargetFrameworkIdentifier) == 'MonoAndroid') Or ($(TargetFrameworkIdentifier) == 'MonoTouch') Or ($(TargetFrameworkIdentifier) == 'Xamarin.iOS') Or ($(TargetFrameworkIdentifier) == 'Xamarin.Mac') Or ($(TargetFrameworkProfile) == 'Profile7') Or ($(TargetFrameworkProfile) == 'Profile31') Or ($(TargetFrameworkProfile) == 'Profile32') Or ($(TargetFrameworkProfile) == 'Profile44') Or ($(TargetFrameworkProfile) == 'Profile49') Or ($(TargetFrameworkProfile) == 'Profile78') Or ($(TargetFrameworkProfile) == 'Profile84') Or ($(TargetFrameworkProfile) == 'Profile111') Or ($(TargetFrameworkProfile) == 'Profile151') Or ($(TargetFrameworkProfile) == 'Profile157') Or ($(TargetFrameworkProfile) == 'Profile259')">
69
+ <ItemGroup>
70
+ <Reference Include="Aether">
71
+ <HintPath>..\packages\Aether\lib\portable-net45+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1\Aether.dll</HintPath>
72
+ <Private>True</Private>
73
+ <Paket>True</Paket>
74
+ </Reference>
75
+ </ItemGroup>
76
+ </When>
77
+ </Choose>
58
78
  <Choose>
59
79
  <When Condition="$(TargetFrameworkIdentifier) == '.NETFramework' And ($(TargetFrameworkVersion) == 'v4.0' Or $(TargetFrameworkVersion) == 'v4.5' Or $(TargetFrameworkVersion) == 'v4.5.1' Or $(TargetFrameworkVersion) == 'v4.5.2' Or $(TargetFrameworkVersion) == 'v4.5.3' Or $(TargetFrameworkVersion) == 'v4.6' Or $(TargetFrameworkVersion) == 'v4.6.1' Or $(TargetFrameworkVersion) == 'v4.6.2' Or $(TargetFrameworkVersion) == 'v4.6.3')">
60
80
  <ItemGroup>
@@ -0,0 +1,50 @@
1
+ module LensPerson
2
+
3
+ open Aether
4
+ open Aether.Operators
5
+ open System
6
+
7
+ type Address =
8
+ { street: string
9
+ houseNumber: int
10
+ place: string
11
+ country: string }
12
+
13
+ static member street_ =
14
+ (fun a -> a.street), (fun b a -> { a with street = b })
15
+
16
+ type Born =
17
+ { at: Address
18
+ on: DateTime }
19
+
20
+ static member at_ =
21
+ (fun a -> a.at), (fun b a -> { a with at = b })
22
+
23
+ static member on_ =
24
+ (fun a -> a.on), (fun b a -> { a with on = b })
25
+
26
+ static member birthMonth_ =
27
+ (fun a -> a.on.Month), (fun b a -> { a with on = DateTime(a.on.Year, b, a.on.Day) })
28
+
29
+ type Name =
30
+ { name: string
31
+ surName: string }
32
+
33
+ type Person =
34
+ { name: Name
35
+ born: Born
36
+ address: Address }
37
+
38
+ static member born_ =
39
+ (fun a -> a.born), (fun b a -> { a with born = b })
40
+
41
+ static member address_ =
42
+ (fun a -> a.address), (fun b a -> { a with address = b })
43
+
44
+ let bornAtStreet = Person.born_ >-> Born.at_ >-> Address.street_
45
+
46
+ let bornOn = Person.born_ >-> Born.on_
47
+
48
+ let currentStreet = Person.address_ >-> Address.street_
49
+
50
+ let birthMonth = Person.born_ >-> Born.birthMonth_
@@ -0,0 +1,2 @@
1
+ ## Hints
2
+ - This exercise expects you to use the [Aether](https://xyncro.tech/aether/) library, which adds *lenses* functionality to F#. With lenses, you can quite easily read or update nested structures.
@@ -0,0 +1,24 @@
1
+ module LensPerson
2
+
3
+ open Aether
4
+ open Aether.Operators
5
+ open System
6
+
7
+ type Address =
8
+ { street: string
9
+ houseNumber: int
10
+ place: string
11
+ country: string }
12
+
13
+ type Born =
14
+ { at: Address
15
+ on: DateTime }
16
+
17
+ type Name =
18
+ { name: string
19
+ surName: string }
20
+
21
+ type Person =
22
+ { name: Name
23
+ born: Born
24
+ address: Address }
@@ -0,0 +1,43 @@
1
+ module LensPersonTest
2
+
3
+ open System
4
+ open NUnit.Framework
5
+ open Aether
6
+ open Aether.Operators
7
+ open LensPerson
8
+
9
+ let testPerson =
10
+ { name =
11
+ { name = "Jane Joanna"
12
+ surName = "Doe" }
13
+ born =
14
+ { at =
15
+ { street = "Longway"
16
+ houseNumber = 1024
17
+ place = "Springfield"
18
+ country = "United States" }
19
+ on = DateTime(1984, 4, 12) }
20
+ address =
21
+ { street = "Shortlane"
22
+ houseNumber = 2
23
+ place = "Fallmeadow"
24
+ country = "Canada" } }
25
+
26
+ [<Test>]
27
+ let ``Set born at street`` () =
28
+ Assert.That(Optic.get bornAtStreet testPerson, Is.EqualTo("Longway"))
29
+
30
+ [<Test>]
31
+ [<Ignore("Remove to run test")>]
32
+ let ``Set current street`` () =
33
+ Assert.That(Optic.set currentStreet "Middleroad" testPerson |> Optic.get currentStreet, Is.EqualTo("Middleroad"))
34
+
35
+ [<Test>]
36
+ [<Ignore("Remove to run test")>]
37
+ let ``Upper case born at street`` () =
38
+ Assert.That(Optic.map bornAtStreet (fun x -> x.ToUpper()) testPerson |> Optic.get bornAtStreet, Is.EqualTo("LONGWAY"))
39
+
40
+ [<Test>]
41
+ [<Ignore("Remove to run test")>]
42
+ let ``Set birth month`` () =
43
+ Assert.That(Optic.set birthMonth 9 testPerson |> Optic.get bornOn, Is.EqualTo(DateTime(1984, 9, 12)))
@@ -1,3 +1,4 @@
1
1
  FParsec
2
2
  NUnit
3
- FSharp.Core
3
+ FSharp.Core
4
+ aether
@@ -1,4 +1,5 @@
1
1
  source https://www.nuget.org/api/v2/
2
+ nuget aether
2
3
  nuget FAKE
3
4
  nuget FParsec
4
5
  nuget FSharp.Core
@@ -1,5 +1,6 @@
1
1
  NUGET
2
2
  remote: https://www.nuget.org/api/v2
3
+ Aether (8.1.2)
3
4
  FAKE (4.46.1)
4
5
  FParsec (1.0.2)
5
6
  FSharp.Core (4.0.0.1)
@@ -3,12 +3,12 @@
3
3
  // convenience to get you started writing code faster.
4
4
  //
5
5
 
6
- var Bob = function() {};
6
+ var Year = function() {};
7
7
 
8
- Bob.prototype.hey = function(input) {
8
+ Year.prototype.isLeap = function(input) {
9
9
  //
10
10
  // YOUR CODE GOES HERE
11
11
  //
12
12
  };
13
13
 
14
- module.exports = Bob;
14
+ module.exports = Year;
@@ -12,6 +12,8 @@ Please see the [contributing guide](https://github.com/exercism/x-common/blob/ma
12
12
 
13
13
  ## Working on the Exercises
14
14
 
15
+ ### Implementing an exercise
16
+
15
17
  A pool of exercises can be found in the [x-Common repo](https://github.com/exercism/x-common).
16
18
 
17
19
  Exercises for the Julia track go in the `exercises` directory and should follow the following filename conventions:
@@ -26,5 +28,19 @@ Replace `<slug>` with the exercise slug of the exercise you're working on.
26
28
 
27
29
  See [Issue #2](https://github.com/exercism/xjulia/issues/2) for discussion on the structure.
28
30
 
31
+ ### Adding it to config
32
+
33
+ Make sure to add the exercise to the `config.json` file, by adding an entry to the `exercises` array:
34
+ ```json
35
+ "exercises": [
36
+ {
37
+ "slug": "hello-world" ,
38
+ "difficulty": 1,
39
+ "topics": ["strings"]
40
+ }
41
+ ]
42
+ ```
43
+ If possible, add info on which topics the exercise is about and estimate a difficulty level from 1 to 10. We can adjust these later on when we know more about the exercise and how users solve them.
44
+
29
45
  ### Testing the example solutions
30
46
  Test your example solutions by running `julia runtests.jl` in the project directory. Specify exercise slugs as arguments to run only certain exercises: `julia runtests.jl <slug>`.
@@ -105,6 +105,14 @@
105
105
  "Filtering"
106
106
  ]
107
107
  },
108
+ {
109
+ "difficulty": 3,
110
+ "slug": "sublist",
111
+ "topics": [
112
+ "Looping",
113
+ "Lists"
114
+ ]
115
+ },
108
116
  {
109
117
  "difficulty": 3,
110
118
  "slug": "clock",
@@ -253,6 +261,15 @@
253
261
  "Transforming"
254
262
  ]
255
263
  },
264
+ {
265
+ "difficulty": 5,
266
+ "slug": "bracket-push",
267
+ "topics": [
268
+ "Strings",
269
+ "Conditionals",
270
+ "Looping"
271
+ ]
272
+ },
256
273
  {
257
274
  "difficulty": 5,
258
275
  "slug": "roman-numerals",
@@ -0,0 +1,8 @@
1
+ #import <Foundation/Foundation.h>
2
+
3
+ @interface BracketPushExample : NSObject
4
+
5
+ + (BOOL)validateBracketPairingAndNestingInString:(NSString*)string;
6
+
7
+
8
+ @end
@@ -0,0 +1,386 @@
1
+ #import "BracketPushExample.h"
2
+
3
+ static NSMutableDictionary *parentheses;
4
+ static NSMutableDictionary *curlyBraces;
5
+ static NSMutableDictionary *squareBrackets;
6
+ static NSMutableArray *bracketType;
7
+ static NSString *inputString = @"";
8
+ static bool parenthesesPaired = false;
9
+ static bool curlyBracesPaired = false;
10
+ static bool squareBracesPaired = false;
11
+ static bool roundAndCurlyPaired = false;
12
+ static bool curlyAndSquarePaired =false;
13
+ static bool roundAndSquarePaired = false;
14
+
15
+ @implementation BracketPushExample
16
+
17
+ + (BOOL)validateBracketPairingAndNestingInString:(NSString *)string{
18
+
19
+ if([string isEqualToString:@""]){
20
+
21
+ return true;
22
+ }
23
+
24
+ inputString = string;
25
+ parentheses = [NSMutableDictionary dictionary];
26
+ curlyBraces = [NSMutableDictionary dictionary];
27
+ squareBrackets = [NSMutableDictionary dictionary];
28
+ bracketType = [NSMutableArray array];
29
+
30
+ [BracketPushExample checkBracketType:@"(" inString:string];
31
+ [BracketPushExample checkBracketType:@")" inString:string];
32
+ [BracketPushExample checkBracketType:@"{" inString:string];
33
+ [BracketPushExample checkBracketType:@"}" inString:string];
34
+ [BracketPushExample checkBracketType:@"[" inString:string];
35
+ [BracketPushExample checkBracketType:@"]" inString:string];
36
+ if(parentheses.count <= 2 && parentheses.count != 0){
37
+
38
+ [bracketType addObject:parentheses];
39
+ }
40
+
41
+ if(curlyBraces.count <= 2 && curlyBraces.count != 0){
42
+
43
+ [bracketType addObject:curlyBraces];
44
+ }
45
+
46
+ if(squareBrackets.count <= 2 && squareBrackets.count != 0){
47
+
48
+ [bracketType addObject:squareBrackets];
49
+ }
50
+
51
+
52
+ if([BracketPushExample checkPairingOfAllBrackets]){
53
+
54
+ return [BracketPushExample checkBracketNestingForAllBrackets];
55
+ }
56
+
57
+
58
+
59
+ return false;
60
+ }
61
+
62
+
63
+
64
+
65
+ + (BOOL)checkPairingOfAllBrackets{
66
+
67
+
68
+ bool result = false;
69
+ parenthesesPaired = [bracketType containsObject:parentheses]?[[parentheses objectForKey:@"("] intValue] == [[parentheses objectForKey:@")"] intValue]:false;
70
+ curlyBracesPaired = [bracketType containsObject:curlyBraces]?[[curlyBraces objectForKey:@"{"] intValue] == [[curlyBraces objectForKey:@"}"] intValue]:false;
71
+ squareBracesPaired = [bracketType containsObject:squareBrackets]?[[squareBrackets objectForKey:@"["] intValue] == [[squareBrackets objectForKey:@"]"] intValue]:false;
72
+ switch((int)bracketType.count){
73
+
74
+ case 1: result = [BracketPushExample checkBracketPairingOneAtATime];
75
+ break;
76
+
77
+ case 2: result = [BracketPushExample checkBracketPairingTwoAtATime];
78
+ break;
79
+
80
+ case 3: result = parenthesesPaired && curlyBracesPaired && squareBracesPaired;
81
+ break;
82
+
83
+ default:break;
84
+
85
+ }
86
+
87
+ return result;
88
+ }
89
+
90
+
91
+
92
+
93
+ + (NSString*)getClosingBracketForOpeningBracket:(NSString*)opener{
94
+
95
+ if([opener isEqualToString:@"("]){
96
+
97
+ return @")";
98
+ }else if([opener isEqualToString:@"{"]){
99
+
100
+ return @"}";
101
+ }else if([opener isEqualToString:@"["]){
102
+
103
+ return @"]";
104
+ }
105
+
106
+ return @"";
107
+ }
108
+
109
+
110
+
111
+ + (BOOL)checkBracketPairingTwoAtATime{
112
+
113
+ if(parenthesesPaired && curlyBracesPaired){
114
+
115
+ roundAndCurlyPaired=true;
116
+
117
+ }else if(curlyBracesPaired && squareBracesPaired){
118
+
119
+ curlyAndSquarePaired=true;
120
+ }else if(squareBracesPaired && parenthesesPaired){
121
+
122
+ roundAndSquarePaired=true;
123
+ }
124
+ return (roundAndCurlyPaired) || (curlyAndSquarePaired) || (roundAndSquarePaired);
125
+ }
126
+
127
+
128
+
129
+
130
+ + (BOOL)checkBracketPairingOneAtATime{
131
+
132
+ return (parenthesesPaired || curlyBracesPaired || squareBracesPaired);
133
+ }
134
+
135
+
136
+
137
+ + (void)checkBracketType:(NSString*)bracket inString:(NSString*)string{
138
+
139
+ if([string rangeOfString:bracket].location != NSNotFound){
140
+
141
+ if([bracket isEqualToString:@"("] || [bracket isEqualToString:@")"]){
142
+
143
+ parentheses[bracket] = [NSNumber numberWithInteger:[string componentsSeparatedByString:bracket].count - 1];
144
+
145
+
146
+ }else if([bracket isEqualToString:@"{"] || [bracket isEqualToString:@"}"]){
147
+
148
+ curlyBraces[bracket] = [NSNumber numberWithInteger:[string componentsSeparatedByString:bracket].count - 1];
149
+
150
+ }else if([bracket isEqualToString:@"["] || [bracket isEqualToString:@"]"]){
151
+
152
+ squareBrackets[bracket] = [NSNumber numberWithInteger:[string componentsSeparatedByString:bracket].count - 1];
153
+
154
+ }
155
+ }
156
+
157
+ }
158
+
159
+
160
+
161
+
162
+ + (BOOL)checkBracketNestingForAllBrackets{
163
+
164
+ bool result = false;
165
+ switch (bracketType.count) {
166
+
167
+ case 1: if([bracketType containsObject:parentheses]){
168
+
169
+ result = [BracketPushExample checkNestingOfBracketsOneAtATimeWithOpener:@"(" andCloser:@")"];
170
+
171
+ }else if([bracketType containsObject:curlyBraces]){
172
+
173
+ result = [BracketPushExample checkNestingOfBracketsOneAtATimeWithOpener:@"{" andCloser:@"}"];
174
+
175
+ }else if([bracketType containsObject:squareBrackets]){
176
+
177
+ result = [BracketPushExample checkNestingOfBracketsOneAtATimeWithOpener:@"[" andCloser:@"]"];
178
+ }
179
+ break;
180
+
181
+
182
+ case 2: if(roundAndCurlyPaired){
183
+
184
+ result = [BracketPushExample checkNestingOfBracketsTwoAtATime:@"({"];
185
+
186
+
187
+ }else if(curlyAndSquarePaired){
188
+
189
+ result = [BracketPushExample checkNestingOfBracketsTwoAtATime:@"{["];
190
+
191
+ }else if(roundAndSquarePaired){
192
+
193
+ result = [BracketPushExample checkNestingOfBracketsTwoAtATime:@"[("];
194
+
195
+ }
196
+
197
+ break;
198
+
199
+
200
+ case 3: result = [BracketPushExample checkNestingOfBracketsThreeAtATime];
201
+ break;
202
+
203
+
204
+ default:break;
205
+ }
206
+ return result;
207
+ }
208
+
209
+
210
+
211
+
212
+ + (BOOL)checkNestingOfBracketsOneAtATimeWithOpener:(NSString*)opener andCloser:(NSString*)closer{
213
+
214
+
215
+
216
+ NSScanner *openScanner = [NSScanner scannerWithString:inputString];
217
+ NSScanner *closeScanner = [NSScanner scannerWithString:inputString];
218
+ [openScanner scanUpToString:opener intoString:nil];
219
+ [closeScanner scanUpToString:closer intoString:nil];
220
+ while(!openScanner.isAtEnd && !closeScanner.isAtEnd){
221
+
222
+ if(openScanner.scanLocation > closeScanner.scanLocation){
223
+
224
+ return false;
225
+ }
226
+ [openScanner setScanLocation:openScanner.scanLocation+1];
227
+ [closeScanner setScanLocation:closeScanner.scanLocation+1];
228
+ [openScanner scanUpToString:opener intoString:nil];
229
+ [closeScanner scanUpToString:closer intoString:nil];
230
+ }
231
+
232
+
233
+ return true;
234
+ }
235
+
236
+
237
+
238
+
239
+ + (BOOL)checkNestingOfBracketsTwoAtATime:(NSString*)bracketTypeString{
240
+
241
+ int opener1Occurence = 0;
242
+ int closer1Occurence = 0;
243
+ int opener2Occurence = 0;
244
+ int closer2Occurence = 0;
245
+ NSScanner *opener1 = [NSScanner scannerWithString:inputString];
246
+ NSScanner *closer1= [NSScanner scannerWithString:inputString];
247
+ NSScanner *opener2= [NSScanner scannerWithString:inputString];
248
+ NSScanner *closer2= [NSScanner scannerWithString:inputString];
249
+
250
+ NSString *openingBracket1 = [NSString stringWithFormat:@"%c",[bracketTypeString characterAtIndex:0]];
251
+ NSString *openingBracket2 = [NSString stringWithFormat:@"%c",[bracketTypeString characterAtIndex:1]];
252
+ NSString *closingBracket1 = [BracketPushExample getClosingBracketForOpeningBracket:openingBracket1];
253
+ NSString *closingBracket2 = [BracketPushExample getClosingBracketForOpeningBracket:openingBracket2];
254
+
255
+ [opener1 scanUpToString:openingBracket1 intoString:nil];
256
+ [opener2 scanUpToString:openingBracket2 intoString:nil];
257
+ [closer1 scanUpToString:closingBracket1 intoString:nil];
258
+ [closer2 scanUpToString:closingBracket2 intoString:nil];
259
+
260
+ while(!opener1.isAtEnd && !opener2.isAtEnd && !closer1.isAtEnd && !closer2.isAtEnd){
261
+
262
+ opener1Occurence++;
263
+ opener2Occurence++;
264
+ closer1Occurence++;
265
+ closer2Occurence++;
266
+
267
+ if(opener1.scanLocation < opener2.scanLocation){
268
+
269
+ if(closer2.scanLocation != opener2.scanLocation + 1 && closer2.scanLocation > closer1.scanLocation && opener2Occurence == 1){
270
+
271
+
272
+ return false;
273
+
274
+
275
+ }
276
+
277
+ }else{
278
+
279
+ if(closer1.scanLocation > closer2.scanLocation && closer1.scanLocation != opener1.scanLocation + 1 && opener1Occurence == 1){
280
+
281
+ return false;
282
+
283
+ }
284
+ }
285
+ [opener1 setScanLocation:opener1.scanLocation+1];
286
+ [opener2 setScanLocation:opener2.scanLocation+1];
287
+ [closer1 setScanLocation:closer1.scanLocation+1];
288
+ [closer2 setScanLocation:closer2.scanLocation+1];
289
+ [opener1 scanUpToString:openingBracket1 intoString:nil];
290
+ [opener2 scanUpToString:openingBracket2 intoString:nil];
291
+ [closer1 scanUpToString:closingBracket1 intoString:nil];
292
+ [closer2 scanUpToString:closingBracket2 intoString:nil];
293
+
294
+ }
295
+ return true;
296
+ }
297
+
298
+
299
+
300
+
301
+
302
+ + (BOOL)checkNestingOfBracketsThreeAtATime{
303
+
304
+ NSString *orderOfoccurence = [BracketPushExample checkOrderOfOccurenceOfThreeBracketTypes];
305
+ NSString *opener1 = [NSString stringWithFormat:@"%c",[orderOfoccurence characterAtIndex:0]];
306
+ NSString *opener2 = [NSString stringWithFormat:@"%c",[orderOfoccurence characterAtIndex:1]];
307
+ NSString *opener3 = [NSString stringWithFormat:@"%c",[orderOfoccurence characterAtIndex:2]];
308
+ NSString *closer1 = [BracketPushExample getClosingBracketForOpeningBracket:opener1];
309
+ NSString *closer2 = [BracketPushExample getClosingBracketForOpeningBracket:opener2];
310
+ NSString *closer3 = [BracketPushExample getClosingBracketForOpeningBracket:opener3];
311
+
312
+ NSScanner *scanner = [NSScanner scannerWithString:inputString];
313
+ NSScanner *scanner1 = [NSScanner scannerWithString:inputString];
314
+ NSScanner *scanner2 = [NSScanner scannerWithString:inputString];
315
+ NSScanner *scanner3 = [NSScanner scannerWithString:inputString];
316
+
317
+ [scanner scanUpToString:opener1 intoString:nil];
318
+ [scanner1 scanUpToString:closer1 intoString:nil];
319
+ [scanner2 scanUpToString:closer2 intoString:nil];
320
+ [scanner3 scanUpToString:closer3 intoString:nil];
321
+
322
+ while(!scanner.isAtEnd && !scanner1.isAtEnd && !scanner2.isAtEnd && !scanner3.isAtEnd){
323
+
324
+ if(scanner1.scanLocation != (scanner.scanLocation + 1) && scanner1.scanLocation < scanner2.scanLocation && scanner1.scanLocation < scanner3.scanLocation){
325
+
326
+ return false;
327
+ }
328
+ scanner.scanLocation = scanner.scanLocation+1;
329
+ scanner1.scanLocation = scanner1.scanLocation+1;
330
+ scanner2.scanLocation = scanner2.scanLocation+1;
331
+ scanner3.scanLocation = scanner3.scanLocation+1;
332
+ [scanner scanUpToString:opener1 intoString:nil];
333
+ [scanner1 scanUpToString:closer1 intoString:nil];
334
+ [scanner2 scanUpToString:closer2 intoString:nil];
335
+ [scanner3 scanUpToString:closer3 intoString:nil];
336
+ }
337
+
338
+ return [BracketPushExample checkNestingOfBracketsTwoAtATime:[NSString stringWithFormat:@"%@%@",opener2,opener3]];
339
+
340
+ }
341
+
342
+
343
+
344
+
345
+ + (NSString*)checkOrderOfOccurenceOfThreeBracketTypes{
346
+
347
+ NSScanner *scanner1 = [NSScanner scannerWithString:inputString];
348
+ NSScanner *scanner2 = [NSScanner scannerWithString:inputString];
349
+ NSScanner *scanner3 = [NSScanner scannerWithString:inputString];
350
+
351
+
352
+
353
+ [scanner1 scanUpToString:@"(" intoString:nil];
354
+ [scanner2 scanUpToString:@"{" intoString:nil];
355
+ [scanner3 scanUpToString:@"[" intoString:nil];
356
+
357
+
358
+
359
+ if(scanner1.scanLocation < scanner2.scanLocation && scanner1.scanLocation < scanner3.scanLocation){
360
+
361
+ if(scanner2.scanLocation < scanner3.scanLocation){
362
+
363
+ return @"({[";
364
+ }
365
+ return @"([{";
366
+ }else if(scanner2.scanLocation < scanner1.scanLocation && scanner2.scanLocation < scanner3.scanLocation){
367
+
368
+ if(scanner1.scanLocation < scanner3.scanLocation){
369
+
370
+ return @"{([";
371
+ }
372
+ return @"{[(";
373
+
374
+ }
375
+
376
+ if(scanner1.scanLocation < scanner2.scanLocation){
377
+
378
+ return @"[({";
379
+ }
380
+ return @"[{(";
381
+
382
+
383
+
384
+ }
385
+
386
+ @end