trackler 2.0.6.19 → 2.0.6.20
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/csharp/config.json +8 -0
- data/tracks/csharp/exercises/forth/Example.cs +257 -0
- data/tracks/csharp/exercises/forth/ForthTest.cs +134 -0
- data/tracks/fsharp/config.json +7 -1
- data/tracks/fsharp/exercises/exercises.fsproj +20 -0
- data/tracks/fsharp/exercises/lens-person/Example.fs +50 -0
- data/tracks/fsharp/exercises/lens-person/HINTS.md +2 -0
- data/tracks/fsharp/exercises/lens-person/LensPerson.fs +24 -0
- data/tracks/fsharp/exercises/lens-person/LensPersonTest.fs +43 -0
- data/tracks/fsharp/exercises/paket.references +2 -1
- data/tracks/fsharp/paket.dependencies +1 -0
- data/tracks/fsharp/paket.lock +1 -0
- data/tracks/javascript/exercises/{bob/bob.js → leap/leap.js} +3 -3
- data/tracks/julia/README.md +16 -0
- data/tracks/objective-c/config.json +17 -0
- data/tracks/objective-c/exercises/bracket-push/BracketPushExample.h +8 -0
- data/tracks/objective-c/exercises/bracket-push/BracketPushExample.m +386 -0
- data/tracks/objective-c/exercises/bracket-push/BracketPushTest.m +84 -0
- data/tracks/objective-c/exercises/sublist/SublistExample.h +7 -0
- data/tracks/objective-c/exercises/sublist/SublistExample.m +67 -0
- data/tracks/objective-c/exercises/sublist/SublistTest.m +139 -0
- data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +55 -2
- data/tracks/ocaml/exercises/dominoes/test.ml +11 -5
- data/tracks/ocaml/exercises/luhn/test.ml +3 -3
- data/tracks/ocaml/tools/test-generator/templates/dominoes/template.ml +11 -5
- data/tracks/pascal/config.json +1 -1
- data/tracks/pascal/docs/INSTALLATION.md +52 -0
- data/tracks/pascal/docs/img/00delphiwelcomepage.png +0 -0
- data/tracks/pascal/docs/img/01delphiclicktools.png +0 -0
- data/tracks/pascal/docs/img/02delphiclickoptions.png +0 -0
- data/tracks/pascal/docs/img/03delphioptionsenvironmentvariables.png +0 -0
- data/tracks/pascal/docs/img/04delphioptionsenvironmentvariablesclicknew.png +0 -0
- data/tracks/pascal/docs/img/05delphinewuservariable.png +0 -0
- data/tracks/pascal/docs/img/06delphioptionslibrary.png +0 -0
- data/tracks/pascal/docs/img/07delphiclicklibrarypathbutton.png +0 -0
- data/tracks/pascal/docs/img/08delphidirectoriesinputvarnameclickadd.png +0 -0
- data/tracks/pascal/docs/img/09delphidirectoriesclickok.png +0 -0
- data/tracks/pascal/docs/img/10delphioptonsclickok.png +0 -0
- data/tracks/pascal/exercises/nucleotide-count/uNucleotideCountExample.pas +9 -18
- data/tracks/pascal/exercises/nucleotide-count/uNucleotideCountTest.pas +16 -16
- data/tracks/php/config.json +7 -0
- data/tracks/php/exercises/book-store/book-store_test.php +146 -0
- data/tracks/php/exercises/book-store/example.php +38 -0
- data/tracks/swift/docs/TESTS.md +40 -35
- data/tracks/swift/docs/img/tests-fail.png +0 -0
- data/tracks/swift/docs/img/tests-pass.png +0 -0
- data/tracks/swift/docs/img/tests.png +0 -0
- metadata +28 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a74906359ef6716f5ba79719f22de614e19f79a7
|
4
|
+
data.tar.gz: ae56be98e926ec4f4cf082af5c727a0f842b8eb0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b4bb7fc87665af298f845160c685eef1d49480443b61f4f98be954bcfda314cc145230bf62c0f7b16ab3cbcc5873ca0698f116a3c30379ef101ca3cec44a232
|
7
|
+
data.tar.gz: 3be91f09a9535cab6a09afa6911fdd262bcac4dc28b36cf1ff400a71b2a83f28888a08134c1a6653d5459b6311c18b10eb5be070621664fa131898339410d5d6
|
data/lib/trackler/version.rb
CHANGED
data/tracks/csharp/config.json
CHANGED
@@ -0,0 +1,257 @@
|
|
1
|
+
using System;
|
2
|
+
using System.Linq;
|
3
|
+
using System.Collections.Generic;
|
4
|
+
using Sprache;
|
5
|
+
|
6
|
+
public enum ForthError
|
7
|
+
{
|
8
|
+
DivisionByZero,
|
9
|
+
StackUnderflow,
|
10
|
+
InvalidWord,
|
11
|
+
UnknownWord
|
12
|
+
}
|
13
|
+
|
14
|
+
public class ForthException : Exception
|
15
|
+
{
|
16
|
+
public ForthException(ForthError error)
|
17
|
+
{
|
18
|
+
Error = error;
|
19
|
+
}
|
20
|
+
|
21
|
+
public ForthError Error { get; }
|
22
|
+
}
|
23
|
+
|
24
|
+
public class ForthState
|
25
|
+
{
|
26
|
+
public Stack<int> Stack { get; } = new Stack<int>();
|
27
|
+
public Dictionary<string, IEnumerable<ForthDefinition>> Mapping { get; } = new Dictionary<string, IEnumerable<ForthDefinition>>();
|
28
|
+
|
29
|
+
public override string ToString() => string.Join(" ", Stack.Reverse());
|
30
|
+
}
|
31
|
+
|
32
|
+
public abstract class ForthDefinition
|
33
|
+
{
|
34
|
+
public abstract void Evaluate(ForthState state);
|
35
|
+
}
|
36
|
+
|
37
|
+
public abstract class TermDefinition : ForthDefinition
|
38
|
+
{
|
39
|
+
public TermDefinition(string term)
|
40
|
+
{
|
41
|
+
Term = term;
|
42
|
+
}
|
43
|
+
|
44
|
+
public string Term { get; }
|
45
|
+
|
46
|
+
public override void Evaluate(ForthState state)
|
47
|
+
{
|
48
|
+
if (IsUserTerm(state))
|
49
|
+
EvaluateUserTerm(state);
|
50
|
+
else
|
51
|
+
EvaluateDefaultTerm(state);
|
52
|
+
}
|
53
|
+
|
54
|
+
private bool IsUserTerm(ForthState state) => state.Mapping.ContainsKey(Term);
|
55
|
+
|
56
|
+
public virtual void EvaluateUserTerm(ForthState state)
|
57
|
+
{
|
58
|
+
foreach (var definition in state.Mapping[Term])
|
59
|
+
definition.Evaluate(state);
|
60
|
+
}
|
61
|
+
|
62
|
+
public abstract void EvaluateDefaultTerm(ForthState state);
|
63
|
+
}
|
64
|
+
|
65
|
+
public abstract class UnaryOperation: TermDefinition
|
66
|
+
{
|
67
|
+
public UnaryOperation(string term) : base(term)
|
68
|
+
{
|
69
|
+
}
|
70
|
+
|
71
|
+
public override void EvaluateDefaultTerm(ForthState state)
|
72
|
+
{
|
73
|
+
if (state.Stack.Count < 1)
|
74
|
+
throw new ForthException(ForthError.StackUnderflow);
|
75
|
+
|
76
|
+
var operand = state.Stack.Pop();
|
77
|
+
|
78
|
+
foreach (var value in operation(operand))
|
79
|
+
state.Stack.Push(value);
|
80
|
+
}
|
81
|
+
|
82
|
+
public abstract List<int> operation(int x);
|
83
|
+
}
|
84
|
+
|
85
|
+
public abstract class BinaryOperation : TermDefinition
|
86
|
+
{
|
87
|
+
public BinaryOperation(string term) : base(term)
|
88
|
+
{
|
89
|
+
}
|
90
|
+
|
91
|
+
public override void EvaluateDefaultTerm(ForthState state)
|
92
|
+
{
|
93
|
+
if (state.Stack.Count <= 1)
|
94
|
+
throw new ForthException(ForthError.StackUnderflow);
|
95
|
+
|
96
|
+
var operand2 = state.Stack.Pop();
|
97
|
+
var operand1 = state.Stack.Pop();
|
98
|
+
|
99
|
+
foreach (var value in operation(operand1, operand2))
|
100
|
+
state.Stack.Push(value);
|
101
|
+
}
|
102
|
+
|
103
|
+
public abstract List<int> operation(int x, int y);
|
104
|
+
}
|
105
|
+
|
106
|
+
public class Constant : ForthDefinition
|
107
|
+
{
|
108
|
+
private readonly int n;
|
109
|
+
|
110
|
+
public Constant(int n)
|
111
|
+
{
|
112
|
+
this.n = n;
|
113
|
+
}
|
114
|
+
|
115
|
+
public override void Evaluate(ForthState state) => state.Stack.Push(n);
|
116
|
+
}
|
117
|
+
|
118
|
+
public class Word : TermDefinition
|
119
|
+
{
|
120
|
+
public Word(string str) : base(str)
|
121
|
+
{
|
122
|
+
}
|
123
|
+
|
124
|
+
public override void EvaluateDefaultTerm(ForthState state)
|
125
|
+
{
|
126
|
+
if (!state.Mapping.ContainsKey(Term))
|
127
|
+
throw new ForthException(ForthError.UnknownWord);
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
131
|
+
public class Dup: UnaryOperation
|
132
|
+
{
|
133
|
+
public Dup() : base("dup") {}
|
134
|
+
public override List<int> operation(int x) => new List<int> { x, x };
|
135
|
+
}
|
136
|
+
|
137
|
+
public class Drop : UnaryOperation
|
138
|
+
{
|
139
|
+
public Drop() : base("drop") {}
|
140
|
+
public override List<int> operation(int x) => new List<int>();
|
141
|
+
}
|
142
|
+
|
143
|
+
public class Swap : BinaryOperation
|
144
|
+
{
|
145
|
+
public Swap() : base("swap") {}
|
146
|
+
public override List<int> operation(int x, int y) => new List<int> { y, x };
|
147
|
+
}
|
148
|
+
|
149
|
+
public class Over : BinaryOperation
|
150
|
+
{
|
151
|
+
public Over() : base("over") {}
|
152
|
+
public override List<int> operation(int x, int y) => new List<int> { x, y, x };
|
153
|
+
}
|
154
|
+
|
155
|
+
public class Plus : BinaryOperation
|
156
|
+
{
|
157
|
+
public Plus() : base("+") {}
|
158
|
+
public override List<int> operation(int x, int y) => new List<int> { x + y };
|
159
|
+
}
|
160
|
+
|
161
|
+
public class Minus : BinaryOperation
|
162
|
+
{
|
163
|
+
public Minus() : base("-") {}
|
164
|
+
public override List<int> operation(int x, int y) => new List<int> { x - y };
|
165
|
+
}
|
166
|
+
|
167
|
+
public class Multiply : BinaryOperation
|
168
|
+
{
|
169
|
+
public Multiply() : base("*") {}
|
170
|
+
public override List<int> operation(int x, int y) => new List<int> { x * y };
|
171
|
+
}
|
172
|
+
|
173
|
+
public class Division : BinaryOperation
|
174
|
+
{
|
175
|
+
public Division() : base("/") {}
|
176
|
+
|
177
|
+
public override List<int> operation(int x, int y)
|
178
|
+
{
|
179
|
+
if (y == 0)
|
180
|
+
throw new ForthException(ForthError.DivisionByZero);
|
181
|
+
|
182
|
+
return new List<int> { x / y };
|
183
|
+
}
|
184
|
+
}
|
185
|
+
|
186
|
+
public class CustomTerm : ForthDefinition
|
187
|
+
{
|
188
|
+
private readonly string term;
|
189
|
+
private readonly IEnumerable<ForthDefinition> actions;
|
190
|
+
|
191
|
+
public CustomTerm(string term, IEnumerable<ForthDefinition> actions)
|
192
|
+
{
|
193
|
+
this.term = term;
|
194
|
+
this.actions = actions;
|
195
|
+
}
|
196
|
+
|
197
|
+
public override void Evaluate(ForthState state)
|
198
|
+
{
|
199
|
+
int result;
|
200
|
+
if (int.TryParse(term, out result))
|
201
|
+
throw new ForthException(ForthError.InvalidWord);
|
202
|
+
|
203
|
+
state.Mapping[term] = actions;
|
204
|
+
}
|
205
|
+
}
|
206
|
+
|
207
|
+
public static class Forth
|
208
|
+
{
|
209
|
+
public static string Eval(string input)
|
210
|
+
{
|
211
|
+
var expression = Expression.Parse(input);
|
212
|
+
var state = new ForthState();
|
213
|
+
|
214
|
+
foreach (var definition in expression)
|
215
|
+
definition.Evaluate(state);
|
216
|
+
|
217
|
+
return state.ToString();
|
218
|
+
}
|
219
|
+
|
220
|
+
private static readonly Parser<Constant> Constant =
|
221
|
+
from number in Parse.Number
|
222
|
+
from whitespace in Parse.WhiteSpace.Optional()
|
223
|
+
select new Constant(int.Parse(number));
|
224
|
+
|
225
|
+
private static readonly Parser<string> TermIdentifier =
|
226
|
+
from term in Parse.Regex(@"[^\s;]+")
|
227
|
+
from whitespace in Parse.WhiteSpace.Optional()
|
228
|
+
select term.ToLowerInvariant();
|
229
|
+
|
230
|
+
private static readonly Parser<ForthDefinition> Term = TermIdentifier.Select<string, ForthDefinition>(term =>
|
231
|
+
{
|
232
|
+
switch (term)
|
233
|
+
{
|
234
|
+
case "+": return new Plus();
|
235
|
+
case "-": return new Minus();
|
236
|
+
case "*": return new Multiply();
|
237
|
+
case "/": return new Division();
|
238
|
+
case "dup": return new Dup();
|
239
|
+
case "drop": return new Drop();
|
240
|
+
case "swap": return new Swap();
|
241
|
+
case "over": return new Over();
|
242
|
+
default: return new Word(term);
|
243
|
+
}
|
244
|
+
});
|
245
|
+
|
246
|
+
private static readonly Parser<ForthDefinition> CustomTerm =
|
247
|
+
from a in Parse.Char(':')
|
248
|
+
from b in Parse.WhiteSpace
|
249
|
+
from customTerm in TermIdentifier
|
250
|
+
from definitions in Constant.XOr(Term).AtLeastOnce()
|
251
|
+
from d in Parse.Char(';')
|
252
|
+
from e in Parse.WhiteSpace.Optional()
|
253
|
+
select new CustomTerm(customTerm, definitions);
|
254
|
+
|
255
|
+
private static readonly Parser<IEnumerable<ForthDefinition>> Expression =
|
256
|
+
(CustomTerm.XOr(Constant).XOr(Term)).Many();
|
257
|
+
}
|
@@ -0,0 +1,134 @@
|
|
1
|
+
using NUnit.Framework;
|
2
|
+
|
3
|
+
public class ForthTest
|
4
|
+
{
|
5
|
+
[Test]
|
6
|
+
public void No_input()
|
7
|
+
{
|
8
|
+
Assert.That(Forth.Eval(""), Is.EqualTo(""));
|
9
|
+
}
|
10
|
+
|
11
|
+
[Ignore("Remove to run test")]
|
12
|
+
[Test]
|
13
|
+
public void Numbers_just_get_pushed_onto_the_stack()
|
14
|
+
{
|
15
|
+
Assert.That(Forth.Eval("1 2 3 4 5"), Is.EqualTo("1 2 3 4 5"));
|
16
|
+
}
|
17
|
+
|
18
|
+
[Ignore("Remove to run test")]
|
19
|
+
[Test]
|
20
|
+
public void Non_word_characters_are_separators()
|
21
|
+
{
|
22
|
+
Assert.That(Forth.Eval("1\v2\t3\n4\r5 6\t7"), Is.EqualTo("1 2 3 4 5 6 7"));
|
23
|
+
}
|
24
|
+
|
25
|
+
[Ignore("Remove to run test")]
|
26
|
+
[Test]
|
27
|
+
public void Basic_arithmetic()
|
28
|
+
{
|
29
|
+
Assert.That(Forth.Eval("1 2 + 4 -"), Is.EqualTo("-1"));
|
30
|
+
Assert.That(Forth.Eval("2 4 * 3 /"), Is.EqualTo("2"));
|
31
|
+
}
|
32
|
+
|
33
|
+
[Ignore("Remove to run test")]
|
34
|
+
[Test]
|
35
|
+
public void Division_by_zero()
|
36
|
+
{
|
37
|
+
var exception = Assert.Throws<ForthException>(() => Forth.Eval("4 2 2 - /"));
|
38
|
+
Assert.That(exception.Error, Is.EqualTo(ForthError.DivisionByZero));
|
39
|
+
}
|
40
|
+
|
41
|
+
[Ignore("Remove to run test")]
|
42
|
+
[Test]
|
43
|
+
public void dup()
|
44
|
+
{
|
45
|
+
Assert.That(Forth.Eval("1 DUP"), Is.EqualTo("1 1"));
|
46
|
+
Assert.That(Forth.Eval("1 2 Dup"), Is.EqualTo("1 2 2"));
|
47
|
+
|
48
|
+
var exception = Assert.Throws<ForthException>(() => Forth.Eval("dup"));
|
49
|
+
Assert.That(exception.Error, Is.EqualTo(ForthError.StackUnderflow));
|
50
|
+
}
|
51
|
+
|
52
|
+
[Ignore("Remove to run test")]
|
53
|
+
[Test]
|
54
|
+
public void drop()
|
55
|
+
{
|
56
|
+
Assert.That(Forth.Eval("1 drop"), Is.EqualTo(""));
|
57
|
+
Assert.That(Forth.Eval("1 2 drop"), Is.EqualTo("1"));
|
58
|
+
|
59
|
+
var exception = Assert.Throws<ForthException>(() => Forth.Eval("drop"));
|
60
|
+
Assert.That(exception.Error, Is.EqualTo(ForthError.StackUnderflow));
|
61
|
+
}
|
62
|
+
|
63
|
+
[Ignore("Remove to run test")]
|
64
|
+
[Test]
|
65
|
+
public void swap()
|
66
|
+
{
|
67
|
+
Assert.That(Forth.Eval("1 2 swap"), Is.EqualTo("2 1"));
|
68
|
+
Assert.That(Forth.Eval("1 2 3 swap"), Is.EqualTo("1 3 2"));
|
69
|
+
|
70
|
+
var exception1 = Assert.Throws<ForthException>(() => Forth.Eval("1 swap"));
|
71
|
+
Assert.That(exception1.Error, Is.EqualTo(ForthError.StackUnderflow));
|
72
|
+
|
73
|
+
var exception2 = Assert.Throws<ForthException>(() => Forth.Eval("swap"));
|
74
|
+
Assert.That(exception2.Error, Is.EqualTo(ForthError.StackUnderflow));
|
75
|
+
}
|
76
|
+
|
77
|
+
[Ignore("Remove to run test")]
|
78
|
+
[Test]
|
79
|
+
public void over()
|
80
|
+
{
|
81
|
+
Assert.That(Forth.Eval("1 2 over"), Is.EqualTo("1 2 1"));
|
82
|
+
Assert.That(Forth.Eval("1 2 3 over"), Is.EqualTo("1 2 3 2"));
|
83
|
+
|
84
|
+
var exception1 = Assert.Throws<ForthException>(() => Forth.Eval("1 over"));
|
85
|
+
Assert.That(exception1.Error, Is.EqualTo(ForthError.StackUnderflow));
|
86
|
+
|
87
|
+
var exception2 = Assert.Throws<ForthException>(() => Forth.Eval("over"));
|
88
|
+
Assert.That(exception2.Error, Is.EqualTo(ForthError.StackUnderflow));
|
89
|
+
}
|
90
|
+
|
91
|
+
[Ignore("Remove to run test")]
|
92
|
+
[Test]
|
93
|
+
public void Defining_a_new_word()
|
94
|
+
{
|
95
|
+
Assert.That(Forth.Eval(": dup-twice dup dup ; 1 dup-twice"), Is.EqualTo("1 1 1"));
|
96
|
+
}
|
97
|
+
|
98
|
+
[Ignore("Remove to run test")]
|
99
|
+
[Test]
|
100
|
+
public void Redefining_an_existing_word()
|
101
|
+
{
|
102
|
+
Assert.That(Forth.Eval(": foo dup ; : foo dup dup ; 1 foo"), Is.EqualTo("1 1 1"));
|
103
|
+
}
|
104
|
+
|
105
|
+
[Ignore("Remove to run test")]
|
106
|
+
[Test]
|
107
|
+
public void Redefining_an_existing_built_in_word()
|
108
|
+
{
|
109
|
+
Assert.That(Forth.Eval(": swap dup ; 1 swap"), Is.EqualTo("1 1"));
|
110
|
+
}
|
111
|
+
|
112
|
+
[Ignore("Remove to run test")]
|
113
|
+
[Test]
|
114
|
+
public void Defining_words_with_odd_characters()
|
115
|
+
{
|
116
|
+
Assert.That(Forth.Eval(": € 220371 ; €"), Is.EqualTo("220371"));
|
117
|
+
}
|
118
|
+
|
119
|
+
[Ignore("Remove to run test")]
|
120
|
+
[Test]
|
121
|
+
public void Defining_a_number()
|
122
|
+
{
|
123
|
+
var exception = Assert.Throws<ForthException>(() => Forth.Eval(": 1 2 ;"));
|
124
|
+
Assert.That(exception.Error, Is.EqualTo(ForthError.InvalidWord));
|
125
|
+
}
|
126
|
+
|
127
|
+
[Ignore("Remove to run test")]
|
128
|
+
[Test]
|
129
|
+
public void Calling_a_non_existing_word()
|
130
|
+
{
|
131
|
+
var exception = Assert.Throws<ForthException>(() => Forth.Eval("1 foo"));
|
132
|
+
Assert.That(exception.Error, Is.EqualTo(ForthError.UnknownWord));
|
133
|
+
}
|
134
|
+
}
|
data/tracks/fsharp/config.json
CHANGED
@@ -795,6 +795,13 @@
|
|
795
795
|
"Optional values"
|
796
796
|
]
|
797
797
|
},
|
798
|
+
{
|
799
|
+
"slug": "lens-person",
|
800
|
+
"difficulty": 9,
|
801
|
+
"topics": [
|
802
|
+
"Lenses"
|
803
|
+
]
|
804
|
+
},
|
798
805
|
{
|
799
806
|
"slug": "sgf-parsing",
|
800
807
|
"difficulty": 9,
|
@@ -850,7 +857,6 @@
|
|
850
857
|
],
|
851
858
|
"foregone": [
|
852
859
|
"flatten-array",
|
853
|
-
"lens-person",
|
854
860
|
"nucleotide-codons",
|
855
861
|
"paasio",
|
856
862
|
"point-mutations",
|