trackler 2.0.3.6 → 2.0.3.7
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/build.fsx +1 -2
- data/tracks/csharp/exercises/clock/ClockTest.cs +9 -0
- data/tracks/fsharp/build.fsx +1 -2
- data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTreeTest.fs +3 -3
- data/tracks/objective-c/Dangerfile +1 -1
- data/tracks/ocaml/config.json +6 -5
- data/tracks/ocaml/exercises/all-your-base/.merlin +5 -0
- data/tracks/ocaml/exercises/all-your-base/Makefile +11 -0
- data/tracks/ocaml/exercises/all-your-base/all_your_base.mli +5 -0
- data/tracks/ocaml/exercises/all-your-base/example.ml +20 -0
- data/tracks/ocaml/exercises/all-your-base/test.ml +58 -0
- data/tracks/ocaml/tools/test-generator/src/special_cases.ml +10 -2
- data/tracks/ocaml/tools/test-generator/templates/all-your-base/template.ml +10 -6
- data/tracks/perl6/config.json +5 -0
- data/tracks/perl6/exercises/space-age/Example.p6 +16 -0
- data/tracks/perl6/exercises/space-age/cases.json +46 -0
- data/tracks/perl6/exercises/space-age/space-age.t +23 -0
- data/tracks/purescript/.gitignore +2 -0
- data/tracks/purescript/.travis.yml +8 -0
- data/tracks/purescript/bin/test.sh +39 -0
- data/tracks/purescript/config.json +22 -0
- data/tracks/purescript/docs/INSTALLATION.md +12 -0
- data/tracks/purescript/docs/TESTS.md +6 -0
- data/tracks/purescript/exercises/hello-world/src/HelloWorld.purs +0 -5
- data/tracks/purescript/exercises/leap/bower.json +16 -0
- data/tracks/purescript/exercises/leap/examples/src/Leap.purs +9 -0
- data/tracks/purescript/exercises/leap/src/Leap.purs +1 -0
- data/tracks/purescript/exercises/leap/test/Main.purs +25 -0
- data/tracks/purescript/exercises/pangram/bower.json +17 -0
- data/tracks/purescript/exercises/pangram/examples/src/Pangram.purs +25 -0
- data/tracks/purescript/exercises/pangram/src/Pangram.purs +3 -0
- data/tracks/purescript/exercises/pangram/test/Main.purs +46 -0
- data/tracks/purescript/exercises/raindrops/bower.json +16 -0
- data/tracks/purescript/exercises/raindrops/examples/src/Raindrops.purs +23 -0
- data/tracks/purescript/exercises/raindrops/src/Raindrops.purs +3 -0
- data/tracks/purescript/exercises/raindrops/test/Main.purs +41 -0
- data/tracks/swift/Dangerfile +1 -1
- data/tracks/swift/config.json +8 -0
- data/tracks/swift/exercises/isogram/IsogramExample.swift +25 -0
- data/tracks/swift/exercises/isogram/IsogramTest.swift +38 -0
- data/tracks/swift/exercises/space-age/SpaceAgeExample.swift +1 -1
- data/tracks/swift/xcodeProject/xSwift.xcodeproj/project.pbxproj +16 -0
- metadata +25 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7778e095275365245b61d227de2380686d8f52a6
|
4
|
+
data.tar.gz: baf69491b1aa86f855c0a3a0dc312c169d3f91b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef3092dcc542059ebcb8dce86d78c9e36ab07624096d962b469cb06a00d16a6f85684e7a015e8dfd32446172b33b8e49b4ecdb3c01e40eed7d187b5f80beeb11
|
7
|
+
data.tar.gz: 55cb0a7661c46826a0272c15bb231790ada521268054b488e4d219819b61231b0a9cb7ccee5a1e1cd9f3f80923f64187d8d357221322b1799098ab15829d5ad6
|
data/lib/trackler/version.rb
CHANGED
data/tracks/csharp/build.fsx
CHANGED
@@ -43,8 +43,7 @@ Target "Test" (fun _ ->
|
|
43
43
|
[compiledOutput]
|
44
44
|
|> NUnit3 (fun p -> { p with
|
45
45
|
ShadowCopy = false
|
46
|
-
ToolPath =
|
47
|
-
ResultSpecs = ["myresults.xml;format=AppVeyor"] })
|
46
|
+
ToolPath = "nunit3-console.exe" })
|
48
47
|
else
|
49
48
|
[compiledOutput]
|
50
49
|
|> NUnit3 (fun p -> { p with ShadowCopy = false })
|
@@ -107,6 +107,15 @@ public class ClockTest
|
|
107
107
|
Assert.That(clock1, Is.EqualTo(clock2));
|
108
108
|
}
|
109
109
|
|
110
|
+
[Ignore("Remove to run test")]
|
111
|
+
[Test]
|
112
|
+
public void Clocks_with_different_time_are_not_equal()
|
113
|
+
{
|
114
|
+
var clock1 = new Clock(15, 30);
|
115
|
+
var clock2 = new Clock(14, 30);
|
116
|
+
Assert.That(clock1, Is.Not.EqualTo(clock2));
|
117
|
+
}
|
118
|
+
|
110
119
|
[Ignore("Remove to run test")]
|
111
120
|
[Test]
|
112
121
|
public void Overflown_clocks_with_same_time_are_equal()
|
data/tracks/fsharp/build.fsx
CHANGED
@@ -41,8 +41,7 @@ Target "Test" (fun _ ->
|
|
41
41
|
[compiledOutput]
|
42
42
|
|> NUnit3 (fun p -> { p with
|
43
43
|
ShadowCopy = false
|
44
|
-
ToolPath =
|
45
|
-
ResultSpecs = ["myresults.xml;format=AppVeyor"] })
|
44
|
+
ToolPath = "nunit3-console.exe" })
|
46
45
|
else
|
47
46
|
[compiledOutput]
|
48
47
|
|> NUnit3 (fun p -> { p with ShadowCopy = false })
|
@@ -34,12 +34,12 @@ let ``Inserting greater`` () =
|
|
34
34
|
let ``Complex tree`` () =
|
35
35
|
let tree = fromList [4; 2; 6; 1; 3; 7; 5]
|
36
36
|
Assert.That(tree |> value, Is.EqualTo(4))
|
37
|
-
Assert.That(tree |> left |> Option.map value, Is.EqualTo(2))
|
37
|
+
Assert.That(tree |> left |> Option.map value, Is.EqualTo(Some 2))
|
38
38
|
Assert.That(tree |> left |> Option.bind (fun x -> x |> left) |> Option.map value, Is.EqualTo(Some 1))
|
39
39
|
Assert.That(tree |> left |> Option.bind (fun x -> x |> right) |> Option.map value, Is.EqualTo(Some 3))
|
40
|
-
Assert.That(tree |> right |> Option.map value, Is.EqualTo(6))
|
40
|
+
Assert.That(tree |> right |> Option.map value, Is.EqualTo(Some 6))
|
41
41
|
Assert.That(tree |> right |> Option.bind (fun x -> x |> left) |> Option.map value, Is.EqualTo(Some 5))
|
42
|
-
Assert.That(tree |> right |> Option.bind (fun x -> x |> right) |> Option.map value, Is.EqualTo(7))
|
42
|
+
Assert.That(tree |> right |> Option.bind (fun x -> x |> right) |> Option.map value, Is.EqualTo(Some 7))
|
43
43
|
|
44
44
|
[<Test>]
|
45
45
|
[<Ignore("Remove to run test")>]
|
@@ -18,7 +18,7 @@ warn("PR is classed as Work in Progress") if github.pr_title.include? "[WIP]"
|
|
18
18
|
warn("Big PR") if git.lines_of_code > 500
|
19
19
|
|
20
20
|
#ENSURE THERE IS A SUMMARY FOR A PR
|
21
|
-
warn("Please provide a summary in the Pull Request description") if github.pr_body.length < 5
|
21
|
+
warn("Please provide a summary in the Pull Request description. See more info <a href=\"http\://tinyletter.com/exercism/letters/exercism-pull-requests\">here.</a>") if github.pr_body.length < 5
|
22
22
|
|
23
23
|
# LINT Comments in for each Line
|
24
24
|
jsonpath = ".oclint.json"
|
data/tracks/ocaml/config.json
CHANGED
@@ -61,11 +61,6 @@
|
|
61
61
|
"difficulty": 3,
|
62
62
|
"topics": []
|
63
63
|
},
|
64
|
-
{
|
65
|
-
"slug": "hexadecimal",
|
66
|
-
"difficulty": 3,
|
67
|
-
"topics": []
|
68
|
-
},
|
69
64
|
{
|
70
65
|
"slug": "anagram",
|
71
66
|
"difficulty": 3,
|
@@ -76,6 +71,11 @@
|
|
76
71
|
"difficulty": 3,
|
77
72
|
"topics": []
|
78
73
|
},
|
74
|
+
{
|
75
|
+
"slug": "all-your-base",
|
76
|
+
"difficulty": 4,
|
77
|
+
"topics": ["Mathematics"]
|
78
|
+
},
|
79
79
|
{
|
80
80
|
"slug": "bracket-push",
|
81
81
|
"difficulty": 4,
|
@@ -158,6 +158,7 @@
|
|
158
158
|
}
|
159
159
|
],
|
160
160
|
"deprecated": [
|
161
|
+
"hexadecimal",
|
161
162
|
"point-mutations"
|
162
163
|
],
|
163
164
|
"ignored": [
|
@@ -0,0 +1,20 @@
|
|
1
|
+
open Core.Std
|
2
|
+
|
3
|
+
type base = int
|
4
|
+
|
5
|
+
let rec to_digits (b: base) (acc: int list) = function
|
6
|
+
| 0 -> acc
|
7
|
+
| n -> to_digits b (n % b :: acc) (n / b)
|
8
|
+
|
9
|
+
let convert_bases ~from ~digits ~target =
|
10
|
+
if from <= 1 || target <= 1 || List.is_empty digits
|
11
|
+
then None
|
12
|
+
else
|
13
|
+
let open Option.Monad_infix in
|
14
|
+
let digits = List.fold_left digits ~init:(Some 0) ~f:(fun acc d ->
|
15
|
+
if d < 0 || d >= from
|
16
|
+
then None
|
17
|
+
else acc >>= (fun acc -> Some (acc * from + d))
|
18
|
+
) in
|
19
|
+
Option.map digits ~f:(to_digits target [])
|
20
|
+
|> Option.map ~f:(fun xs -> if List.is_empty xs then [0] else xs)
|
@@ -0,0 +1,58 @@
|
|
1
|
+
open Core.Std
|
2
|
+
open OUnit2
|
3
|
+
open All_your_base
|
4
|
+
|
5
|
+
let option_printer = function
|
6
|
+
| None -> "None"
|
7
|
+
| Some xs -> "Some [" ^ String.concat ~sep:";" (List.map xs ~f:Int.to_string) ^ "]"
|
8
|
+
|
9
|
+
let ae exp got _test_ctxt =
|
10
|
+
assert_equal exp got ~printer:option_printer
|
11
|
+
|
12
|
+
let tests = [
|
13
|
+
"single bit one to decimal" >::
|
14
|
+
ae (Some [1]) (convert_bases ~from:2 ~digits:[1] ~target:10);
|
15
|
+
"binary to single decimal" >::
|
16
|
+
ae (Some [5]) (convert_bases ~from:2 ~digits:[1; 0; 1] ~target:10);
|
17
|
+
"single decimal to binary" >::
|
18
|
+
ae (Some [1; 0; 1]) (convert_bases ~from:10 ~digits:[5] ~target:2);
|
19
|
+
"binary to multiple decimal" >::
|
20
|
+
ae (Some [4; 2]) (convert_bases ~from:2 ~digits:[1; 0; 1; 0; 1; 0] ~target:10);
|
21
|
+
"decimal to binary" >::
|
22
|
+
ae (Some [1; 0; 1; 0; 1; 0]) (convert_bases ~from:10 ~digits:[4; 2] ~target:2);
|
23
|
+
"trinary to hexadecimal" >::
|
24
|
+
ae (Some [2; 10]) (convert_bases ~from:3 ~digits:[1; 1; 2; 0] ~target:16);
|
25
|
+
"hexadecimal to trinary" >::
|
26
|
+
ae (Some [1; 1; 2; 0]) (convert_bases ~from:16 ~digits:[2; 10] ~target:3);
|
27
|
+
"15-bit integer" >::
|
28
|
+
ae (Some [6; 10; 45]) (convert_bases ~from:97 ~digits:[3; 46; 60] ~target:73);
|
29
|
+
"empty list" >::
|
30
|
+
ae None (convert_bases ~from:2 ~digits:[] ~target:10);
|
31
|
+
"single zero" >::
|
32
|
+
ae (Some [0]) (convert_bases ~from:10 ~digits:[0] ~target:2);
|
33
|
+
"multiple zeros" >::
|
34
|
+
ae (Some [0]) (convert_bases ~from:10 ~digits:[0; 0; 0] ~target:2);
|
35
|
+
"leading zeros" >::
|
36
|
+
ae (Some [4; 2]) (convert_bases ~from:7 ~digits:[0; 0; 6; 0] ~target:10);
|
37
|
+
"negative digit" >::
|
38
|
+
ae None (convert_bases ~from:2 ~digits:[1; -1; 1; 0; 1; 0] ~target:10);
|
39
|
+
"invalid positive digit" >::
|
40
|
+
ae None (convert_bases ~from:2 ~digits:[1; 2; 1; 0; 1; 0] ~target:10);
|
41
|
+
"first base is one" >::
|
42
|
+
ae None (convert_bases ~from:1 ~digits:[] ~target:10);
|
43
|
+
"second base is one" >::
|
44
|
+
ae None (convert_bases ~from:2 ~digits:[1; 0; 1; 0; 1; 0] ~target:1);
|
45
|
+
"first base is zero" >::
|
46
|
+
ae None (convert_bases ~from:0 ~digits:[] ~target:10);
|
47
|
+
"second base is zero" >::
|
48
|
+
ae None (convert_bases ~from:10 ~digits:[7] ~target:0);
|
49
|
+
"first base is negative" >::
|
50
|
+
ae None (convert_bases ~from:(-2) ~digits:[1] ~target:10);
|
51
|
+
"second base is negative" >::
|
52
|
+
ae None (convert_bases ~from:2 ~digits:[1] ~target:(-7));
|
53
|
+
"both bases are negative" >::
|
54
|
+
ae None (convert_bases ~from:(-2) ~digits:[1] ~target:(-7));
|
55
|
+
]
|
56
|
+
|
57
|
+
let () =
|
58
|
+
run_test_tt_main ("all-your-bases tests" >::: tests)
|
@@ -8,7 +8,7 @@ let optional_int ~(none: int) = function
|
|
8
8
|
| x -> parameter_to_string x
|
9
9
|
|
10
10
|
let optional_int_list = function
|
11
|
-
| IntList xs -> "(Some " ^ String.concat ~sep:"; " (List.map ~f:Int.to_string xs) ^ ")"
|
11
|
+
| IntList xs -> "(Some [" ^ String.concat ~sep:"; " (List.map ~f:Int.to_string xs) ^ "])"
|
12
12
|
| _ -> "None"
|
13
13
|
|
14
14
|
let optional_int_or_string ~(none: int) = function
|
@@ -37,7 +37,14 @@ let edit_expected ~(stringify: parameter -> string) ~(slug: string) ~(value: par
|
|
37
37
|
|
38
38
|
let edit_say (ps: (string * string) list) =
|
39
39
|
let edit = function
|
40
|
-
| ("input", v) -> ("input", if Int.of_string v
|
40
|
+
| ("input", v) -> ("input", if Int.of_string v >= 0 then "(" ^ v ^ "L)" else v ^ "L")
|
41
|
+
| x -> x in
|
42
|
+
List.map ps ~f:edit
|
43
|
+
|
44
|
+
let edit_all_your_base (ps: (string * string) list) =
|
45
|
+
let edit = function
|
46
|
+
| ("output_base", v) -> ("output_base", if Int.of_string v >= 0 then v else "(" ^ v ^ ")")
|
47
|
+
| ("input_base", v) -> ("input_base", if Int.of_string v >= 0 then v else "(" ^ v ^ ")")
|
41
48
|
| x -> x in
|
42
49
|
List.map ps ~f:edit
|
43
50
|
|
@@ -46,4 +53,5 @@ let edit_parameters ~(slug: string) (parameters: (string * string) list) = match
|
|
46
53
|
@@ optional_strings ~f:(fun _x -> true)
|
47
54
|
@@ parameters
|
48
55
|
| ("say", ps) -> edit_say ps
|
56
|
+
| ("all-your-base", ps) -> edit_all_your_base ps
|
49
57
|
| (_, ps) -> ps
|
@@ -1,15 +1,19 @@
|
|
1
1
|
open Core.Std
|
2
2
|
open OUnit2
|
3
|
-
open
|
3
|
+
open All_your_base
|
4
|
+
|
5
|
+
let option_printer = function
|
6
|
+
| None -> "None"
|
7
|
+
| Some xs -> "Some [" ^ String.concat ~sep:";" (List.map xs ~f:Int.to_string) ^ "]"
|
4
8
|
|
5
9
|
let ae exp got _test_ctxt =
|
6
|
-
assert_equal exp got ~printer:
|
10
|
+
assert_equal exp got ~printer:option_printer
|
7
11
|
|
8
12
|
let tests = [
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
+
(* TEST
|
14
|
+
"$description" >::
|
15
|
+
ae $expected (convert_bases ~from:$input_base ~digits:$input_digits ~target:$output_base);
|
16
|
+
END TEST *)
|
13
17
|
]
|
14
18
|
|
15
19
|
let () =
|
data/tracks/perl6/config.json
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
our $earth_revolution = 31557600;
|
2
|
+
|
3
|
+
our %planets = (
|
4
|
+
mercury => 0.2408467,
|
5
|
+
venus => 0.61519726,
|
6
|
+
mars => 1.8808158,
|
7
|
+
jupiter => 11.862615,
|
8
|
+
saturn => 29.447498,
|
9
|
+
uranus => 84.016846,
|
10
|
+
neptune => 164.79132,
|
11
|
+
earth => 1,
|
12
|
+
);
|
13
|
+
|
14
|
+
sub age-on( $planet, $seconds ) is export {
|
15
|
+
( $seconds / %planets{$planet.lc} / $earth_revolution ).round(0.01);
|
16
|
+
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
{ "#": [],
|
2
|
+
"age on": {
|
3
|
+
"cases": [
|
4
|
+
{
|
5
|
+
"planet": "Earth",
|
6
|
+
"seconds": 1000000000,
|
7
|
+
"expected": 31.69
|
8
|
+
},
|
9
|
+
{
|
10
|
+
"planet": "Mercury",
|
11
|
+
"seconds": 2134835688,
|
12
|
+
"expected": 280.88
|
13
|
+
},
|
14
|
+
{
|
15
|
+
"planet": "Venus",
|
16
|
+
"seconds": 189839836,
|
17
|
+
"expected": 9.78
|
18
|
+
},
|
19
|
+
{
|
20
|
+
"planet": "Mars",
|
21
|
+
"seconds": 2329871239,
|
22
|
+
"expected": 39.25
|
23
|
+
},
|
24
|
+
{
|
25
|
+
"planet": "Jupiter",
|
26
|
+
"seconds": 901876382,
|
27
|
+
"expected": 2.41
|
28
|
+
},
|
29
|
+
{
|
30
|
+
"planet": "Saturn",
|
31
|
+
"seconds": 3000000000,
|
32
|
+
"expected": 3.23
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"planet": "Uranus",
|
36
|
+
"seconds": 3210123456,
|
37
|
+
"expected": 1.21
|
38
|
+
},
|
39
|
+
{
|
40
|
+
"planet": "Neptune",
|
41
|
+
"seconds": 8210123456,
|
42
|
+
"expected": 1.58
|
43
|
+
}
|
44
|
+
]
|
45
|
+
}
|
46
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env perl6
|
2
|
+
|
3
|
+
use Test;
|
4
|
+
use JSON::Tiny;
|
5
|
+
|
6
|
+
use lib ( my $dir = IO::Path.new($?FILE).parent ).path;
|
7
|
+
|
8
|
+
my $module_name = %*ENV<EXERCISM>.so ?? 'Example' !! 'SpaceAge';
|
9
|
+
my @potential_module = <p6 pm6 pm>.map: $module_name ~ '.' ~ *;
|
10
|
+
|
11
|
+
my $module = first { $dir.child($_).e }, |@potential_module
|
12
|
+
or die "No file '$module_name.p6' found\n";
|
13
|
+
|
14
|
+
require $module <&age-on>;
|
15
|
+
|
16
|
+
plan 8;
|
17
|
+
|
18
|
+
my %testcase = from-json $dir.child('cases.json').slurp;
|
19
|
+
|
20
|
+
for |%testcase{'age on'}{'cases'} -> %case {
|
21
|
+
is age-on( |%case<planet seconds>), %case{'expected'},
|
22
|
+
%case<planet seconds>.gist;
|
23
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# TEST
|
4
|
+
|
5
|
+
declare -i TEST_RESULT=0
|
6
|
+
FAILED_EXERCISES=''
|
7
|
+
|
8
|
+
for exercise_dir in exercises/**
|
9
|
+
do
|
10
|
+
exercise_src="$exercise_dir/src"
|
11
|
+
exercise_examples_src="$exercise_dir/examples/src"
|
12
|
+
|
13
|
+
mv "$exercise_src" "$exercise_src.impl"
|
14
|
+
mv "$exercise_examples_src" "$exercise_src"
|
15
|
+
|
16
|
+
echo "-------------------------------------------------------"
|
17
|
+
echo "Testing $exercise_dir"
|
18
|
+
|
19
|
+
cd "$exercise_dir"
|
20
|
+
bower install
|
21
|
+
pulp test
|
22
|
+
|
23
|
+
# capture result from last command (pulp test)
|
24
|
+
if [ $? -ne 0 ]; then
|
25
|
+
TEST_RESULT=1
|
26
|
+
FAILED_EXERCISES+="$exercise_dir\n"
|
27
|
+
fi
|
28
|
+
|
29
|
+
# be kind, rewind
|
30
|
+
cd -
|
31
|
+
mv "$exercise_src" "$exercise_examples_src"
|
32
|
+
mv "$exercise_src.impl" "$exercise_src"
|
33
|
+
done
|
34
|
+
|
35
|
+
if [ $TEST_RESULT -ne 0 ]; then
|
36
|
+
echo "The following exercises failed"
|
37
|
+
printf $FAILED_EXERCISES
|
38
|
+
exit $TEST_RESULT
|
39
|
+
fi
|
@@ -10,6 +10,28 @@
|
|
10
10
|
"topics": [
|
11
11
|
"maybe"
|
12
12
|
]
|
13
|
+
},
|
14
|
+
{
|
15
|
+
"slug": "leap",
|
16
|
+
"difficulty": 1,
|
17
|
+
"topics": [
|
18
|
+
"modulo"
|
19
|
+
]
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"slug": "raindrops",
|
23
|
+
"difficulty": 1,
|
24
|
+
"topics": [
|
25
|
+
"modulo"
|
26
|
+
]
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"slug": "pangram",
|
30
|
+
"difficulty": 1,
|
31
|
+
"topics": [
|
32
|
+
"strings",
|
33
|
+
"chars"
|
34
|
+
]
|
13
35
|
}
|
14
36
|
],
|
15
37
|
"deprecated": [
|
@@ -0,0 +1,12 @@
|
|
1
|
+
The simplest way to install Purescript is via Node.js and NPM.
|
2
|
+
|
3
|
+
If you don't already have Node.js installed on your computer, you can download
|
4
|
+
it from the [Node.js website](https://nodejs.org/). Once you have Node.js up
|
5
|
+
and running, enter this command into the terminal to install the Purescript
|
6
|
+
compiler, the Pulp build tool and the Bower package manager.
|
7
|
+
|
8
|
+
npm install --global purescript pulp bower
|
9
|
+
|
10
|
+
More information can be found in [the Purescript repository][ps-repo]
|
11
|
+
|
12
|
+
[ps-repo]: (https://github.com/purescript/purescript/blob/master/INSTALL.md).
|
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"name": "leap",
|
3
|
+
"ignore": [
|
4
|
+
"**/.*",
|
5
|
+
"node_modules",
|
6
|
+
"bower_components",
|
7
|
+
"output"
|
8
|
+
],
|
9
|
+
"dependencies": {
|
10
|
+
"purescript-prelude": "^2.1.0"
|
11
|
+
},
|
12
|
+
"devDependencies": {
|
13
|
+
"purescript-psci-support": "^2.0.0",
|
14
|
+
"purescript-test-unit": "^10.0.1"
|
15
|
+
}
|
16
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
module Leap where
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Test.Main where
|
2
|
+
|
3
|
+
import Prelude
|
4
|
+
import Test.Unit (suite, test)
|
5
|
+
import Test.Unit.Main (runTest)
|
6
|
+
import Test.Unit.Assert as Assert
|
7
|
+
import Leap as Leap
|
8
|
+
|
9
|
+
|
10
|
+
main = runTest do
|
11
|
+
suite "Leap.isLeapYear" do
|
12
|
+
test "leap year" do
|
13
|
+
Assert.equal true $ Leap.isLeapYear 1996
|
14
|
+
test "non-leap year" do
|
15
|
+
Assert.equal false $ Leap.isLeapYear 1997
|
16
|
+
test "non-leap even year" do
|
17
|
+
Assert.equal false $ Leap.isLeapYear 1998
|
18
|
+
test "century" do
|
19
|
+
Assert.equal false $ Leap.isLeapYear 1900
|
20
|
+
test "second century" do
|
21
|
+
Assert.equal false $ Leap.isLeapYear 1800
|
22
|
+
test "fourth century" do
|
23
|
+
Assert.equal true $ Leap.isLeapYear 2400
|
24
|
+
test "y2k" do
|
25
|
+
Assert.equal true $ Leap.isLeapYear 2000
|
@@ -0,0 +1,17 @@
|
|
1
|
+
{
|
2
|
+
"name": "hello-world",
|
3
|
+
"ignore": [
|
4
|
+
"**/.*",
|
5
|
+
"node_modules",
|
6
|
+
"bower_components",
|
7
|
+
"output"
|
8
|
+
],
|
9
|
+
"dependencies": {
|
10
|
+
"purescript-prelude": "^2.1.0",
|
11
|
+
"purescript-sets": "^2.0.0"
|
12
|
+
},
|
13
|
+
"devDependencies": {
|
14
|
+
"purescript-psci-support": "^2.0.0",
|
15
|
+
"purescript-test-unit": "^10.0.1"
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Pangram
|
2
|
+
( isPangram
|
3
|
+
) where
|
4
|
+
|
5
|
+
import Prelude
|
6
|
+
import Data.Set as Set
|
7
|
+
import Data.String as String
|
8
|
+
|
9
|
+
isPangram :: String -> Boolean
|
10
|
+
isPangram str =
|
11
|
+
let
|
12
|
+
letters =
|
13
|
+
charSet $ String.toLower str
|
14
|
+
in
|
15
|
+
Set.subset alphabet letters
|
16
|
+
|
17
|
+
|
18
|
+
alphabet :: Set.Set Char
|
19
|
+
alphabet =
|
20
|
+
charSet "abcdefghijklmnopqrstuvwxyz"
|
21
|
+
|
22
|
+
|
23
|
+
charSet :: String -> Set.Set Char
|
24
|
+
charSet =
|
25
|
+
String.toCharArray >>> Set.fromFoldable
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Test.Main where
|
2
|
+
|
3
|
+
import Prelude
|
4
|
+
import Test.Unit (suite, test)
|
5
|
+
import Test.Unit.Main (runTest)
|
6
|
+
import Test.Unit.Assert as Assert
|
7
|
+
import Pangram (isPangram)
|
8
|
+
|
9
|
+
|
10
|
+
main = runTest do
|
11
|
+
suite "Pangram.isPangram" do
|
12
|
+
test "sentence empty" do
|
13
|
+
Assert.equal false $
|
14
|
+
isPangram ""
|
15
|
+
|
16
|
+
test "pangram with only lower case" do
|
17
|
+
Assert.equal true $
|
18
|
+
isPangram "the quick brown fox jumps over the lazy dog"
|
19
|
+
|
20
|
+
test "missing character 'x'" do
|
21
|
+
Assert.equal false $
|
22
|
+
isPangram "a quick movement of the enemy will jeopardize five gunboats"
|
23
|
+
|
24
|
+
test "another missing character 'x'" do
|
25
|
+
Assert.equal false $
|
26
|
+
isPangram "the quick brown fish jumps over the lazy dog"
|
27
|
+
|
28
|
+
test "pangram with underscores" do
|
29
|
+
Assert.equal true $
|
30
|
+
isPangram "the_quick_brown_fox_jumps_over_the_lazy_dog"
|
31
|
+
|
32
|
+
test "pangram with numbers" do
|
33
|
+
Assert.equal true $
|
34
|
+
isPangram "the 1 quick brown fox jumps over the 2 lazy dogs"
|
35
|
+
|
36
|
+
test "missing letters replaced by numbers" do
|
37
|
+
Assert.equal false $
|
38
|
+
isPangram "7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog"
|
39
|
+
|
40
|
+
test "pangram with mixed case and punctuation" do
|
41
|
+
Assert.equal true $
|
42
|
+
isPangram "\"Five quacking Zephyrs jolt my wax bed.\""
|
43
|
+
|
44
|
+
test "pangram with non ascii characters" do
|
45
|
+
Assert.equal true $
|
46
|
+
isPangram "Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich."
|
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"name": "hello-world",
|
3
|
+
"ignore": [
|
4
|
+
"**/.*",
|
5
|
+
"node_modules",
|
6
|
+
"bower_components",
|
7
|
+
"output"
|
8
|
+
],
|
9
|
+
"dependencies": {
|
10
|
+
"purescript-prelude": "^2.1.0"
|
11
|
+
},
|
12
|
+
"devDependencies": {
|
13
|
+
"purescript-psci-support": "^2.0.0",
|
14
|
+
"purescript-test-unit": "^10.0.1"
|
15
|
+
}
|
16
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Raindrops
|
2
|
+
( raindrops
|
3
|
+
) where
|
4
|
+
|
5
|
+
import Prelude
|
6
|
+
|
7
|
+
raindrops :: Int -> String
|
8
|
+
raindrops n =
|
9
|
+
let
|
10
|
+
fn = toNoise n
|
11
|
+
noises =
|
12
|
+
fn 3 "Pling" <>
|
13
|
+
fn 5 "Plang" <>
|
14
|
+
fn 7 "Plong"
|
15
|
+
in
|
16
|
+
case noises of
|
17
|
+
"" -> show n
|
18
|
+
other -> other
|
19
|
+
|
20
|
+
toNoise :: Int -> Int -> String -> String
|
21
|
+
toNoise n factor noise
|
22
|
+
| mod n factor == 0 = noise
|
23
|
+
| otherwise = ""
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Test.Main where
|
2
|
+
|
3
|
+
import Prelude
|
4
|
+
import Test.Unit (suite, test)
|
5
|
+
import Test.Unit.Main (runTest)
|
6
|
+
import Test.Unit.Assert as Assert
|
7
|
+
import Raindrops (raindrops)
|
8
|
+
|
9
|
+
|
10
|
+
main = runTest do
|
11
|
+
suite "Raindrops.raindrops" do
|
12
|
+
test "1" do
|
13
|
+
Assert.equal "1" $ raindrops 1
|
14
|
+
test "3" do
|
15
|
+
Assert.equal "Pling" $ raindrops 3
|
16
|
+
test "5" do
|
17
|
+
Assert.equal "Plang" $ raindrops 5
|
18
|
+
test "7" do
|
19
|
+
Assert.equal "Plong" $ raindrops 7
|
20
|
+
test "6" do
|
21
|
+
Assert.equal "Pling" $ raindrops 6
|
22
|
+
test "9" do
|
23
|
+
Assert.equal "Pling" $ raindrops 9
|
24
|
+
test "10" do
|
25
|
+
Assert.equal "Plang" $ raindrops 10
|
26
|
+
test "14" do
|
27
|
+
Assert.equal "Plong" $ raindrops 14
|
28
|
+
test "15" do
|
29
|
+
Assert.equal "PlingPlang" $ raindrops 15
|
30
|
+
test "21" do
|
31
|
+
Assert.equal "PlingPlong" $ raindrops 21
|
32
|
+
test "25" do
|
33
|
+
Assert.equal "Plang" $ raindrops 25
|
34
|
+
test "35" do
|
35
|
+
Assert.equal "PlangPlong" $ raindrops 35
|
36
|
+
test "49" do
|
37
|
+
Assert.equal "Plong" $ raindrops 49
|
38
|
+
test "52" do
|
39
|
+
Assert.equal "52" $ raindrops 52
|
40
|
+
test "105" do
|
41
|
+
Assert.equal "PlingPlangPlong" $ raindrops 105
|
data/tracks/swift/Dangerfile
CHANGED
@@ -18,7 +18,7 @@ warn("PR is classed as Work in Progress") if github.pr_title.include? "[WIP]"
|
|
18
18
|
warn("Big PR") if git.lines_of_code > 500
|
19
19
|
|
20
20
|
#ENSURE THERE IS A SUMMARY FOR A PR
|
21
|
-
warn("Please provide a summary in the Pull Request description") if github.pr_body.length < 5
|
21
|
+
warn("Please provide a summary in the Pull Request description. See more info <a href=\"http\://tinyletter.com/exercism/letters/exercism-pull-requests\">here.</a>") if github.pr_body.length < 5
|
22
22
|
|
23
23
|
# LINT Comments in for each Line
|
24
24
|
jsonpath = "lintreport.json"
|
data/tracks/swift/config.json
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
import Foundation
|
2
|
+
|
3
|
+
struct Isogram {
|
4
|
+
|
5
|
+
static func isIsogram(_ string: String) -> Bool {
|
6
|
+
let lowercasedString = string.lowercased()
|
7
|
+
let lowercaseLetterSet = CharacterSet.lowercaseLetters
|
8
|
+
|
9
|
+
var letters: Set<UnicodeScalar> = []
|
10
|
+
|
11
|
+
for character in lowercasedString.unicodeScalars {
|
12
|
+
guard lowercaseLetterSet.contains(character) else {
|
13
|
+
continue
|
14
|
+
}
|
15
|
+
|
16
|
+
guard !letters.contains(character) else {
|
17
|
+
return false
|
18
|
+
}
|
19
|
+
|
20
|
+
letters.insert(character)
|
21
|
+
}
|
22
|
+
|
23
|
+
return true
|
24
|
+
}
|
25
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#if swift(>=3.0)
|
2
|
+
import XCTest
|
3
|
+
#endif
|
4
|
+
|
5
|
+
class IsogramTest: XCTestCase {
|
6
|
+
|
7
|
+
func testEmptyString() {
|
8
|
+
XCTAssertTrue(Isogram.isIsogram(""))
|
9
|
+
}
|
10
|
+
|
11
|
+
func testIsogramWithOnlyLowerCaseCharacters() {
|
12
|
+
XCTAssertTrue(Isogram.isIsogram("isogram"))
|
13
|
+
}
|
14
|
+
|
15
|
+
func testWordWithOneDuplicatedCharacter() {
|
16
|
+
XCTAssertFalse(Isogram.isIsogram("eleven"))
|
17
|
+
}
|
18
|
+
|
19
|
+
func testLongestReportedEnglishIsogram() {
|
20
|
+
XCTAssertTrue(Isogram.isIsogram("subdermatoglyphic"))
|
21
|
+
}
|
22
|
+
|
23
|
+
func testWordWithDuplicatedCharacterInMixedCase() {
|
24
|
+
XCTAssertFalse(Isogram.isIsogram("Alphabet"))
|
25
|
+
}
|
26
|
+
|
27
|
+
func testHypotheticalIsogrammicWordWithHyphen() {
|
28
|
+
XCTAssertTrue(Isogram.isIsogram("thumbscrew-japingly"))
|
29
|
+
}
|
30
|
+
|
31
|
+
func testIsogramWithDuplicatedNonLetterCharacter() {
|
32
|
+
XCTAssertTrue(Isogram.isIsogram("Hjelmqvist-Gryb-Zock-Pfund-Wax"))
|
33
|
+
}
|
34
|
+
|
35
|
+
func testMadeUpNameThatIsAnIsogram() {
|
36
|
+
XCTAssertTrue(Isogram.isIsogram("Emily Jung Schwartzkopf"))
|
37
|
+
}
|
38
|
+
}
|
@@ -11,7 +11,7 @@ struct SpaceAge {
|
|
11
11
|
var onSaturn: Float { return round((seconds / 929_596_608.0) * 100) / 100 }
|
12
12
|
var onUranus: Float { return round((seconds / 2_661_041_808.0) * 100) / 100 }
|
13
13
|
var onNeptune: Float { return round((seconds / 5_200_418_592.0) * 100) / 100 }
|
14
|
-
|
14
|
+
|
15
15
|
init(_ input: Float) {
|
16
16
|
self.seconds = input
|
17
17
|
}
|
@@ -127,6 +127,8 @@
|
|
127
127
|
E90D62081C653ADC00C266D3 /* PalindromeProductsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E90D62071C653ADC00C266D3 /* PalindromeProductsTest.swift */; };
|
128
128
|
E90DE39C1D3E812300F3B881 /* AllYourBaseExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E90DE39B1D3E812300F3B881 /* AllYourBaseExample.swift */; };
|
129
129
|
E90DE39E1D3E818000F3B881 /* AllYourBaseTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E90DE39D1D3E818000F3B881 /* AllYourBaseTest.swift */; };
|
130
|
+
E92EA8F91DFB5CF200C5CFF7 /* IsogramExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E92EA8F81DFB5CF200C5CFF7 /* IsogramExample.swift */; };
|
131
|
+
E92EA8FB1DFB5D0200C5CFF7 /* IsogramTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E92EA8FA1DFB5D0200C5CFF7 /* IsogramTest.swift */; };
|
130
132
|
E9443F251DF5C02700A468B7 /* TransposeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9443F241DF5C02700A468B7 /* TransposeExample.swift */; };
|
131
133
|
E9443F271DF5C04000A468B7 /* TransposeTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9443F261DF5C04000A468B7 /* TransposeTest.swift */; };
|
132
134
|
E94BDECF1C510E68009318BB /* BinarySearchExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = E94BDECD1C510E68009318BB /* BinarySearchExample.swift */; };
|
@@ -287,6 +289,8 @@
|
|
287
289
|
E90D62071C653ADC00C266D3 /* PalindromeProductsTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = PalindromeProductsTest.swift; path = "palindrome-products/PalindromeProductsTest.swift"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
|
288
290
|
E90DE39B1D3E812300F3B881 /* AllYourBaseExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AllYourBaseExample.swift; path = "../all-your-base/AllYourBaseExample.swift"; sourceTree = "<group>"; };
|
289
291
|
E90DE39D1D3E818000F3B881 /* AllYourBaseTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AllYourBaseTest.swift; path = "../all-your-base/AllYourBaseTest.swift"; sourceTree = "<group>"; };
|
292
|
+
E92EA8F81DFB5CF200C5CFF7 /* IsogramExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = IsogramExample.swift; path = isogram/IsogramExample.swift; sourceTree = "<group>"; };
|
293
|
+
E92EA8FA1DFB5D0200C5CFF7 /* IsogramTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = IsogramTest.swift; path = isogram/IsogramTest.swift; sourceTree = "<group>"; };
|
290
294
|
E9443F241DF5C02700A468B7 /* TransposeExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TransposeExample.swift; path = ../transpose/TransposeExample.swift; sourceTree = "<group>"; };
|
291
295
|
E9443F261DF5C04000A468B7 /* TransposeTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TransposeTest.swift; path = ../transpose/TransposeTest.swift; sourceTree = "<group>"; };
|
292
296
|
E94BDECD1C510E68009318BB /* BinarySearchExample.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BinarySearchExample.swift; path = "binary-search/BinarySearchExample.swift"; sourceTree = "<group>"; };
|
@@ -362,6 +366,7 @@
|
|
362
366
|
1E9A63191C506EFC00E28AE1 /* hello-world */,
|
363
367
|
E9AFA14E1C594423006AD72D /* hexadecimal */,
|
364
368
|
E9AFA1751C614D6A006AD72D /* house */,
|
369
|
+
E92EA8F61DFB5CCF00C5CFF7 /* isogram */,
|
365
370
|
1E9A63221C506EFC00E28AE1 /* kindergarten-garden */,
|
366
371
|
E9AFA15D1C5BFB55006AD72D /* largest-series-product */,
|
367
372
|
1E9A63251C506EFC00E28AE1 /* leap */,
|
@@ -988,6 +993,15 @@
|
|
988
993
|
path = acronym;
|
989
994
|
sourceTree = "<group>";
|
990
995
|
};
|
996
|
+
E92EA8F61DFB5CCF00C5CFF7 /* isogram */ = {
|
997
|
+
isa = PBXGroup;
|
998
|
+
children = (
|
999
|
+
E92EA8F81DFB5CF200C5CFF7 /* IsogramExample.swift */,
|
1000
|
+
E92EA8FA1DFB5D0200C5CFF7 /* IsogramTest.swift */,
|
1001
|
+
);
|
1002
|
+
name = isogram;
|
1003
|
+
sourceTree = "<group>";
|
1004
|
+
};
|
991
1005
|
E9443F201DF5BFBF00A468B7 /* transpose */ = {
|
992
1006
|
isa = PBXGroup;
|
993
1007
|
children = (
|
@@ -1222,6 +1236,7 @@
|
|
1222
1236
|
1E9A63BC1C506EFD00E28AE1 /* PerfectNumbersExample.swift in Sources */,
|
1223
1237
|
E99909621D792446002A2B6E /* RunLengthEncodingExample.swift in Sources */,
|
1224
1238
|
1E9A63BB1C506EFD00E28AE1 /* OctalTest.swift in Sources */,
|
1239
|
+
E92EA8FB1DFB5D0200C5CFF7 /* IsogramTest.swift in Sources */,
|
1225
1240
|
1E9A63ED1C506EFD00E28AE1 /* WordCountTest.swift in Sources */,
|
1226
1241
|
1E9A63951C506EFD00E28AE1 /* BobTest.swift in Sources */,
|
1227
1242
|
1E9A63BE1C506EFD00E28AE1 /* PhoneNumberExample.swift in Sources */,
|
@@ -1248,6 +1263,7 @@
|
|
1248
1263
|
1E9A63B81C506EFD00E28AE1 /* NucleotideCountExample.swift in Sources */,
|
1249
1264
|
1E9A63881C506EFC00E28AE1 /* AccumulateExample.swift in Sources */,
|
1250
1265
|
E9AFA1491C593AF5006AD72D /* BinarySearchTreeTest.swift in Sources */,
|
1266
|
+
E92EA8F91DFB5CF200C5CFF7 /* IsogramExample.swift in Sources */,
|
1251
1267
|
E908CD541C6D7AD1005D081E /* PascalsTriangleExample.swift in Sources */,
|
1252
1268
|
1E9A63D61C506EFD00E28AE1 /* SeriesExample.swift in Sources */,
|
1253
1269
|
1E9A638B1C506EFD00E28AE1 /* AcronymTest.swift in Sources */,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trackler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.3.
|
4
|
+
version: 2.0.3.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Katrina Owen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -4788,6 +4788,11 @@ files:
|
|
4788
4788
|
- tracks/ocaml/docs/LEARNING.md
|
4789
4789
|
- tracks/ocaml/docs/RESOURCES.md
|
4790
4790
|
- tracks/ocaml/docs/TESTS.md
|
4791
|
+
- tracks/ocaml/exercises/all-your-base/.merlin
|
4792
|
+
- tracks/ocaml/exercises/all-your-base/Makefile
|
4793
|
+
- tracks/ocaml/exercises/all-your-base/all_your_base.mli
|
4794
|
+
- tracks/ocaml/exercises/all-your-base/example.ml
|
4795
|
+
- tracks/ocaml/exercises/all-your-base/test.ml
|
4791
4796
|
- tracks/ocaml/exercises/anagram/.merlin
|
4792
4797
|
- tracks/ocaml/exercises/anagram/Makefile
|
4793
4798
|
- tracks/ocaml/exercises/anagram/anagram.mli
|
@@ -5195,6 +5200,9 @@ files:
|
|
5195
5200
|
- tracks/perl6/exercises/robot-name/robot.t
|
5196
5201
|
- tracks/perl6/exercises/scrabble-score/Example.pm
|
5197
5202
|
- tracks/perl6/exercises/scrabble-score/scrabble_score.t
|
5203
|
+
- tracks/perl6/exercises/space-age/Example.p6
|
5204
|
+
- tracks/perl6/exercises/space-age/cases.json
|
5205
|
+
- tracks/perl6/exercises/space-age/space-age.t
|
5198
5206
|
- tracks/perl6/exercises/trinary/Example.p6
|
5199
5207
|
- tracks/perl6/exercises/trinary/trinary.t
|
5200
5208
|
- tracks/perl6/exercises/word-count/Example.pm
|
@@ -5427,6 +5435,7 @@ files:
|
|
5427
5435
|
- tracks/purescript/README.md
|
5428
5436
|
- tracks/purescript/SETUP.md
|
5429
5437
|
- tracks/purescript/bin/fetch-configlet
|
5438
|
+
- tracks/purescript/bin/test.sh
|
5430
5439
|
- tracks/purescript/config.json
|
5431
5440
|
- tracks/purescript/docs/ABOUT.md
|
5432
5441
|
- tracks/purescript/docs/INSTALLATION.md
|
@@ -5437,6 +5446,18 @@ files:
|
|
5437
5446
|
- tracks/purescript/exercises/hello-world/examples/src/HelloWorld.purs
|
5438
5447
|
- tracks/purescript/exercises/hello-world/src/HelloWorld.purs
|
5439
5448
|
- tracks/purescript/exercises/hello-world/test/Main.purs
|
5449
|
+
- tracks/purescript/exercises/leap/bower.json
|
5450
|
+
- tracks/purescript/exercises/leap/examples/src/Leap.purs
|
5451
|
+
- tracks/purescript/exercises/leap/src/Leap.purs
|
5452
|
+
- tracks/purescript/exercises/leap/test/Main.purs
|
5453
|
+
- tracks/purescript/exercises/pangram/bower.json
|
5454
|
+
- tracks/purescript/exercises/pangram/examples/src/Pangram.purs
|
5455
|
+
- tracks/purescript/exercises/pangram/src/Pangram.purs
|
5456
|
+
- tracks/purescript/exercises/pangram/test/Main.purs
|
5457
|
+
- tracks/purescript/exercises/raindrops/bower.json
|
5458
|
+
- tracks/purescript/exercises/raindrops/examples/src/Raindrops.purs
|
5459
|
+
- tracks/purescript/exercises/raindrops/src/Raindrops.purs
|
5460
|
+
- tracks/purescript/exercises/raindrops/test/Main.purs
|
5440
5461
|
- tracks/purescript/img/icon.png
|
5441
5462
|
- tracks/python/.git
|
5442
5463
|
- tracks/python/.gitignore
|
@@ -6766,6 +6787,8 @@ files:
|
|
6766
6787
|
- tracks/swift/exercises/hexadecimal/HexadecimalTest.swift
|
6767
6788
|
- tracks/swift/exercises/house/HouseExample.swift
|
6768
6789
|
- tracks/swift/exercises/house/HouseTest.swift
|
6790
|
+
- tracks/swift/exercises/isogram/IsogramExample.swift
|
6791
|
+
- tracks/swift/exercises/isogram/IsogramTest.swift
|
6769
6792
|
- tracks/swift/exercises/kindergarten-garden/KindergartenGardenExample.swift
|
6770
6793
|
- tracks/swift/exercises/kindergarten-garden/KindergartenGardenTest.swift
|
6771
6794
|
- tracks/swift/exercises/largest-series-product/LargestSeriesProductExample.swift
|